From b10f2cea2638f2d4127835c4edf1ce7370e82b47 Mon Sep 17 00:00:00 2001 From: Mitchell Skaggs Date: Mon, 29 Jan 2018 20:15:59 -0600 Subject: [PATCH 01/13] Fixed platform-dependent encoding and decoding of Strings by explicitly using UTF-8 --- .../FieldAnnotationAwareSerializerTest.java | 38 +++++++++++-------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/src/test/java/de/javakaffee/kryoserializers/FieldAnnotationAwareSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/FieldAnnotationAwareSerializerTest.java index f6b889ff..25bf6a9b 100644 --- a/src/test/java/de/javakaffee/kryoserializers/FieldAnnotationAwareSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/FieldAnnotationAwareSerializerTest.java @@ -1,23 +1,25 @@ package de.javakaffee.kryoserializers; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertFalse; -import static org.testng.Assert.assertNull; -import static org.testng.Assert.assertTrue; +import com.esotericsoftware.kryo.Kryo; +import com.esotericsoftware.kryo.factories.SerializerFactory; +import com.esotericsoftware.kryo.io.Input; +import com.esotericsoftware.kryo.io.Output; + +import org.testng.annotations.Test; import java.lang.annotation.Annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import java.nio.ByteBuffer; import java.util.Arrays; -import org.testng.annotations.Test; - -import com.esotericsoftware.kryo.Kryo; -import com.esotericsoftware.kryo.factories.SerializerFactory; -import com.esotericsoftware.kryo.io.Input; -import com.esotericsoftware.kryo.io.Output; +import static java.nio.charset.StandardCharsets.UTF_8; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertNull; +import static org.testng.Assert.assertTrue; /** * A test case for the {@link FieldAnnotationAwareSerializer}. @@ -29,8 +31,8 @@ public class FieldAnnotationAwareSerializerTest { // Use Non-ASCII characters in order to be able to check the byte buffer for // the existence of the string values. - protected static final String FIRST_VALUE = "åæø first value"; - protected static final String SECOND_VALUE = "äöü second value"; + protected static final String FIRST_VALUE = "\u00e5\u00e6\u00f8 first value"; + protected static final String SECOND_VALUE = "\u00e4\u00f6\u00fc second value"; private static final int BUFFER_SIZE = 1024; @@ -63,9 +65,11 @@ public void testExcludeFields() throws Exception { final Input input = new Input(buffer); final CustomBean inputBean = kryo.readObject(input, CustomBean.class); + String decodedBuffer = UTF_8.decode(ByteBuffer.wrap(buffer)).toString(); + assertEquals(inputBean.getSecondValue(), outputBean.getSecondValue()); - assertFalse(new String(buffer).contains(outputBean.getFirstValue())); - assertTrue(new String(buffer).contains(outputBean.getSecondValue())); + assertFalse(decodedBuffer.contains(outputBean.getFirstValue())); + assertTrue(decodedBuffer.contains(outputBean.getSecondValue())); assertNull(inputBean.getFirstValue()); } @@ -87,9 +91,11 @@ public void testIncludeFields() throws Exception { final Input input = new Input(buffer); final CustomBean inputBean = kryo.readObject(input, CustomBean.class); + String decodedBuffer = UTF_8.decode(ByteBuffer.wrap(buffer)).toString(); + assertEquals(inputBean.getFirstValue(), outputBean.getFirstValue()); - assertTrue(new String(buffer).contains(outputBean.getFirstValue())); - assertFalse(new String(buffer).contains(outputBean.getSecondValue())); + assertTrue(decodedBuffer.contains(outputBean.getFirstValue())); + assertFalse(decodedBuffer.contains(outputBean.getSecondValue())); assertNull(inputBean.getSecondValue()); } From 0c2541305d55a8edf6b717019e84df0b22fb143c Mon Sep 17 00:00:00 2001 From: Mitchell Skaggs Date: Mon, 29 Jan 2018 20:23:35 -0600 Subject: [PATCH 02/13] Removed libs folder --- lib/kryo-1.03-sources.jar | Bin 57423 -> 0 bytes lib/kryo-1.03.jar | Bin 96399 -> 0 bytes lib/minlog-1.2.jar | Bin 3085 -> 0 bytes lib/reflectasm-0.9.jar | Bin 7641 -> 0 bytes 4 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 lib/kryo-1.03-sources.jar delete mode 100644 lib/kryo-1.03.jar delete mode 100644 lib/minlog-1.2.jar delete mode 100644 lib/reflectasm-0.9.jar diff --git a/lib/kryo-1.03-sources.jar b/lib/kryo-1.03-sources.jar deleted file mode 100644 index 594023f47ba87cef94252ab5a47ad8a8bd2fef5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57423 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
R8&0_Wjq#wJO530BL*JgTr*)q>Q|`4~?-AKu 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 fo*E`A&AeM^Wi9{~k6|L#lKT@=Y( z3^PTE#wC@zF_T-1akuPD?Z4X2+I`;ho%5de{GR9geZTLV=Y1^A*w{q?+|0Eef!79n z1s(u9z{0>r@01DLPNqt($<*SciA7&=Qoh88as~Q1VBqN0CP| zN@k8gLuVj!=;eT=fCC>JIai?_Z^V2J>tQv*`?0BSzk;24>Vd;5?_UA>tHLV~7vvRy z_6WqGfc32p`QE?ra8`Aj`?_d1t@u3b_)!QwHd>`wGr9% z6DC(I84h_4Hzl8r4Jxs3OayYvjTBf=?pVLMgX-=Q&BO$xB?K7?>k5fYAks%@KpGoy=`1fLi@D+0_2n} z<+-mf=>f1hd!!ek<>5%%6tZt=sxtPEcf+{rB#^0Mzo3x}|Co$4pW<+Qb~HPusCsx> zsYk!HM|LqZQ_rN$Py1;VcEPvUqFBB1Z7$xX4VG4a296;ucTNVugr`>Qb#L7@x{1ij z_kvF0WK2SUJh5hy0Ry6OA zbL0y7J6w-L@UF>1+~Im0E3$ONk&WDAO^xmYh%lmTgBAMXp&tB;K}0aIWUcI;lz-SS zO|Cv-$2lnd3r-doH3sMTAyb7?TF)%VxAx+Iq|238nR5K{yiG$gSbr-Gn%GtO0Jgbl z9}SgmqOf>u{GvRSb93UV?rIke;<5S2 zxTIrC(i6FgI-_dr5g9y9jVn%tx}M(DyL2hpr@`)J#lYJTL|OA6gXVFgdwqhDjQBOm z9-Mqr%I%t%KxrUc-K08AgRA`+q{{Ph8OL>!%Ifz9X2>GXuMj}VN?&kzU=OhY$|y9+JexcRcuA1QbSj{ zz+I=yg%6-aniW1W`nhn}C_}kwYIG5Btx&R1;{uMfEiGNaJ2IlwPSsE`R+%K~Mmt7| zLPS?(K=e`4#Q3TC0(XTS_n3DEg$uiy)4(=I&EDwQsM+MiB2GtomhD~0e2~A?9k2Xf z6_u{m)2SsTigko~x+9tfr9;9cc?ky4)hTR4|5)2`zgM;@<}MOt3ZG?k(4Wb&r5&xmZp^mm`vtmw+wA#~ZQpA2z^I6I?q9+uUH_EypP-kBe}p?}SJ^SnNlzXwjJ$EyC*x(9pkdPq-*8$h%Teb$ zAyeaQ06;3|CnNi3=YagTb9}OlpVRj+j<%wte9F6=5_H2O%Ke|-4C65A72WSNG`2e* zUD8tZ;Jq|7!ETg2Lh5HY*O@q4GLczOFm9>WcKv)*HHQN4?txva$v}9@=-agc&<-_s zJ5M`*rR8OKYT)wFSnD3oxPgdPUy_NA`TGfwj#D4828sV(6 zxjm|}>KZilgM=4PAV<1FeY}>iV{iKtfND!)ljI2_4yVdn5(CYiuZ4`F_usNAupQ>wFKaeJr6zRGCJTF~^uoL(p zs_&d#V)jW`vbXD!=WM4viB@+FoN?vA87EI*naW_f+Y_57swE0r;_hu=o z1~xLv3`geJltaL?Q1hu|_DwaaYN_}3v^DHZ7tI{A{tT;^SGLoDXWO1mmyY`1vMjai z4)ED&SMOTEF{n$)jy%=-^;Bs@V)LtfhF{?nCI}}3MrQT7^wl42P69Wfd#h#C9*Vz6 z%oFN;Oc;gH>jlc!P__pf%xf<9uIxEqLD}dd33deM+f9bqKIUr;rVPm#Ugx*><_93N zVm7}Y^SsNumM{oZ3(Csutyof0Esere|=1nmFwt3~14Mf^$lfVa`2B z_#bif$IRnetKqqjA6hl;jh}w12-;!mLB2gc`O$wx%?OVPuo1XCK5DKlOJJ_bNJ)f{{+o6@(cg~ diff --git a/lib/reflectasm-0.9.jar b/lib/reflectasm-0.9.jar deleted file mode 100644 index 4cfb6242401d4448f7b68327338125f4c33144d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7641 zcma)>1yozxw)e48yg0$3Sb-3vxRs(oiTmGMUIB^`_dsIkwW`Z;G$unsVnF{ zo^D@a8hsH{HvsuT-1ZJWA_HiOd!D|M6e(u$pGgX#rkYW^lAx7Q}y zuI-8Iu`BvNCi0|G@~zVE+uVKbCW7~mN&Wj%VEz8p+}V-$?=vX=E5p*w+1=9B*4)k6 z%H0#ej`{xb+=Yt_wU(i z`LA-Y*}o6;wtQb8JGs8NBru~t1tp}Zb++r`jf1*-UHS|7I!8D#&ApfL!{DV=bMN^2 z@Ob?4Xf6`$S8PXZaF<-iFFgEA0XlXt^U}!a&_yWNsb6M}9-G5d6dInYoBf(l&ytBq zd|xN$!If=Pnwri`U+R=q>k;oqH50*NH+cczMw#_(kPi=oU`xiNfQ?i39z|=s*2Brh z4Q|scqY{k74xrp8_Du8!dUXVOz_eu(l1#X?B<7;Kl|V}UEE-8eX&E1usetE4up8i! z-p#ZL=xJJiLPYIqa@#uQ=+tk>Ee^c3DbU_-Aq9?*fyZu`R9Est=&o&CpaLPAj|3tk zRxxMPlhO*LsN-Slqp^X*6GC0Yl{H3PFGqf1ZC#=tOLTqvbzL?FuN?zC#5xg`4}zRO zB#o~#GJXludv_R*JkX~7?2_Nh7o;W2A5Fp#JJKa_cN!{RO#8vn(a^SjABn#|4gCMX zjw{+)I#~R3+yA-OgD-r%bSFuEW#7z5&9>n7hRRa~W0A~+$gtvtz;judX$U@GKMjw} z98|BZo+WIeWq_9Hj$GH{aZPe*I|5r}AadcX%SI)`lof`@lX_8(73W%I_p;p%*=FPJ z*|quqxJG#|q>DY?8o0F@Y8*aXn!0C3H*R9n(G3Ek*g&^vPsqO(Xc%t>aed*^bGZda zr{bq4Ym~dL;2Cds#hQRo&*@%79n-{w(lPV5Ou=_uTE00gBekNRkbG6oZ8C5#6QhL5 zXX~$Z5E}!*4M-PmCpQR>KbN#K)mQr5oAeJ~dtp>4@t7vDDYx6KHHH`;G5_|_9vCBv zS4`MtVfYvg6-@U4COJ?OZ%&3{p^J5O*qrHzC+?e5Xm~!;qzm}AJktZCRw}xD9c?b5 zM5QExB8thTBZ*1VKNdxi(LHmO>^>GmJ*FFWl|&s&qCl{n$=sV{mr?wVU|w<9D;m4w z1TtQUV?0zD$T-{-fBHucC-A@{hp4I%y#8wRhn~B$D2ydIkJ%<<$DAP8zKrUU>LyC| zr;EAPgbfaLpqEyGSxUl0Z@UYhbo$ea&0#CeK9+Or&Nn+|Gijr9#@6!ISG%(E@w9N! zPTNJ+=NrrcK)no8`fx!i>KgDuI5uVtSk5=%i5*?_TC9*!VIdXr zJt9T#oFjqkof+ z%*D%AHgF6ISNUNgj!gh;5gaDpnGuFMXL!n#r01E(VgfOMTKsJbfCsMv^ zfXywp9a)VaW)z72$?$aQh~#HJgjd>Qb(rR7P+VBsDw+6Y`@7L25#Q34!%NLh>r460 zEu7K#8|UIVQ|q`C-lGDtUn55pKexN4p|^^iZPm{@{e8>$`3m`Q9|%~S8*)X-%Z5D} z_%LaJnEk0)23hrEkW)-pt`&_R-?8~d!D$XiTkm5Jm|$dLj5B_-+2Xp9^jJCGE>a$M zy)q5p6KZ$uP|igsLKDixK)`|f{CrfGI`T5K5S#x3@A<{7_bb)~ums-d2)95*Y#aB( z3M-nX-9hCl{m>o@SwbE8qE(%+wS;;A9yR>uNRo}YJ%S|W`%scGm#%c5VvnYlj)4Oit7E0X{j)x$G1*%63i){}OPa z;qiy@eE!s)1+{T~@%|Cwt{~}fRoAQKmpft=D_+&JU}#JR4O}tTI}j{N8C#FNx?U=Y z__=j8m^FYOo>ceKdQy z{>Vu`o&EV}C2XW3fwzkUo0YzO_44PqInJvT1=V<=_Xnmbu+2^1(qg^ffs!liQUlWH z`x(G(Qj#n=W1aOJIatVO9#Nn+em)}QBOo^M+7IAA&bFdZ1QHY0r^Nxx^oY2~ zAOT-gmI&fEU6NTB*lHzK6iLguK6D&{2G#1Z%c149!Jt}$s zpo>_1rbdYSYx(|s%SGz&zH%adQ_}0$`L&(TniMBkaLPh!``PW?+40a>!y4Ys#CVxS zJ%Urhqx^WT3M3{f0xo9py4>9i*(n)5<`zfKV0}L(RlT$`mk4aug&qDT%Tn>4i&iGM zB6-fiuB=2#W&gR|`vjcsFbb_qsNICp91S9FL}@3_y=uEqcn>jirM&0cBE#s2_^!X# z!RnDCt;lGPXyWnEB5eXcdCF*wm^Rp3W%a1>&-G6jdYM8%Y8W-SdsuAah0_xfRA9tAue84zOQ^g8f%XL7|exidzz%zMk$SHcNkpchLlh@9XXEO9&eLdnu9zpO^SG%Wn zshUlJbFb};LKZ82|5075N!*qJwWZ^SYL&I3biw%u$1&e1UHN=B2knmvTqL_`2O+bjmTUU=_2NZ$qbz#qK`FxC7@U3_^k4 zzsn(t1uf*gEgw2szZeZ;(do+TYv0n#+>xl-Ls;EfuG1$QMJTYRy~4lzKLK+U4@5d;Mx<(B8tI>ZK#C9^P&vjFy_A(@DV?!TQ z)x~xqgw%Z*)xZ8qpV|5I#tD0QQd5n}qQV+CQr4gBMV}8W`Ie$G<@=gpcj#^sopIIr z3U&dp2$v2lQGiT@o4ZEQ0B)3I1j`%?``CxQQ0dS~-{-MV()^|=DHYam0-EAxTxQsK zyin#FAv_s)Ga=}pDdh#Gk13n*b~ID5++4E4KhS!@`3T6oC3gR)xua`|U54d{ zOU8Mi|I_^~)$o!0F@5Iu+SSxsp6WyNwG49If(u`tNd;s%&#roDN3_&#j$ zdty{Anis9pUf|4kQlCi|L%G1P`IpHuYdygXCWl&WNs74rt(bQ;`l#F_j{-g#nkv=* zR-+622Q|97rMr#uUyAgK7x-S}lN3J>hxQIE9($|nn=uD&w0O&~Lf^of6NqWSGB`oZ zk!r$;7BB>vrwF?5bMkWMG75?vGRCJ0_qx@g!s~KZVjm= z5E^t{?D{YL?%CXivfK{5zc%suU7bmzji(QX9wWO#RgWF1K%MN;CI?*CVQE>>0RT2bg2$3Rv7k88&(n9(!fjD)9EyqYUHl&E{OvOvF13`KLgWO!5 z(Y-jwB>E92m#XUZvLlwYnQ7%s2o>9{e#bM`X4aJ=Qh)XpJX~J4%$M;lnjOrzRVt#u z6&%m53g2t7?{iuQ6Vq8p>3jA^pUB!=Rta&PKYdtD1%C4 zAIF4vUR_IITbEJVkJ9E5S+Q2s7txR>kH188SkU#5PzSV|Qa7V!Yvf~}@9eMigwkRd z8Uc&nW?yDTKREIXGnN`N&ZoU^S|vn&j7I&wJQB;?I6me9HQukxw7$#xKRMS}eD}II z1f&%*qlb?gqXSm(sekpn6=+?buL}SC89?t=OgL#5Oqq}l#}yz;&t^WoCKdyNHDEo&1CdV$%NUw~xqB@9vq$WwR_5ULh*(4kS_mUW|T1czh3sVVS#VOc@6f#gLN=Q@9fUtSj-Qy3|F@ zels`UOf;~>E-t?>uF_Rm-Iw01l+MEYBZCurlSaj*5W48~a(>4-T?=78QvDdt03=j0Ps^0g~J zaFIARb}v_{u>vaj&Oj>ir=6)MI~Cxrj4ig?ORV0UxT*3mO8Ja=qmM4-ZSnx}$7L-L zsZGb#jkWK64&=0cL4`8=V>$I7ZC4b-vf8H}aJ^hKg?@@yMN#+Zb0O$bxDosg+dm+V z1%%D=qCMQdIACOc;oB_dbN;@VcHoE?M%&`J-fH$a!OS-#SVK6%?OCBVdly7F6ms1= z7drbWT3V-~3@-Uq2cAL;FIhn=Shj6VTw;+6Ng^sG36>F(b+x}fXf-xnoL=4`B2ha`on_Z5!ab!;RF+)~0ODbE9B&(Gulvo|&C~MKNt&MJlH=ie3xuoF!V$8f)%)K+bMl&@{smOMMySX zZq|vz^oYfRm99Pi^4GMv3#?F4Ck}VInD)_70y^*d`8%sO+`{#??DIz!*T`}RJ4;pR z+vk7dWw*PkYx^>()qPeLaRkz!LF zldQdiflz>VE@@t74A-7oGOf(3!57cTH-u9Ucqtb=o|)2+$`?{~F{5oQCelSC??krGSvF(7Gv^NC#Op$55JIw$M z0+ykVU#p*Qp_nH|SV7yNEtU8&B`{Hnh(b~A+lQy~_>xdMP+JR`M_Z?PfY$8tG2#2}Rgxw>5vO#*wJ~ zy{TYaBKL=#iL1nEA2$k(6bo@-YG?VD*Q;rDrEyqSkEPOKY8Tdxmd~bIozytvLrJ?U zMy&2Pr3Y+(lXzK}X}tCLGj!a|z^MR9>;2Q=nFrm~gWz8?0xaBURB!`9ahvkon&h6B zG)gwUV4#7ZMvj)%r4DEHZF(qD`vWJq!RA%=H`c77H#eo44@ob1bZGIT>X zs(FcZ7|b-RsiC6+JdtAew!-i(6i`ifj2B6_2*8-FO5!RqTE|Y5C5a&F9XbCKHn+}Y83FNDzXqVRGkY}=D;}MUj^S4l?%u&M9eo{I^p#; zByshh@UYv_+6n9hZNRkN!Yfe&@&dCq5>cT@a9CL3&452yfnZ;ruhITo% z>Jz@Q*|VmtO@#O&MTjBZ#k^XukR8-z(K_da!PJZ5S9*nCgRDvl5IX3B+YvgW!B zQr@+e3S%OT4NA&)8r~cZ>+M{BH|eVl;YCz0k%Ag67qN@L!8dAjWmmd~o?54;$W>94 z^Y@uG(eGmAISk((`9@}ao7wj~ldV8p7mmp=Z&f6SXvF5>2mY8S&V-kVX}d_XEQbB9t}vYtr@=g?1GPeb7~Bn1Png z%W4;(l-cIuj}+QT8YqK$Z+%OnXoTZ=F{0vWizEF|jY+thW9qWx{G`79Joco=eT@2S zo4QwWi1Xapi-(2|RV+3>WLxtw%oaC*iu&OX_#Sn*PR2~p^15k3X>qYc5Mg0FiegI2 z6(~duL^8Fior9T*>jP^%BB&(3FpqK}eu4KEmV881Nx9hhu|o-|aY-%`PU=MdyUh@# z5s5N)i4r9=>fT1G8^4+F#&e*0u?&I{Zbrh9FC4mwU@Qk@4a@$=*pf_6sNhw(g(|sVp(5%tl-n$#6r z7}+mtmC>!;*Sjb0!0Ak5Tw7G@R6V0$&+7Ucq{J=S;2CP_`l0-7J}E^<)@_TZ^U^}r z0zII=Jqz0QW&9{QNHn9q{T;#{0eAZ7`DOS=$(*c#p_!E(RnX0i5TS@gYqVgq?5tN@ z?Y?DS`HS8uLgdJpFPp8$$S1`#dm9jm+t*bh@*{Pp8Uv1$gL2u{^ac1U3#Eg~L5x|L zU^;!@l^}%&i@R)Q%oy#aP-)CGCn6TgzR0wr5Yn)+`s*KHN+ Date: Mon, 29 Jan 2018 21:16:48 -0600 Subject: [PATCH 03/13] Added .gitignore --- .gitignore | 180 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 180 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..e8892c08 --- /dev/null +++ b/.gitignore @@ -0,0 +1,180 @@ +# Created by .ignore support plugin (hsz.mobi) +### Windows template +# Windows thumbnail cache files +Thumbs.db +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msm +*.msp + +# Windows shortcuts +*.lnk +### Kotlin template +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* +### Linux template +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* +### JetBrains template +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff: +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/dictionaries + +# Sensitive or high-churn files: +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.xml +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml + +# Gradle: +.idea/**/gradle.xml +.idea/**/libraries + +# CMake +cmake-build-debug/ +cmake-build-release/ + +# Mongo Explorer plugin: +.idea/**/mongoSettings.xml + +## File-based project format: +*.iws + +## Plugin-specific files: + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties +### Java template +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* +### Gradle template +.gradle +/build/ + +# Ignore Gradle GUI config +gradle-app.setting + +# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) +!gradle-wrapper.jar + +# Cache of project +.gradletasknamecache + +# # Work around https://youtrack.jetbrains.com/issue/IDEA-116898 +# gradle/wrapper/gradle-wrapper.properties +### macOS template +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +.idea/ +target/ \ No newline at end of file From 20f82b8fdea10e3040f0b4b2086fa4c56b97b051 Mon Sep 17 00:00:00 2001 From: Mitchell Skaggs Date: Mon, 29 Jan 2018 21:17:55 -0600 Subject: [PATCH 04/13] Added initial Gradle build, updated dependencies, fixed errors with new dependency versions --- build.gradle | 45 +++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54329 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 172 +++++++++++ gradlew.bat | 84 ++++++ pom.xml | 277 ------------------ settings.gradle | 1 + .../javakaffee/kryoserializers/KryoTest.java | 30 +- .../kryoserializers/TestClasses.java | 4 +- .../ImmutableSortedMapSerializerTest.java | 7 +- .../kryoserializers/wicket/WicketTest.java | 16 +- 11 files changed, 336 insertions(+), 305 deletions(-) create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat delete mode 100644 pom.xml create mode 100644 settings.gradle diff --git a/build.gradle b/build.gradle new file mode 100644 index 00000000..9d0b3ade --- /dev/null +++ b/build.gradle @@ -0,0 +1,45 @@ +plugins { + id 'java-library' + id 'maven-publish' + id 'com.diffplug.gradle.spotless' version '3.8.0' + id 'com.github.ben-manes.versions' version '0.17.0' +} + +group = 'de.javakaffee' +version = '0.43-SNAPSHOT' + +description = 'Extra Kryo Serializers' + +sourceCompatibility = JavaVersion.VERSION_1_7 +targetCompatibility = JavaVersion.VERSION_1_7 + +test { + useTestNG() +} + + +repositories { + jcenter() +} + +ext.optionalDependencies = [ + 'com.google.protobuf:protobuf-java:3.5.1', + 'joda-time:joda-time:2.9.9', + 'cglib:cglib:3.2.6', + //'org.apache.wicket:wicket:1.4.17', + 'org.apache.wicket:wicket-core:8.0.0-M8', + 'com.google.guava:guava:21.0', + 'com.github.andrewoma.dexx:collection:0.7' +] + +dependencies { + api 'com.esotericsoftware:kryo:4.0.1' + compileOnly optionalDependencies + + testImplementation 'org.testng:testng:6.13.1' + testImplementation 'junit:junit:4.12' + testImplementation optionalDependencies + testImplementation 'javax.servlet:javax.servlet-api:4.0.0' + testImplementation 'org.slf4j:slf4j-simple:1.8.0-beta0' + testImplementation 'org.apache.commons:commons-lang3:3.7' +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..a5fe1cb94b9ee5ce57e6113458225bcba12d83e3 GIT binary patch literal 54329 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

<5G2M1WZP5 zzqSuO91lJod(SBDDw<*sX(+F6Uq~YAeYV#2A;XQu_p=N5X+#cmu19Qk>QAnV=k!?wbk5I;tDWgFc}0NkvC*G=V+Yh1cyeJVq~9czZiDXe+S=VfL2g`LWo8om z$Y~FQc6MFjV-t1Y`^D9XMwY*U_re2R?&(O~68T&D4S{X`6JYU-pz=}ew-)V0AOUT1 zVOkHAB-8uBcRjLvz<9HS#a@X*Kc@|W)nyiSgi|u5$Md|P()%2(?olGg@ypoJwp6>m z*dnfjjWC>?_1p;%1brqZyDRR;8EntVA92EJ3ByOxj6a+bhPl z;a?m4rQAV1@QU^#M1HX)0+}A<7TCO`ZR_RzF}X9-M>cRLyN4C+lCk2)kT^3gN^`IT zNP~fAm(wyIoR+l^lQDA(e1Yv}&$I!n?&*p6?lZcQ+vGLLd~fM)qt}wsbf3r=tmVYe zl)ntf#E!P7wlakP9MXS7m0nsAmqxZ*)#j;M&0De`oNmFgi$ov#!`6^4)iQyxg5Iuj zjLAhzQ)r`^hf7`*1`Rh`X;LVBtDSz@0T?kkT1o!ijeyTGt5vc^Cd*tmNgiNo^EaWvaC8$e+nb_{W01j3%=1Y&92YacjCi>eNbwk%-gPQ@H-+4xskQ}f_c=jg^S-# zYFBDf)2?@5cy@^@FHK5$YdAK9cI;!?Jgd}25lOW%xbCJ>By3=HiK@1EM+I46A)Lsd zeT|ZH;KlCml=@;5+hfYf>QNOr^XNH%J-lvev)$Omy8MZ`!{`j>(J5cG&ZXXgv)TaF zg;cz99i$4CX_@3MIb?GL0s*8J=3`#P(jXF(_(6DXZjc@(@h&=M&JG)9&Te1?(^XMW zjjC_70|b=9hB6pKQi`S^Ls7JyJw^@P>Ko^&q8F&?>6i;#CbxUiLz1ZH4lNyd@QACd zu>{!sqjB!2Dg}pbAXD>d!3jW}=5aN0b;rw*W>*PAxm7D)aw(c*RX2@bTGEI|RRp}vw7;NR2wa;rXN{L{Q#=Fa z$x@ms6pqb>!8AuV(prv>|aU8oWV={C&$c zMa=p=CDNOC2tISZcd8~18GN5oTbKY+Vrq;3_obJlfSKRMk;Hdp1`y`&LNSOqeauR_ z^j*Ojl3Ohzb5-a49A8s|UnM*NM8tg}BJXdci5%h&;$afbmRpN0&~9rCnBA`#lG!p zc{(9Y?A0Y9yo?wSYn>iigf~KP$0*@bGZ>*YM4&D;@{<%Gg5^uUJGRrV4 z(aZOGB&{_0f*O=Oi0k{@8vN^BU>s3jJRS&CJOl3o|BE{FAA&a#2YYiX3pZz@|Go-F z|Fly;7eX2OTs>R}<`4RwpHFs9nwh)B28*o5qK1Ge=_^w0m`uJOv!=&!tzt#Save(C zgKU=Bsgql|`ui(e1KVxR`?>Dx>(rD1$iWp&m`v)3A!j5(6vBm*z|aKm*T*)mo(W;R zNGo2`KM!^SS7+*9YxTm6YMm_oSrLceqN*nDOAtagULuZl5Q<7mOnB@Hq&P|#9y{5B z!2x+2s<%Cv2Aa0+u{bjZXS);#IFPk(Ph-K7K?3i|4ro> zRbqJoiOEYo(Im^((r}U4b8nvo_>4<`)ut`24?ILnglT;Pd&U}$lV3U$F9#PD(O=yV zgNNA=GW|(E=&m_1;uaNmipQe?pon4{T=zK!N!2_CJL0E*R^XXIKf*wi!>@l}3_P9Z zF~JyMbW!+n-+>!u=A1ESxzkJy$DRuG+$oioG7(@Et|xVbJ#BCt;J43Nvj@MKvTxzy zMmjNuc#LXBxFAwIGZJk~^!q$*`FME}yKE8d1f5Mp}KHNq(@=Z8YxV}0@;YS~|SpGg$_jG7>_8WWYcVx#4SxpzlV9N4aO>K{c z$P?a_fyDzGX$Of3@ykvedGd<@-R;M^Shlj*SswJLD+j@hi_&_>6WZ}#AYLR0iWMK|A zH_NBeu(tMyG=6VO-=Pb>-Q#$F*or}KmEGg*-n?vWQREURdB#+6AvOj*I%!R-4E_2$ zU5n9m>RWs|Wr;h2DaO&mFBdDb-Z{APGQx$(L`if?C|njd*fC=rTS%{o69U|meRvu?N;Z|Y zbT|ojL>j;q*?xXmnHH#3R4O-59NV1j=uapkK7}6@Wo*^Nd#(;$iuGsb;H315xh3pl zHaJ>h-_$hdNl{+|Zb%DZH%ES;*P*v0#}g|vrKm9;j-9e1M4qX@zkl&5OiwnCz=tb6 zz<6HXD+rGIVpGtkb{Q^LIgExOm zz?I|oO9)!BOLW#krLmWvX5(k!h{i>ots*EhpvAE;06K|u_c~y{#b|UxQ*O@Ks=bca z^_F0a@61j3I(Ziv{xLb8AXQj3;R{f_l6a#H5ukg5rxwF9A$?Qp-Mo54`N-SKc}fWp z0T)-L@V$$&my;l#Ha{O@!fK4-FSA)L&3<${Hcwa7ue`=f&YsXY(NgeDU#sRlT3+9J z6;(^(sjSK@3?oMo$%L-nqy*E;3pb0nZLx6 z;h5)T$y8GXK1DS-F@bGun8|J(v-9o=42&nLJy#}M5D0T^5VWBNn$RpC zZzG6Bt66VY4_?W=PX$DMpKAI!d`INr) zkMB{XPQ<52rvWVQqgI0OL_NWxoe`xxw&X8yVftdODPj5|t}S6*VMqN$-h9)1MBe0N zYq?g0+e8fJCoAksr0af1)FYtz?Me!Cxn`gUx&|T;)695GG6HF7!Kg1zzRf_{VWv^bo81v4$?F6u2g|wxHc6eJQAg&V z#%0DnWm2Rmu71rPJ8#xFUNFC*V{+N_qqFH@gYRLZ6C?GAcVRi>^n3zQxORPG)$-B~ z%_oB?-%Zf7d*Fe;cf%tQwcGv2S?rD$Z&>QC2X^vwYjnr5pa5u#38cHCt4G3|efuci z@3z=#A13`+ztmp;%zjXwPY_aq-;isu*hecWWX_=Z8paSqq7;XYnUjK*T>c4~PR4W7 z#C*%_H&tfGx`Y$w7`dXvVhmovDnT>btmy~SLf>>~84jkoQ%cv=MMb+a{JV&t0+1`I z32g_Y@yDhKe|K^PevP~MiiVl{Ou7^Mt9{lOnXEQ`xY^6L8D$705GON{!1?1&YJEl#fTf5Z)da=yiEQ zGgtC-soFGOEBEB~ZF_{7b(76En>d}mI~XIwNw{e>=Fv)sgcw@qOsykWr?+qAOZSVrQfg}TNI ztKNG)1SRrAt6#Q?(me%)>&A_^DM`pL>J{2xu>xa$3d@90xR61TQDl@fu%_85DuUUA za9tn64?At;{`BAW6oykwntxHeDpXsV#{tmt5RqdN7LtcF4vR~_kZNT|wqyR#z^Xcd zFdymVRZvyLfTpBT>w9<)Ozv@;Yk@dOSVWbbtm^y@@C>?flP^EgQPAwsy75bveo=}T zFxl(f)s)j(0#N_>Or(xEuV(n$M+`#;Pc$1@OjXEJZumkaekVqgP_i}p`oTx;terTx zZpT+0dpUya2hqlf`SpXN{}>PfhajNk_J0`H|2<5E;U5Vh4F8er z;RxLSFgpGhkU>W?IwdW~NZTyOBrQ84H7_?gviIf71l`EETodG9a1!8e{jW?DpwjL? zGEM&eCzwoZt^P*8KHZ$B<%{I}>46IT%jJ3AnnB5P%D2E2Z_ z1M!vr#8r}1|KTqWA4%67ZdbMW2YJ81b(KF&SQ2L1Qn(y-=J${p?xLMx3W7*MK;LFQ z6Z`aU;;mTL4XrrE;HY*Rkh6N%?qviUGNAKiCB~!P}Z->IpO6E(gGd7I#eDuT7j|?nZ zK}I(EJ>$Kb&@338M~O+em9(L!+=0zBR;JAQesx|3?Ok90)D1aS9P?yTh6Poh8Cr4X zk3zc=f2rE7jj+aP7nUsr@~?^EGP>Q>h#NHS?F{Cn`g-gD<8F&dqOh-0sa%pfL`b+1 zUsF*4a~)KGb4te&K0}bE>z3yb8% zibb5Q%Sfiv7feb1r0tfmiMv z@^4XYwg@KZI=;`wC)`1jUA9Kv{HKe2t$WmRcR4y8)VAFjRi zaz&O7Y2tDmc5+SX(bj6yGHYk$dBkWc96u3u&F)2yEE~*i0F%t9Kg^L6MJSb&?wrXi zGSc;_rln$!^ybwYBeacEFRsVGq-&4uC{F)*Y;<0y7~USXswMo>j4?~5%Zm!m@i@-> zXzi82sa-vpU{6MFRktJy+E0j#w`f`>Lbog{zP|9~hg(r{RCa!uGe>Yl536cn$;ouH za#@8XMvS-kddc1`!1LVq;h57~zV`7IYR}pp3u!JtE6Q67 zq3H9ZUcWPm2V4IukS}MCHSdF0qg2@~ufNx9+VMjQP&exiG_u9TZAeAEj*jw($G)zL zq9%#v{wVyOAC4A~AF=dPX|M}MZV)s(qI9@aIK?Pe+~ch|>QYb+78lDF*Nxz2-vpRbtQ*F4$0fDbvNM#CCatgQ@z1+EZWrt z2dZfywXkiW=no5jus-92>gXn5rFQ-COvKyegmL=4+NPzw6o@a?wGE-1Bt;pCHe;34K%Z z-FnOb%!nH;)gX+!a3nCk?5(f1HaWZBMmmC@lc({dUah+E;NOros{?ui1zPC-Q0);w zEbJmdE$oU$AVGQPdm{?xxI_0CKNG$LbY*i?YRQ$(&;NiA#h@DCxC(U@AJ$Yt}}^xt-EC_ z4!;QlLkjvSOhdx!bR~W|Ezmuf6A#@T`2tsjkr>TvW*lFCMY>Na_v8+{Y|=MCu1P8y z89vPiH5+CKcG-5lzk0oY>~aJC_0+4rS@c@ZVKLAp`G-sJB$$)^4*A!B zmcf}lIw|VxV9NSoJ8Ag3CwN&d7`|@>&B|l9G8tXT^BDHOUPrtC70NgwN4${$k~d_4 zJ@eo6%YQnOgq$th?0{h`KnqYa$Nz@vlHw<%!C5du6<*j1nwquk=uY}B8r7f|lY+v7 zm|JU$US08ugor8E$h3wH$c&i~;guC|3-tqJy#T;v(g( zBZtPMSyv%jzf->435yM(-UfyHq_D=6;ouL4!ZoD+xI5uCM5ay2m)RPmm$I}h>()hS zO!0gzMxc`BPkUZ)WXaXam%1;)gedA7SM8~8yIy@6TPg!hR0=T>4$Zxd)j&P-pXeSF z9W`lg6@~YDhd19B9ETv(%er^Xp8Yj@AuFVR_8t*KS;6VHkEDKI#!@l!l3v6`W1`1~ zP{C@keuV4Q`Rjc08lx?zmT$e$!3esc9&$XZf4nRL(Z*@keUbk!GZi(2Bmyq*saOD? z3Q$V<*P-X1p2}aQmuMw9nSMbOzuASsxten7DKd6A@ftZ=NhJ(0IM|Jr<91uAul4JR zADqY^AOVT3a(NIxg|U;fyc#ZnSzw2cr}#a5lZ38>nP{05D)7~ad7JPhw!LqOwATXtRhK!w0X4HgS1i<%AxbFmGJx9?sEURV+S{k~g zGYF$IWSlQonq6}e;B(X(sIH|;52+(LYW}v_gBcp|x%rEAVB`5LXg_d5{Q5tMDu0_2 z|LOm$@K2?lrLNF=mr%YP|U-t)~9bqd+wHb4KuPmNK<}PK6e@aosGZK57=Zt+kcszVOSbe;`E^dN! ze7`ha3WUUU7(nS0{?@!}{0+-VO4A{7+nL~UOPW9_P(6^GL0h${SLtqG!} zKl~Ng5#@Sy?65wk9z*3SA`Dpd4b4T^@C8Fhd8O)k_4%0RZL5?#b~jmgU+0|DB%0Z) zql-cPC>A9HPjdOTpPC` zQwvF}uB5kG$Xr4XnaH#ruSjM*xG?_hT7y3G+8Ox`flzU^QIgb_>2&-f+XB6MDr-na zSi#S+c!ToK84<&m6sCiGTd^8pNdXo+$3^l3FL_E`0 z>8it5YIDxtTp2Tm(?}FX^w{fbfgh7>^8mtvN>9fWgFN_*a1P`Gz*dyOZF{OV7BC#j zQV=FQM5m>47xXgapI$WbPM5V`V<7J9tD)oz@d~MDoM`R^Y6-Na(lO~uvZlpu?;zw6 zVO1faor3dg#JEb5Q*gz4<W8tgC3nE2BG2jeIQs1)<{In&7hJ39x=;ih;CJDy)>0S1at*7n?Wr0ahYCpFjZ|@u91Zl7( zv;CSBRC65-6f+*JPf4p1UZ)k=XivKTX6_bWT~7V#rq0Xjas6hMO!HJN8GdpBKg_$B zwDHJF6;z?h<;GXFZan8W{XFNPpOj!(&I1`&kWO86p?Xz`a$`7qV7Xqev|7nn_lQuX ziGpU1MMYt&5dE2A62iX3;*0WzNB9*nSTzI%62A+N?f?;S>N@8M=|ef3gtQTIA*=yq zQAAjOqa!CkHOQo4?TsqrrsJLclXcP?dlAVv?v`}YUjo1Htt;6djP@NPFH+&p1I+f_ z)Y279{7OWomY8baT(4TAOlz1OyD{4P?(DGv3XyJTA2IXe=kqD)^h(@*E3{I~w;ws8 z)ZWv7E)pbEM zd3MOXRH3mQhks9 zv6{s;k0y5vrcjXaVfw8^>YyPo=oIqd5IGI{)+TZq5Z5O&hXAw%ZlL}^6FugH;-%vP zAaKFtt3i^ag226=f0YjzdPn6|4(C2sC5wHFX{7QF!tG1E-JFA`>eZ`}$ymcRJK?0c zN363o{&ir)QySOFY0vcu6)kX#;l??|7o{HBDVJN+17rt|w3;(C_1b>d;g9Gp=8YVl zYTtA52@!7AUEkTm@P&h#eg+F*lR zQ7iotZTcMR1frJ0*V@Hw__~CL>_~2H2cCtuzYIUD24=Cv!1j6s{QS!v=PzwQ(a0HS zBKx04KA}-Ue+%9d`?PG*hIij@54RDSQpA7|>qYVIrK_G6%6;#ZkR}NjUgmGju)2F`>|WJoljo)DJgZr4eo1k1i1+o z1D{>^RlpIY8OUaOEf5EBu%a&~c5aWnqM zxBpJq98f=%M^{4mm~5`CWl%)nFR64U{(chmST&2jp+-r z3675V<;Qi-kJud%oWnCLdaU-)xTnMM%rx%Jw6v@=J|Ir=4n-1Z23r-EVf91CGMGNz zb~wyv4V{H-hkr3j3WbGnComiqmS0vn?n?5v2`Vi>{Ip3OZUEPN7N8XeUtF)Ry6>y> zvn0BTLCiqGroFu|m2zG-;Xb6;W`UyLw)@v}H&(M}XCEVXZQoWF=Ykr5lX3XWwyNyF z#jHv)A*L~2BZ4lX?AlN3X#axMwOC)PoVy^6lCGse9bkGjb=qz%kDa6}MOmSwK`cVO zt(e*MW-x}XtU?GY5}9{MKhRhYOlLhJE5=ca+-RmO04^ z66z{40J=s=ey9OCdc(RCzy zd7Zr1%!y3}MG(D=wM_ebhXnJ@MLi7cImDkhm0y{d-Vm81j`0mbi4lF=eirlr)oW~a zCd?26&j^m4AeXEsIUXiTal)+SPM4)HX%%YWF1?(FV47BaA`h9m67S9x>hWMVHx~Hg z1meUYoLL(p@b3?x|9DgWeI|AJ`Ia84*P{Mb%H$ZRROouR4wZhOPX15=KiBMHl!^JnCt$Az`KiH^_d>cev&f zaG2>cWf$=A@&GP~DubsgYb|L~o)cn5h%2`i^!2)bzOTw2UR!>q5^r&2Vy}JaWFUQE04v>2;Z@ZPwXr?y&G(B^@&y zsd6kC=hHdKV>!NDLIj+3rgZJ|dF`%N$DNd;B)9BbiT9Ju^Wt%%u}SvfM^=|q-nxDG zuWCQG9e#~Q5cyf8@y76#kkR^}{c<_KnZ0QsZcAT|YLRo~&tU|N@BjxOuy`#>`X~Q< z?R?-Gsk$$!oo(BveQLlUrcL#eirhgBLh`qHEMg`+sR1`A=1QX7)ZLMRT+GBy?&mM8 zQG^z-!Oa&J-k7I(3_2#Q6Bg=NX<|@X&+YMIOzfEO2$6Mnh}YV!m!e^__{W@-CTprr zbdh3f=BeCD$gHwCrmwgM3LAv3!Mh$wM)~KWzp^w)Cu6roO7uUG5z*}i0_0j47}pK; ztN530`ScGatLOL06~zO)Qmuv`h!gq5l#wx(EliKe&rz-5qH(hb1*fB#B+q`9=jLp@ zOa2)>JTl7ovxMbrif`Xe9;+fqB1K#l=Dv!iT;xF zdkCvS>C5q|O;}ns3AgoE({Ua-zNT-9_5|P0iANmC6O76Sq_(AN?UeEQJ>#b54fi3k zFmh+P%b1x3^)0M;QxXLP!BZ^h|AhOde*{9A=f3|Xq*JAs^Y{eViF|=EBfS6L%k4ip zk+7M$gEKI3?bQg?H3zaE@;cyv9kv;cqK$VxQbFEsy^iM{XXW0@2|DOu$!-k zSFl}Y=jt-VaT>Cx*KQnHTyXt}f9XswFB9ibYh+k2J!ofO+nD?1iw@mwtrqI4_i?nE zhLkPp41ED62me}J<`3RN80#vjW;wt`pP?%oQ!oqy7`miL>d-35a=qotK$p{IzeSk# ze_$CFYp_zIkrPFVaW^s#U4xT1lI^A0IBe~Y<4uS%zSV=wcuLr%gQT=&5$&K*bwqx| zWzCMiz>7t^Et@9CRUm9E+@hy~sBpm9fri$sE1zgLU((1?Yg{N1Sars=DiW&~Zw=3I zi7y)&oTC?UWD2w97xQ&5vx zRXEBGeJ(I?Y}eR0_O{$~)bMJRTsNUPIfR!xU9PE7A>AMNr_wbrFK>&vVw=Y;RH zO$mlpmMsQ}-FQ2cSj7s7GpC+~^Q~dC?y>M}%!-3kq(F3hGWo9B-Gn02AwUgJ>Z-pKOaj zysJBQx{1>Va=*e@sLb2z&RmQ7ira;aBijM-xQ&cpR>X3wP^foXM~u1>sv9xOjzZpX z0K;EGouSYD~oQ&lAafj3~EaXfFShC+>VsRlEMa9cg9i zFxhCKO}K0ax6g4@DEA?dg{mo>s+~RPI^ybb^u--^nTF>**0l5R9pocwB?_K)BG_)S zyLb&k%XZhBVr7U$wlhMqwL)_r&&n%*N$}~qijbkfM|dIWP{MyLx}X&}ES?}7i;9bW zmTVK@zR)7kE2+L42Q`n4m0VVg5l5(W`SC9HsfrLZ=v%lpef=Gj)W59VTLe+Z$8T8i z4V%5+T0t8LnM&H>Rsm5C%qpWBFqgTwL{=_4mE{S3EnBXknM&u8n}A^IIM4$s3m(Rd z>zq=CP-!9p9es2C*)_hoL@tDYABn+o#*l;6@7;knWIyDrt5EuakO99S$}n((Fj4y} zD!VvuRzghcE{!s;jC*<_H$y6!6QpePo2A3ZbX*ZzRnQq*b%KK^NF^z96CHaWmzU@f z#j;y?X=UP&+YS3kZx7;{ zDA{9(wfz7GF`1A6iB6fnXu0?&d|^p|6)%3$aG0Uor~8o? z*e}u#qz7Ri?8Uxp4m_u{a@%bztvz-BzewR6bh*1Xp+G=tQGpcy|4V_&*aOqu|32CM zz3r*E8o8SNea2hYJpLQ-_}R&M9^%@AMx&`1H8aDx4j%-gE+baf2+9zI*+Pmt+v{39 zDZ3Ix_vPYSc;Y;yn68kW4CG>PE5RoaV0n@#eVmk?p$u&Fy&KDTy!f^Hy6&^-H*)#u zdrSCTJPJw?(hLf56%2;_3n|ujUSJOU8VPOTlDULwt0jS@j^t1WS z!n7dZIoT+|O9hFUUMbID4Ec$!cc($DuQWkocVRcYSikFeM&RZ=?BW)mG4?fh#)KVG zcJ!<=-8{&MdE)+}?C8s{k@l49I|Zwswy^ZN3;E!FKyglY~Aq?4m74P-0)sMTGXqd5(S<-(DjjM z&7dL-Mr8jhUCAG$5^mI<|%`;JI5FVUnNj!VO2?Jiqa|c2;4^n!R z`5KK0hyB*F4w%cJ@Un6GC{mY&r%g`OX|1w2$B7wxu97%<@~9>NlXYd9RMF2UM>(z0 zouu4*+u+1*k;+nFPk%ly!nuMBgH4sL5Z`@Rok&?Ef=JrTmvBAS1h?C0)ty5+yEFRz zY$G=coQtNmT@1O5uk#_MQM1&bPPnspy5#>=_7%WcEL*n$65$ zs6n;@Lcm9c7=l6J&J(yBnm#+MxMvd-VKqae7;H7p-th(nwc}?ov%$8ckwY%n{RAF3 zTl^SF7qIWdSa7%WJ@B^V-wD|Z)9IQkl$xF>ebi>0AwBv5l_h@5*C*Pyj?j_*pT*IMgu3 z$p#r4_da0~Wq(H~yP##oQ}x66iYFc0O@JFgyB>ul@qz{&<14#Jy@myM$G7CAbZZ%q zQ@oOzgj>Exb8S@8o`$~XO{dr+`Ep7Q)zWc2IDZZrGhliv1*$+k0r5X zek-sNsf;}`%?wiP?Oo=>9OO9tSZ5DkevO+&!Xw$_2Ii_u>-%_)dfOr-L*w6NGYXS$ za{}|YA-4u&;C73_!*eVg!V(O!2~zUt%lKywy7HUdNxX_ z3?v=(A!Bc3{+ow!U&li_s=GGN>WZ)WG?&;rZvu|++&3yNZ|#(A3eVI>4u{@*Ll=Kz zphD-pxS8or&RBeBWHsGZ<%VGYwJHE%lrx2^_q7mD+j~(A{4?$zI9rU-P2k0z{xR^~ z=GkfDU>(fG0cM}2s?~3{kgn2EJn?aeKWN0>$_`x%(Ms#U(2whQA^W-C4TcmNUtIJe z_c+4gUKHp{IU&040)Nuvz?Y1am0{4p&nmn^pv$<78hn`k8WSI<2mfji=SL^cyIj5W zAS$y0RoS%8qiL0OHO=|cP)*+VCAu015?JS$;u#*YWUrMCqdt>lz+*DzHKmRwPHdz3 zU{|roX|jjcZ2frJDIvu!pb5Xw%-k#uuHx@ebA4RnHbq0}t_hKPXNzRt(-`l;Ed%D= z^L>-}GR*#x=Lf3aCda!FZCj;BKp2?wBi@tExf#*rwcL)|!csF}G zFeh)w=@c0I`#GbwP$>&vlHEHbYCfWaSeCaNhpCHl+NPagJ;kE3i(4w1dtVFU#QHQ9 zGP_b7T|w}+tSWg7EUq8~`Z%S0&X2X0_u{{Oj|>2n*~^v@5oGwF25dv=ne=e`Blgv@ z1cvhzai-mJG?4~j!cSh0TCP#Yk_D7RpEK&P9rr@B`+6AXpUGqoeIZjb4 z@@C0Ek|f83wdy1&zsP+a3nyL&pX<5r@%XbCwkTvXv}>R%c4wG{^gN5OmPAnk5oY7N zOq)%kK!MDj(Cv-VgWBN(L9CACv=SLT0leDIPCE^E^KxNyP9sK2SKXgsrVblSc=}P_ z7>1*(bYZ?pvRU{{N3@AEtLN?BLt~$cL_d<%;R6-dzSK$M>AL|OA*FJ<@$TU1v$KVK zK+15Yo36tr#8zl|7pN4iv4IIt3h;U{d^0ox)8LQblY=y-(js9K^a;kG!P}7Buq(uj ze7iW`NL){KJ^+%X5R6SNsOUu66LcmaBu+YFZQ(kw`kUSH!B<;TX1=Ze;%zWd zzk8VC6oB=Y0IdJF=8gY0duLrc!@tcN%M}-_re$C_nQgavY(+^dRfgoI;)zaUnLfr- zQ558Ulv9ZI#Y<>R>j6gY7n*xFTyzf7b`AswB0$LXA&PHAQc@%VCn+>3+<13{HICi> z1e^PlCumi0D>wmdF|V)`m!#>Xy<|7TS2PG3g%J}O+9EwI{@0LXNQ&_&v5t*1n^Jie ztVH|`$Dx1(94_5VVU9~=T$^3==xN?G=1{ahQg(Kb-e$YoWbolm9szXu8&R>gyEitz z29WvH958)ch=)3^Q)iUt*kw$^!#8XkJ0U|(y!6Y)TQVHr@YqnVsJ#dc<0;>?&-!}b zu$8Pgy_;zaXGK^yysSfXUwMG!El)oP|AZT;OQF5GMeRDdD^;s<5wOEB2O*7;tHEH{ z?J0^Da&+7@X6?HjV{`_c3wd^HlBU*c8P?KlIJh-0kOGRr0q zs`iInBH1axzt84TZy%O16QRC()+yzG!q!b=&2akZ8l=*$)$++OrR2MU=OKf=R%Kdd zlDb-U7`tP5DM`}hop*ChKWEwrSACqlVYlrNa67J}o3juNnKFh*(aw}S0Yt#Hi9eBh zU>hB7uEBKQ2v>4v2aevzDgHg}N01r0Ov9XN(R`J6`Ut}^k!Ay#pls4|_Pu;Yu=I)A3WG8g-oa-*$BpH zr@S@-kHJwVSUoa`iTv?mt@Nc&%)1j{^W^}WXa1eF(jPYea`m2|_%Bbm*Xit}EE7uQ zkO!~r5JWf~4@@Z7m`Ngq4junyKV7P;=v-_A{u7ipnD*mqA-Hbi9}%*j(8e{<(=FsA z8dmMcUB~Rl0RHgnqe?*RAi@P7FB(0>eQ)0TTDn~Xk!0n81{{6azF6P^tPe!pJON9)PPNs>E!N?jVGR6;MMf&Efy2FA3Sv*} zr?du6?>tZE35#q^ngY+7po(iO)2s&RIK~Nj^m=WN)K(a;DdkI5HSjIEt8N67=K_yX ztWN1bcZlZH*dZ>-yg_)^i-qyO(Alz4HV@FCp4hz7&aP!@I!7zPKoJf!LUqzCy{BqC za?`;dQ0N$Ks&&?x^=OyROEfH_&kl&95SK-^3~A3Y9?%3GolxI#Tslw7wMy_N{Bqe` z@SXJ9&4H3BSgn{%veBqxJNHf>b7K$K5dsye@Eif1E|a!QqxOQAa!J^vtd;kC&%mOv zDqxSnJ!z@43Kg}+z{P0cT4HI7i<^#JUs?c14n;U*LrY->m}*$&@$BHokq+-3icm{^ zJ--jt0#iWcom^0c*+J}YGCV0QGcait?1WbC&>Wr2C3uVvP75_%D@?M$93Gtx0ff>k z8Eh^>36a4Kqv|`mlLFr}j?->fB;vt0&bocF@NOp6Auxab2C1(Ao}?dn@*b9W^9;p^ zo2J*RA(skdL{|ZKrRzkAXt;?#_T1w`YckFnDcd|}Z2kz6p)>c0RRBd#*yZI2>%Gx| zx9^t=L}3ZgPP)w`NKqxzh=42Il_Pp2ASyb^bzH0%&27SS*N^3nXv`)V`Kbl6IF%HG zAfX8al0IlL1=3QlqGG;7|8*qDz;~!C0-OOW{JX5uulI)jcq{%k2qeg9{*+bXtW~Xb zl9a4V-E7wXLP3Kr7T z32Q8)buV+6)A{M~`*)~y7;O)Os)O#{!l2k7%fRDeg{gE}gA#Ykw~eqj!2BJg2~DV% z?0jqAqy$oWjh1(0)67lJw(`w82K{w6t_KHHR%|oCR_K-|Dwpf!_?YoB34BTVM^%D& zKe|%G@iNB(L;`M_4;Q%dT87wT*t$K+NWSa}L5()Q6 zR^cf~GD7Ww$GNwlPMox33u7MKKACrxKVZY;UXcbtOS9#KBa{mI&JisMWhhQqmqZe; znb56^>NqJt-xyDsvjxQ8fY#{RyYo)e$8RCt!1IUCdxSk9;M-fUraC5y{H9=OQYu~6 z-rP}S3VTBeFTVZo-i1%SVfbAl91%*@iHYS!kI-iChYa^EbjPk@h$&#ahy--6LH^qL z&<^2z@qkZaI^dAni&X6Y)cJq7HUBNEB!40W|FhpM0ej4bl-ju_5K5+v@dd$IIB4b) z;lL6!D38o_=BhO-mQKidQJe6$$Z$Ra@YtULTe!w8I1@wx+|H-%^n0uJrz4L~4_n9| zATn>ZAVSel<@w(d!j9$3&eA}N_olx^B-ADA8Y!}sPS=#V;OXTL1b&YOwUB`M6rxUb zgEs4iz@nuelQV8D7`yX_)XH$tPi&oP%mYDGg(>a}8oqG8M7?%3FD2zqv#XdWiz z714^$VIzP+95>kjPq%MgquUAtO9B(w~*L2YAZU_F9N#3eEl85vfBu?a`P`6Xm3kj0l6Nth+y;Cz9OH_Es0> zo1JPeJZ6}R9tykmeQ(9q>4s2S=%@8WSO+_)PfnEx7yy8=KU3dQ1b1@ zLe|YVeU|CQ!Y$pwpt85CAq}WPEgDuAZ`$ov%@(vW_MO-#VnP|G73|xaaD}<4_&+J; zgiNsv4u_IXr^Ytpy4iOlSjxp`J5F%$bx~mAn2rH9;>7oZ{Rs~|r-F1L?p0r-Cial* z*ju9X*293JUOx9gRLte#LB6s zhF_q1U6;s@7a6pg6NTBm07k9|F!KM8x$duh_ZbS~0LcJ^CnKk&fP#Qf8AM7vB@@yb z1QBH1AS+uK=s3h0w>S<9&QBv$%#zqDRLK+5c2Yywk8`MDvZG|$L zSxbV#cib7=E6?LZZ9{OUauquA;%{ojlUY1v8{Ov#fLb`&61iKILLjMBy^4wy#KGg% z5t-qTeygbLpF^qziXP^n!U3(q4$PgP%~SI@0E`cHyK-DXw+gLVP|z6iir*Fw zL)k^L$gk|uEtE0zV#~sCv;)+pxm`dK?ENDS9)|n(Zj}}}6ZbP2rd+YgB9&Smou1o{ zJ#uA-q`Nf1z{gM7sBfJWrr~A9u|2n>{ncXZGP1re?sJ|J71TICDosR>$9J?^NH>FE z#`8fOAS71nZGd-AcVLv_#WPaJYkkCX#B&c?_rmtCU`gm=sewuRi~y}D!4gV%yf|JQqAK|S z3NY+e!0r^??@Va_K4{CY{nYJzk|ITbvSL?_RH+_-|E5^K0UcmP!>gf{&?q z9JpH)-|p)l2gO!ton?kecR~AOG`FkV*?qA}hx_W~fEo*HmajV21FOWx8epWGBqMfZ z-X^_=kRtD7%T7N(k^?i;Eu$6dNne>&u!k^I9NlPVk|PR~qofVxI5E4##Kn!T@B`q% zx#@yrJYT(YyFjO>rCgDLMfwU{`ov~-+?a}V9Xc;O$QM@CDB-@m^63@k)p$FvgiFWc zHuzFlTB{Pp%G(FV4?e!r%;My*4<#+ehI{UEaa8}hjHQNz5tq*Vdn3bUBA4g4z zSxKt2B;Kf0ye6XOC4EI!E5W;%ZfLS^#QF_$cMhG#9DGCwEw+nb5wpw(#Rl^RZvA22 zzXRia#XKW?+FII3Lt(Nk#DU2`P+Si(MTDq2{ooiv)-hrh1y)XMKBv@Xqixy_5uJxz zcc`ho5VW(ZRkeTIj~B8Nnr|6aHUMU21vo9l{X1r*Xl4EnyGref!*V|-2%Liix^z5X zFc$&AB!e(u8##Evcm)ND2xr0IuEzB61|2xe6uvWVi=Y*?3SVnSpGz$Z+y)y*n>z+QFjs}v_e*v zP_Nt+I$Zw-g?owyHJD)h2r{m^%w%VtX}EpeIZ&O}P zJ1LRhlhP^UZQznK*9`YpJ+-v#BE&=+Ipvr$7P71KK393slA#Wo=p!`pEyg& z{a&ok3cnda<~B(@(iUn(pm2#(%*UG)stYAloxMqfl-JZtb2C2ONi&161oUMZC(%;a z;C_P%IaHTn#f&~M75WuFF*VYel{=O8o>IW|_lUmwS2NY*v;x>&@9tFsqY0ft@)wOtwwT;OZ9gUafD?$GROZNaA;3>rX z;LCN5ShO!u3a0~P4CGBnW$+}XL3&3nD-oP)Y)jR|Caz^5x-nPpj)&LPao1*c#jtM3 z64eQm0vTP?5H*m7zkcSZ)BLuBXGo#be!C#yM~f8^ zyAyZ-E5|n(`XUc(VTyfc;r_H)lwnd|yAeY4k<3&c^~W|D6kS6&;PfnvY&pvwU!1jT z)38=e1?fhz|O++0F5Y%_SG5pBlZX7V}|y zKbZyKqHm5AaUiMj zCUPbE0qMDUT1aF=bdp1kWjVCm%rcCPd_s<#|8|CVqK{3dvMERZHbucuI(gMBF!!Z?h@3rKE6;co#Bw4k3(* zA~NeX#$PQFN4U6anBi8iZJC%;s+$naC6mF$<19HYmbZ>IagujymWfEr-t}&AEG}3E zJ1(i$737fX_NLD?5iNnxA1BcBSG(laS7x}K(Bo$yRLvfS_Lb2dr5=m0XX}1Kt*seb zAsrZ2o9}%?-%gm^VLP2z7(v;pj+Tn_yB%RO6+HUIY%9?8L`Mz;7q^w@{kkLspyD3?38pnfK{I6){@~vPc}EsIOyd zD~iI15JS#TV-VwIM(~#_`9c*LRhFe=OzpSVQP_Gd9~;5=rNo%-pBM(RD+)f+{J9kKIp`jP};PP=iltAyWeG)aShPJLp zOG#t0!(WU?8CuonQSZ3chh4oVrPy$4+n7{x$3xf6FV8s3m8VLl3{-Qv(IA|+A6I?D zC~yh1Gr|3!2OCbA>nzhG7`35>!p~ci0i%KKIJmW-4pQYV_=#*FMWmtH^L+rxaxL@L zflN53Urw<4L1OpX>fB6$9-aF#ulWh4qejyGgt2#sFi1t2OklZfqll%{)JJKJ$pg7B zqml2(v8YvBOk%R@Ec9SV_KMi{KIh7g8HRrQGH4TNPA!L*NDk|hU|`>I=w@C=J==*T znsYW{8*3Ji@uqPT=?(KH(VHy!TIzKszNvj!b^0f1#&BcAvQ!7a~C@+Q^lbX5cs$+TrJlU?nc^I@Qa^&finVG;I ze^XV?jhqzAk8EMZMT*L2O*S(XV*K~pdi+!|-vcqCz4)mThJ(=!%{O;MLlqej12w3W zNphu8?FuvmE$VJ&8Wwx^Y$4rKx7DsHQX!1I-;Pj<7O#EHt|x?Z`0f5;W7^@26`YhqT1DZNX4l`H7kmuqkpy)wH(;nfjq9$ z(2*k?bgq5fMrfo8Ri$%5@Q^?G5b*WX^3b*w*Lfg=ls#@9b-~<`h(3CURdhq&nlW&h z(AhX;3MMS&J46cO9UgpM$^2*TjVx%^j~Ff@r?lJRc8x?gXt&iK3(*gKRYjeP(GQA! zuHst-F=ajW*%Q%~B447rzbazMnF$}5OXR!QR_oDhzfv@(U*VOG14aA}tjTTkKn}bpv#*khun)lO zM5NU$Xy7-<&I0)0^awe*?VLvbyFGlEy_lTgDxmTdV~+~P3*DyyjM!;aQs<0!iMUau zf>LBl&AVSS+LIXlNpC_i4^*#CH4%3LIjE#3is5(R+|TKW2vX0v+CBJS`&-qdiPl!A zSA7Yy9$V;8Nw~%eJP)?l9hNb@YOXl0iKsu`1M-Fru6tfr0wwepIg_^g(l+rqT&39t zP?aFg({}KZVXvJ@4ZcQ(sAAU^OVw2JYQrLPNq;9*zgfFn*|EI99)hI5$v)GQ)YW@! z8n9Kb69y-?stN9;x@)*>3fW%?$Lc=f66T1b`$MPm?GSpkwo!aSt78tx!^o49V?+d@ z++0a6UDA_PYs*LNW#hmteK5HVJl<)R%I_y!ledT``?8&*5jXYyajeP;v)hYtQnIEg zx?N7l@K1^6ACKN6-3@lf$DLqPAxUm(aqK=-2H<7PzH;Qfp2{ae+#+(Gc0d<6wu38k zgd8R2WT(DU49P03i1M25_+I^_X^35vm7C0im)g;j*j$piW=S}o6kbxv&M7%B=d!ie z+rd7mUqp%-jT})YfL{!RG#^h&kCxz-X*I*1v6<*@6_W7^$!U6L1378%3uf5$l@(;M zJtTb&@5*<@Rm$|HuW_hsZ&l^A>D|Z2yV1HfqI|Fu!=(JCnDffsOu{&UUc% zs6peVI40o(uEY6_I3RAB%$;GuLvy2pr9O3ISJLZ{D5Z5U?CV$Qd~+wc)?9r4ily(` z%cAAs*BnPh=L{9S$L7Z$vmK8Q)Iuti^1Fw=#&oY9)0Er9ET_jZGxDe2GlS9=Oos;P zDH-1v=EG!1p{s#T&vcx7NldmrMn}a}gYLaL-vFLjwM)#i>V@%`&0HJd)`~v4D>tJ^ zF1NDv$l^m=O}%T&ur}Y=2wy_vKUWI>JjVq5V|u`KdAH4P+(QmXe5036V)SBNssr`i z`_rx!jLKcY2b|)BHbo43mR%(UEFY%e&-$jkUTMXXNHo*9Vh}R5{7pd*+MCP67g|pj zyJLBzU+j@bNAgh4!0eWUvKtjS0@8K2!2@-mbj7}beO)3eF#wZSCkvAOeB{f#kJ-o2 z$?GaO3IVd#d+Da_IKdo@3c53yU0G!UL;pTk2e@_-;pjN=RddpCCvUn93~@BwKK@0B zA4~Bn_T_uMci>dSof>J`MEm3_jKQvsUO_d%2)&_7kY>CcuGBTI(nQm$2C3Hc85YxS zo}zN0(D#p~Ew0i!owx`wE&gAEqM3c=0=MGNq5}l3ybPTtxWfZjFK;9WhqE{)XWwy4 z4pq!qh*65VI$nVdk$h~c(t}9|ZL)(=G~+1df`Nj{y~ly@^NDX(0AViPNk!7uw34l` zQ$5k8$W!!?cS4*yTEM%?7vZF=Dcot%KxMgJ2AY*Y9#mj%=Ke4haw#X!f>|R-`39S^ z1gmG0EI}HJJu8z3F)NKWEuadh+~hM-y5G0EWeE7CDrDqrY|AFNCDnKA$bcxnCWX497fmj-@Y}sZfJ`TJ|`)4@OeaA z>uKEo)-M-eEzg;$SpIIGqw_BAvhoe3cylh9R_Qqxv~({C%)Zmb8Xuw6C=WbkvA@lX zqJKENExX|I2HvI_ha~k9UXS=FW5tO=6RkhtXaePo@KIYPn|4g)fO|5b>bAPvS*6&_ zY%wcJpDF9SQ%2O?gWC*EB7|BACQWDAAwl97QvYJKo`X02t7RyogLjuq`$<5abV;}M z!TOl`RVlQqeaV)_PzfFEsFlqlZ-~j*=v{+v_i*PEH^2_sk^|-X_Gl=VB|>#My6Y8_ z_4`Nk#YJ@Yq{8RtQFV5`(Z{Fgi$z$;g)ND_g2a}vE-dmna*H2rfQJ{!f~wNbRi#xl zCxs9+Sp5|#XG}dX`^;MOfX(+?=nvax8ki45bVa?}a*afTZZT=0#YWUZt7D=OKT#1H za0W2c)G!K*S88H0n+ut z6B>K^ZX}6`7ZmNLi4jAP-SY;uOF>yGicJd-6l3P!K1L|<9^o`hWbY`Fx{no+3Iey6 z2P|Rad8lq%uI38_UCfV4bVFiE7p)gaP*l0tt9I}vTCs*XgUjo|i_aQ_2&v>gsOmab zi=67GU>J6N4?nmPFC0pf$Z~G_`f7Ry-$UBLBP;qg9bw&-6`Fbg)kSu8gYcm5y#cpY zqWVQBM-=v;xQn6|u0_H62~`3#xH1u(dpoh@!Q~vn|%by)=@}Z~4PJ z#rEgEqtziTQ0L=OZY(f6TML2EUa2GX!<)K%`pmkIf{!1}(?}<^cAjh=&*64Ta zcUaqev1`D5zan@EKy#?z-K;BiRVO8KinlAK6z8%=6Jsz--kV&V)qxAv<~M9-&pIuT_wu@)ID~?d^u{pAk!8^^@x>Ze}?uLg5{Q#aBV#MLtBLt zJ3q(st(%3(jqIu-Q{A48R{-=0*8QCv`eOTbhTdL%(x{av+G12;&UX{IMQdFTMagXh z;B)KSo9(&k#Jte(uT^_7w4T>f;b*z;f8+qi-f^qiZKc@vF&&(a{Md1;k=QgyeOx;r z7tUyZlTL%_{F<{0zC+&2Owgup1BwYVy*#-$IFXOD7)u9(I@^s_EM?bqvCk>yxK zm8-nz4|9bLwGFq|=%nqej@lxOug=^WJO6U98~iEA`QLk_ z$_w7;%7{-wO9N8^)r$R*D@2OZEQyA!fdmsS#bH}Sk{C;*wxTv_5b)-B($U88lLH~@ zV&XXy0R;shsfnKSVLtf`;6&Vs%(oX~=+Qxi@^CK-6J`dFdZdI+{@M{Xfrcqy8+5lMM5 zhE#6UsCa1tdGPlg*|x>-yzfZqNplh3_Ymjkpv1Bsyp8lfF60hMuWVOZAV7&=y`X6lDzcqxw7$Z;A*SmZ(Nz>i3P%^W1i( z#3TUR-d2_oLcS#@!;T^{9F|qFp)S;D{#2=8^0v%Key6i91IX`PbOB|mxLPNun5nXb zIA&w$jNqnyUi~{`u}ZN0cJv0O&d7+vK&vRx{gGMH^eRSiPVFh7`!SJViDVE-m+^C> zlCV9-Bk&7JKDVKCWpQH#ab$Dr+TNXXB7eR(NpM`xO8;xNGYtI((~C4Yr(1_N3DGNL zE8*RjW5)|FL?Y~Z)cXlQD?}cLLq-wT*EoR$4h&OO8Wpm(EIi(qr>7xx;lPIa;>Ln~ zn+>Yux7QZhGH~(YiU94Lh_3u%$XvfTYzI1}i)cgTk6@>zPR(ZG`(|u5`6WpZsUqcN z%8>_30cumMF$>w}ugM)8hFg4|8Yn&{sBxYQFqvOYrpNvH?p+18z2?c5teV?7zpq$j z3EtMv`;ZTUeN+QYh3jleh;2bd2#;8$quWfh#JK5*jxko5vgzF|&h^y_XsLy#L*mS5 zb}DxFBhl)h8ReL?>4IA{&LIQ>z8Od3nGJ9GPshV8q0ynul?WqPrXOq?P}^LIC;a9? zrqvWeXb~nFq`hbc?niSIhf`%$ustIDEWVWza#^D_l!Wa&1NY#7S-elphiW6)pGS5e zAsJEFn%{DjqS$cBq0u6fwGqdDf39ps>@6T1jfD9g+)pFm9JgX&|LGoQE{Lh@=M65w z9alK+Q1=Ih4>Sg+ZLzH&q|WF$&FWxlJpOv|ddF|K9ciVi1N1iE#(p=KA&}UctCH+e zOwW&wJy*8KYK~Aktb-PQYlYVy=uQA7+?t!IB_tB5_h3VD!-c0=T`_>>)2a(mv|?vuKtWlT;5lan<(odQLutt;6o5=r(^lj zo1$Xr7#^{F9==NcQr<22*TfEE0ruhI9RV4&_OQ4_n6zX)O)x(`RG7aD2b*QS&|T^U!6uUXvB*lUI*8!7ptAi^C3y_CF6|w- zU#=m&*UI(X>E(ue+0A_mB74@g>31kXEhnu<#9aS?NE3dxR%U@cwW4p{-D3c+rubPH z%gi!0#5I!Jk67)>#X5LhAIU=54jy7;3}SjJoeX{|ZqkM_lXjS$Z^<{wXb#D5a&twQ z8U%_f2y?Nr(FJ{^BZO8+u&!!8g24#I7+z_tMSrFfe~{CBjkv}OBG}JM1GK`=&<1>J zwQeXBueq9H;>kc;b!t5Xt|pOARx}lxMTvLof6(kO%l&} z(n4VOPf8N}9mD*Qd3gMUp!OFp0zKn0+7R0Sd!9IeGa?j!-?jPMxcxIaes2zm8? z9SLb@q&&eZ&_LiNLC&EZ3Po;{DFvp*HSNiN>u1f+t{Q0JoVG#<>kTnZ)Nz{~A{H&+ zc@5Y|Kc*@`5cNpOV139q^H^i0|MbJ-$15FJa#8~s8CeNjU%vPEG+DVjfuU)l6#3B~ zGW#egh-}rp&OSDgf4bSO$=~b<1%-ffAF;4i<}IulzD{2K>R+tve?&>XUkuT$r!~9* zVbtQ4CU(#&R9o+h3Y9Q|@V z*7wcF>h}hZ`bm9v?;;i&I$5z3Uhe#d@iJO?0M3F!0?vZ6{o*aKvoCD0YI!!ckc0LU^IBgEqvK<@>~Lx8-DggTFW4)H{d_Sl!>SwUp{cfTlLnn&IDsv|!$Nopi71;p`%B2Tq*pD& z;eNt;t65>CI>$VwCeAkUNncFh+x*CWCJIcXnw)DxQSy=f(nY|E(pMk$MUgCW%G+#G zzYhUcb>{Mc`1*E^5-L}>#wH%qb9{mR5oYCApM^%QRreP#%LVpR_Q#_33FjnkmkHzH zXWvG`T|@>%Vvq%ChkV>==f0W^W+TB1;_zAY*Yg&eiMR$w#;hox4|VuzbfiTle$zCA z39(jR2(6;HdXA>ljv1b}Y)XSg>pfr&-PP&+F2aVzFT)vBt$K|`fyVfh8x2+FQnzp{ zEyXfEeC&kNFLQ(+0z|$R-X0UO5UJ=@UKqRw_%N+T)W)USq3v5rPyT7`eX-Z6nS#S1 z`)03GQv}JuKi)YL7hk=IbBY6EPx;xWkASZm>)-qIW%92-tzBMdK4!!Yi*@rL1dh*_ zTGltrn#~9oz!OdLt%@o8LSlaof+IGCDdz1_O{f1h z{$n(~xy`$+5<1L=R8_#@ zN)*ty3MwvxxuI8|;*A7A6taN?U*`*FWAw=MD@55$b4y}fj0h8eu{~nX%l@b*a zlvkjV6ncs9^NIfu1J1|&siXq#t?i8e#`*J4{__MtGv-gF191QIiGK^i{}a{Ec6cra zfZIPk_;0cLzcHV=sU@8ODmepap`S^to(l%x&HV)cpS88aPlb6KNnKMbKp^6?uKdfo znfMwQPUIGqTv)R7~G!qY?z6^f>WCQp` z{s|B;Zn(JeIy#sD)O}6$pXD%KGDKg%j=le>m3qxLgeE@@`u9fcpDe<_Im46kqXPw+3M$}eGG>VQAPc3b}w?4P|1FEL+=%06Qb zIsOyoA29&`?aTO5zV#Wk!Ra?p|GSv$%j&#__*R^2hu7 zC$W*2EH7g?pIHnNf1Bmc5uGmyUdGQo6Nsk#e-iw!7JC`d^h|}9{u@;Pv#nl+wmjpz zX8s2LKL@(JY`2$@0MBHNfc40W0sBv5)gQm&*ORQ5`_Ipq3AKO2{1?#QccWj{^QG_m z8Pl@$e`EgB81>Sh_>621SW>@e0l;+NcfE^$`vot2T+ckhpZ~`5a@zT)mj55a_)EXb zGYwkT|4r%sn-}Ikb^edf< \(.*\)$'` + 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="" + +# 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, switch paths to Windows format before running java +if $cygwin ; 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=$((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" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 00000000..f9553162 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,84 @@ +@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 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= + +@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 Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_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=%* + +: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/pom.xml b/pom.xml deleted file mode 100644 index 7e8dda8d..00000000 --- a/pom.xml +++ /dev/null @@ -1,277 +0,0 @@ - - 4.0.0 - - - - org.sonatype.oss - oss-parent - 7 - - - de.javakaffee - kryo-serializers - 0.43-SNAPSHOT - bundle - kryo serializers - - Additional kryo (http://kryo.googlecode.com) serializers for standard jdk types (e.g. currency, jdk proxies) and some for external libs (e.g. joda time, cglib proxies, wicket). - - https://github.com/magro/kryo-serializers - - - github.com - https://github.com/magro/kryo-serializers/issues - - 2010 - - 2.0.9 - - - - The Apache Software License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt - repo - - - - scm:git:git@github.com:magro/kryo-serializers.git - scm:git:git@github.com:magro/kryo-serializers.git - git@github.com:magro/kryo-serializers.git - - - - martin.grotzke - Martin Grotzke - martin.grotzke@googlecode.com - - owner - developer - - +1 - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - true - - 1.6 - 1.6 - utf-8 - - - - - - - org.apache.felix - maven-bundle-plugin - 2.4.0 - true - - - - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.10.3 - - - -Xdoclint:none - - - - org.codehaus.mojo - cobertura-maven-plugin - 2.7 - - - html - xml - - - - - org.eluder.coveralls - coveralls-maven-plugin - 4.1.0 - - - - - - true - - - maven-project-info-reports-plugin - 2.3.1 - - - sunlink - - javadoc - - true - - - http://download.oracle.com/javase/6/docs/api/ - - - - - - - org.apache.maven.plugins - maven-jxr-plugin - 2.2 - - - org.codehaus.mojo - findbugs-maven-plugin - 2.3.2 - - true - Normal - Max - de.javakaffee.kryoserializers.- - false - - - - - - - UTF-8 - 1.5.8 - - - - - - org.slf4j - slf4j-api - ${slf4j.version} - test - - - junit - junit - 4.7 - test - - - - - - - - com.esotericsoftware - kryo - 4.0.0 - - - com.google.protobuf - protobuf-java - 2.6.1 - true - - - joda-time - joda-time - 1.6.2 - true - - - cglib - cglib - 3.1 - true - - - org.apache.wicket - wicket - 1.4.17 - true - - - com.google.guava - guava - 17.0 - true - - - com.github.andrewoma.dexx - collection - 0.6 - true - - - - - org.testng - testng - 6.8.21 - test - - - - - junit - junit - test - - - - - javax.servlet - servlet-api - 2.5 - test - - - - org.slf4j - slf4j-simple - ${slf4j.version} - test - - - - commons-lang - commons-lang - 2.4 - test - - - - - - - jcenter - bintray - http://jcenter.bintray.com - - - - - diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 00000000..eeb11c19 --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'kryo-serializers' diff --git a/src/test/java/de/javakaffee/kryoserializers/KryoTest.java b/src/test/java/de/javakaffee/kryoserializers/KryoTest.java index d6bff54d..5df70796 100644 --- a/src/test/java/de/javakaffee/kryoserializers/KryoTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/KryoTest.java @@ -16,8 +16,18 @@ */ package de.javakaffee.kryoserializers; -import static de.javakaffee.kryoserializers.TestClasses.createPerson; -import static org.testng.Assert.assertEquals; +import com.esotericsoftware.kryo.Kryo; +import com.esotericsoftware.kryo.Serializer; +import com.esotericsoftware.kryo.io.Input; +import com.esotericsoftware.kryo.io.Output; +import com.esotericsoftware.kryo.serializers.DefaultSerializers.BigDecimalSerializer; +import com.esotericsoftware.kryo.serializers.DefaultSerializers.BigIntegerSerializer; + +import org.apache.commons.lang3.mutable.MutableInt; +import org.testng.Assert; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; import java.lang.reflect.Field; import java.lang.reflect.InvocationHandler; @@ -51,19 +61,6 @@ import java.util.concurrent.atomic.AtomicLong; import java.util.regex.Pattern; -import org.apache.commons.lang.mutable.MutableInt; -import org.testng.Assert; -import org.testng.annotations.BeforeTest; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; - -import com.esotericsoftware.kryo.Kryo; -import com.esotericsoftware.kryo.Serializer; -import com.esotericsoftware.kryo.io.Input; -import com.esotericsoftware.kryo.io.Output; -import com.esotericsoftware.kryo.serializers.DefaultSerializers.BigDecimalSerializer; -import com.esotericsoftware.kryo.serializers.DefaultSerializers.BigIntegerSerializer; - import de.javakaffee.kryoserializers.TestClasses.ClassWithoutDefaultConstructor; import de.javakaffee.kryoserializers.TestClasses.Container; import de.javakaffee.kryoserializers.TestClasses.CounterHolder; @@ -78,6 +75,9 @@ import de.javakaffee.kryoserializers.TestClasses.Person.Gender; import de.javakaffee.kryoserializers.TestClasses.SomeInterface; +import static de.javakaffee.kryoserializers.TestClasses.createPerson; +import static org.testng.Assert.assertEquals; + /** * Test for {@link Kryo} serialization. * diff --git a/src/test/java/de/javakaffee/kryoserializers/TestClasses.java b/src/test/java/de/javakaffee/kryoserializers/TestClasses.java index d2468cc1..136450a9 100644 --- a/src/test/java/de/javakaffee/kryoserializers/TestClasses.java +++ b/src/test/java/de/javakaffee/kryoserializers/TestClasses.java @@ -16,6 +16,8 @@ */ package de.javakaffee.kryoserializers; +import org.apache.commons.lang3.mutable.MutableInt; + import java.io.Serializable; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; @@ -35,8 +37,6 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; -import org.apache.commons.lang.mutable.MutableInt; - import de.javakaffee.kryoserializers.TestClasses.Person.Gender; diff --git a/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableSortedMapSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableSortedMapSerializerTest.java index 98ba60bd..c80c1347 100644 --- a/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableSortedMapSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableSortedMapSerializerTest.java @@ -2,8 +2,7 @@ import com.esotericsoftware.kryo.Kryo; import com.google.common.collect.ImmutableSortedMap; -import com.google.common.collect.ImmutableSortedMap; -import com.google.common.collect.ImmutableSortedSet; + import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; @@ -11,7 +10,9 @@ import static de.javakaffee.kryoserializers.KryoTest.deserialize; import static de.javakaffee.kryoserializers.KryoTest.serialize; -import static org.testng.Assert.*; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertSame; +import static org.testng.Assert.assertTrue; public class ImmutableSortedMapSerializerTest { diff --git a/src/test/java/de/javakaffee/kryoserializers/wicket/WicketTest.java b/src/test/java/de/javakaffee/kryoserializers/wicket/WicketTest.java index fb57f9cc..6af420d7 100644 --- a/src/test/java/de/javakaffee/kryoserializers/wicket/WicketTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/wicket/WicketTest.java @@ -16,8 +16,9 @@ */ package de.javakaffee.kryoserializers.wicket; -import static de.javakaffee.kryoserializers.KryoTest.deserialize; -import static de.javakaffee.kryoserializers.KryoTest.serialize; +import com.esotericsoftware.kryo.Kryo; +import com.esotericsoftware.kryo.Serializer; +import com.esotericsoftware.kryo.serializers.FieldSerializer; import org.apache.wicket.Component; import org.apache.wicket.MarkupContainer; @@ -31,13 +32,12 @@ import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; -import com.esotericsoftware.kryo.Kryo; -import com.esotericsoftware.kryo.Serializer; -import com.esotericsoftware.kryo.serializers.FieldSerializer; - import de.javakaffee.kryoserializers.KryoReflectionFactorySupport; import de.javakaffee.kryoserializers.KryoTest; +import static de.javakaffee.kryoserializers.KryoTest.deserialize; +import static de.javakaffee.kryoserializers.KryoTest.serialize; + /** * A general test for several wicket serializations that don't require * specific serializers. @@ -107,12 +107,12 @@ public void testMarkupContainerChildList() throws Exception { public void testFeedbackPanel() throws Exception { final FeedbackPanel markupContainer = new FeedbackPanel("foo"); //markupContainer.info( "foo" ); - final Component child = markupContainer.get( 0 ); + final Component child = markupContainer.get( "feedbackul" ); child.isVisible(); final byte[] serialized = serialize( _kryo, markupContainer ); final MarkupContainer deserialized = deserialize( _kryo, serialized, markupContainer.getClass() ); - final Component deserializedChild = deserialized.get( 0 ); + final Component deserializedChild = deserialized.get( "feedbackul" ); deserializedChild.isVisible(); KryoTest.assertDeepEquals( deserialized, markupContainer ); From db492ab7ce3c74023f10f433d950c8b3e842dafb Mon Sep 17 00:00:00 2001 From: Mitchell Skaggs Date: Wed, 31 Jan 2018 12:25:16 -0600 Subject: [PATCH 05/13] Added javadoc and source jar generation, added local Maven publication, fixed errors in Javadocs and warnings in several classes --- build.gradle | 48 +++++++++++++++++-- .../kryoserializers/DateSerializer.java | 26 +++++----- .../FieldAnnotationAwareSerializer.java | 21 ++++---- .../KryoReflectionFactorySupport.java | 10 ++-- .../kryoserializers/SubListSerializers.java | 13 +++-- .../UnicodeBlockSerializer.java | 4 +- .../kryoserializers/dexx/ListSerializer.java | 2 +- .../kryoserializers/dexx/MapSerializer.java | 9 ++-- .../kryoserializers/dexx/SetSerializer.java | 2 +- .../guava/ImmutableMapSerializer.java | 7 +-- .../guava/ImmutableMultimapSerializer.java | 5 +- .../guava/ImmutableSetSerializer.java | 4 +- .../guava/ImmutableSortedMapSerializer.java | 1 + .../guava/MultimapSerializerBase.java | 6 +-- .../guava/ReverseListSerializer.java | 6 +-- .../jodatime/JodaDateTimeSerializer.java | 11 ++--- .../jodatime/JodaIntervalSerializer.java | 11 ++--- .../jodatime/JodaLocalDateSerializer.java | 11 ++--- .../jodatime/JodaLocalDateTimeSerializer.java | 11 ++--- .../jodatime/JodaLocalTimeSerializer.java | 1 - .../protobuf/ProtobufSerializer.java | 3 +- 21 files changed, 126 insertions(+), 86 deletions(-) diff --git a/build.gradle b/build.gradle index 9d0b3ade..944eab04 100644 --- a/build.gradle +++ b/build.gradle @@ -10,14 +10,51 @@ version = '0.43-SNAPSHOT' description = 'Extra Kryo Serializers' -sourceCompatibility = JavaVersion.VERSION_1_7 -targetCompatibility = JavaVersion.VERSION_1_7 +sourceCompatibility = JavaVersion.VERSION_1_8 +targetCompatibility = JavaVersion.VERSION_1_8 + +task sourcesJar(type: Jar) { + from sourceSets.main.allJava + classifier 'sources' +} + +task javadocJar(type: Jar, dependsOn: javadoc) { + from javadoc.destinationDir + classifier 'javadoc' + + // Add support for new doc tags + (javadoc.options as CoreJavadocOptions).with { + addMultilineStringsOption("tag").setValue([ + "apiNote:a:API Note:", + "implSpec:a:Implementation Requirements:", + "implNote:a:Implementation Note:" + ]) + } +} + +compileJava { + // Disable warnings about Sun classes (ReflectionFactory). + options.compilerArgs += ["-XDignore.symbol.file", "-Xlint:unchecked"] + options.fork = true + options.forkOptions.executable = 'javac' +} + +publishing { + publications { + maven(MavenPublication) { + from components.java + //noinspection GroovyAssignabilityCheck + artifact sourcesJar + //noinspection GroovyAssignabilityCheck + artifact javadocJar + } + } +} test { useTestNG() } - repositories { jcenter() } @@ -26,7 +63,6 @@ ext.optionalDependencies = [ 'com.google.protobuf:protobuf-java:3.5.1', 'joda-time:joda-time:2.9.9', 'cglib:cglib:3.2.6', - //'org.apache.wicket:wicket:1.4.17', 'org.apache.wicket:wicket-core:8.0.0-M8', 'com.google.guava:guava:21.0', 'com.github.andrewoma.dexx:collection:0.7' @@ -36,9 +72,13 @@ dependencies { api 'com.esotericsoftware:kryo:4.0.1' compileOnly optionalDependencies + // Testing + testImplementation 'org.testng:testng:6.13.1' testImplementation 'junit:junit:4.12' + testImplementation optionalDependencies + testImplementation 'javax.servlet:javax.servlet-api:4.0.0' testImplementation 'org.slf4j:slf4j-simple:1.8.0-beta0' testImplementation 'org.apache.commons:commons-lang3:3.7' diff --git a/src/main/java/de/javakaffee/kryoserializers/DateSerializer.java b/src/main/java/de/javakaffee/kryoserializers/DateSerializer.java index a021de41..730f0014 100644 --- a/src/main/java/de/javakaffee/kryoserializers/DateSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/DateSerializer.java @@ -16,26 +16,26 @@ */ package de.javakaffee.kryoserializers; -import java.lang.reflect.Constructor; -import java.util.Date; - import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.Serializer; import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output; +import java.lang.reflect.Constructor; +import java.util.Date; + /** * A kryo {@link Serializer} for {@link Date} and subclasses. Must be registered like this: - *

- *  Kryo kryo = new Kryo() {
- *      public Serializer getDefaultSerializer(final Class clazz) {
- *          if ( Date.class.isAssignableFrom( type ) ) {
- *              return new DateSerializer( type );
- *          }
- *          return super.getDefaultSerializer( clazz );
- *      }
- *  };
- * 
+ *
+ * Kryo kryo = new Kryo() {
+ *     public Serializer<?> getDefaultSerializer(final Class clazz) {
+ *         if ( Date.class.isAssignableFrom( type ) ) {
+ *             return new DateSerializer( type );
+ *         }
+ *         return super.getDefaultSerializer( clazz );
+ *     }
+ * };
+ * 
* * @author Martin Grotzke */ diff --git a/src/main/java/de/javakaffee/kryoserializers/FieldAnnotationAwareSerializer.java b/src/main/java/de/javakaffee/kryoserializers/FieldAnnotationAwareSerializer.java index c7373fcc..7ab44d12 100644 --- a/src/main/java/de/javakaffee/kryoserializers/FieldAnnotationAwareSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/FieldAnnotationAwareSerializer.java @@ -1,7 +1,9 @@ package de.javakaffee.kryoserializers; -import static com.esotericsoftware.minlog.Log.TRACE; -import static com.esotericsoftware.minlog.Log.trace; +import com.esotericsoftware.kryo.Kryo; +import com.esotericsoftware.kryo.Serializer; +import com.esotericsoftware.kryo.factories.SerializerFactory; +import com.esotericsoftware.kryo.serializers.FieldSerializer; import java.lang.annotation.Annotation; import java.lang.reflect.Field; @@ -9,16 +11,13 @@ import java.util.HashSet; import java.util.Set; -import com.esotericsoftware.kryo.Kryo; -import com.esotericsoftware.kryo.Serializer; -import com.esotericsoftware.kryo.factories.SerializerFactory; -import com.esotericsoftware.kryo.serializers.FieldSerializer; +import static com.esotericsoftware.minlog.Log.TRACE; +import static com.esotericsoftware.minlog.Log.trace; /** * A kryo {@link FieldSerializer} that allows to exclusively include or exclude fields that * are attributed with user-specific annotations. This can be for example useful when serializing beans that carry * references to a dependency injection framework. As an example for Spring: - *

*

  * {@code
  * Set> marks = new HashSet<>();
@@ -28,10 +27,10 @@
  * kryo.setDefaultSerializer(factory);
  * }
  * 
- *

+ *

* The resulting {@link Kryo} instance would ignore all fields that are annotated with Spring's {@code @Autowired} * annotation. - *

+ *

* Similarly, it is possible to created a serializer which does the opposite such that the resulting serializer * would only serialize fields that are annotated with the specified annotations. * @@ -143,7 +142,7 @@ private boolean isMarked(final Field field) { /** * Adds an annotation to the annotations that are considered by this serializer. - *

+ *

* Important: This will not have an effect if the serializer was configured * to exclusively serialize annotated fields by setting {@code disregarding} to * {@code false}. This is similar to the contract of this serializer's superclass @@ -166,7 +165,7 @@ public boolean addAnnotation(final Class clazz) { /** * Removes an annotation to the annotations that are considered by this serializer. - *

+ *

* Important: This will not have an effect if the serializer was configured * to not serialize annotated fields by setting {@code disregarding} to * {@code true}. This is similar to the contract of this serializer's superclass diff --git a/src/main/java/de/javakaffee/kryoserializers/KryoReflectionFactorySupport.java b/src/main/java/de/javakaffee/kryoserializers/KryoReflectionFactorySupport.java index 4c20ed31..14fda244 100644 --- a/src/main/java/de/javakaffee/kryoserializers/KryoReflectionFactorySupport.java +++ b/src/main/java/de/javakaffee/kryoserializers/KryoReflectionFactorySupport.java @@ -16,23 +16,23 @@ */ package de.javakaffee.kryoserializers; +import com.esotericsoftware.kryo.Kryo; +import com.esotericsoftware.kryo.Serializer; +import com.esotericsoftware.kryo.serializers.FieldSerializer; + import java.lang.reflect.Constructor; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import sun.reflect.ReflectionFactory; -import com.esotericsoftware.kryo.Kryo; -import com.esotericsoftware.kryo.Serializer; -import com.esotericsoftware.kryo.serializers.FieldSerializer; - /** * A {@link Kryo} specialization that uses sun's {@link ReflectionFactory} to create * new instance for classes without a default constructor. * * @author Martin Grotzke */ -@SuppressWarnings("restriction") +@SuppressWarnings({"restriction", "sunapi"}) public class KryoReflectionFactorySupport extends Kryo { private static final ReflectionFactory REFLECTION_FACTORY = ReflectionFactory.getReflectionFactory(); diff --git a/src/main/java/de/javakaffee/kryoserializers/SubListSerializers.java b/src/main/java/de/javakaffee/kryoserializers/SubListSerializers.java index 562ae074..d4448062 100644 --- a/src/main/java/de/javakaffee/kryoserializers/SubListSerializers.java +++ b/src/main/java/de/javakaffee/kryoserializers/SubListSerializers.java @@ -16,16 +16,16 @@ */ package de.javakaffee.kryoserializers; -import java.lang.reflect.Field; -import java.util.AbstractList; -import java.util.ArrayList; -import java.util.List; - import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.Serializer; import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output; +import java.lang.reflect.Field; +import java.util.AbstractList; +import java.util.ArrayList; +import java.util.List; + /** * Kryo {@link Serializer}s for lists created via {@link List#subList(int, int)}. * An instance of a serializer can be obtained via {@link #createFor(Class)}, which @@ -73,6 +73,9 @@ public static Serializer> createFor(final Class type) { /** * Adds appropriate sublist serializers as default serializers. + * + * @param kryo the {@code Kryo} to add default serializers to. + * @return the input {@code Kryo} */ public static Kryo addDefaultSerializers(Kryo kryo) { ArrayListSubListSerializer.addDefaultSerializer(kryo); diff --git a/src/main/java/de/javakaffee/kryoserializers/UnicodeBlockSerializer.java b/src/main/java/de/javakaffee/kryoserializers/UnicodeBlockSerializer.java index 58d958b3..bd6919dd 100644 --- a/src/main/java/de/javakaffee/kryoserializers/UnicodeBlockSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/UnicodeBlockSerializer.java @@ -9,8 +9,6 @@ import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.IdentityHashMap; -import java.util.logging.Level; -import java.util.logging.Logger; /** * A kryo {@link Serializer} for fields of type {@link UnicodeBlock}, which is effectively but not @@ -55,7 +53,7 @@ public void write(final Kryo kryo, final Output output, final UnicodeBlock obj) } /** - * Returns {@code original}; see {@link com.esotericsoftware.kryo.serialize.EnumSerializer#copy} + * Returns {@code original}; see {@link com.esotericsoftware.kryo.serializers.DefaultSerializers.EnumSerializer#copy} * for why we behave this way. */ @Override diff --git a/src/main/java/de/javakaffee/kryoserializers/dexx/ListSerializer.java b/src/main/java/de/javakaffee/kryoserializers/dexx/ListSerializer.java index d113b290..bdac1e04 100644 --- a/src/main/java/de/javakaffee/kryoserializers/dexx/ListSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/dexx/ListSerializer.java @@ -39,7 +39,7 @@ public List read(Kryo kryo, Input input, Class aClass) { } /** - * Creates a new {@link ImmutableListSerializer} and registers its serializer + * Creates a new {@link de.javakaffee.kryoserializers.guava.ImmutableListSerializer} and registers its serializer * * @param kryo the {@link Kryo} instance to set the serializer on */ diff --git a/src/main/java/de/javakaffee/kryoserializers/dexx/MapSerializer.java b/src/main/java/de/javakaffee/kryoserializers/dexx/MapSerializer.java index 15568258..dbbb3433 100644 --- a/src/main/java/de/javakaffee/kryoserializers/dexx/MapSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/dexx/MapSerializer.java @@ -16,7 +16,7 @@ /** * A kryo {@link Serializer} for dexx {@link Map} */ -public class MapSerializer extends Serializer> { +public class MapSerializer extends Serializer> { private static final boolean DOES_NOT_ACCEPT_NULL = true; private static final boolean IMMUTABLE = true; @@ -26,12 +26,13 @@ public MapSerializer() { } @Override - public void write(Kryo kryo, Output output, Map immutableMap) { + public void write(Kryo kryo, Output output, Map immutableMap) { kryo.writeObject(output, immutableMap.asMap()); } + @SuppressWarnings("unchecked") @Override - public Map read(Kryo kryo, Input input, Class> type) { + public Map read(Kryo kryo, Input input, Class> type) { HashMap map = kryo.readObject(input, HashMap.class); ArrayList> listOfPairs = new ArrayList(); @@ -44,7 +45,7 @@ public Map read(Kryo kryo, Input input, Class read(Kryo kryo, Input input, Class> type) { } /** - * Creates a new {@link ImmutableSetSerializer} and registers its serializer + * Creates a new {@link de.javakaffee.kryoserializers.guava.ImmutableSetSerializer} and registers its serializer * for the several ImmutableSet related classes. * * @param kryo the {@link Kryo} instance to set the serializer on diff --git a/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableMapSerializer.java b/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableMapSerializer.java index e832c299..af7157c5 100644 --- a/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableMapSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableMapSerializer.java @@ -15,7 +15,7 @@ /** * A kryo {@link Serializer} for guava-libraries {@link ImmutableMap}. */ -public class ImmutableMapSerializer extends Serializer> { +public class ImmutableMapSerializer extends Serializer> { private static final boolean DOES_NOT_ACCEPT_NULL = true; private static final boolean IMMUTABLE = true; @@ -25,12 +25,13 @@ public ImmutableMapSerializer() { } @Override - public void write(Kryo kryo, Output output, ImmutableMap immutableMap) { + public void write(Kryo kryo, Output output, ImmutableMap immutableMap) { kryo.writeObject(output, Maps.newHashMap(immutableMap)); } + @SuppressWarnings("unchecked") @Override - public ImmutableMap read(Kryo kryo, Input input, Class> type) { + public ImmutableMap read(Kryo kryo, Input input, Class> type) { Map map = kryo.readObject(input, HashMap.class); return ImmutableMap.copyOf(map); } diff --git a/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableMultimapSerializer.java b/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableMultimapSerializer.java index bbf64938..05f5625e 100644 --- a/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableMultimapSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableMultimapSerializer.java @@ -33,6 +33,7 @@ public void write(Kryo kryo, Output output, ImmutableMultimap im kryo.writeObject(output, ImmutableMap.copyOf(immutableMultiMap.asMap())); } + @SuppressWarnings("unchecked") @Override public ImmutableMultimap read(Kryo kryo, Input input, Class> type) { final ImmutableMultimap.Builder builder; @@ -47,9 +48,9 @@ else if (type.equals (ImmutableSetMultimap.class)) { } final Map map = kryo.readObject(input, ImmutableMap.class); - final Set>> entries = map.entrySet(); + final Set>> entries = map.entrySet(); - for (Map.Entry> entry : entries) { + for (Map.Entry> entry : entries) { builder.putAll(entry.getKey(), entry.getValue()); } diff --git a/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableSetSerializer.java b/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableSetSerializer.java index 59bb41bf..a67102fa 100644 --- a/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableSetSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableSetSerializer.java @@ -10,8 +10,8 @@ /** * A kryo {@link Serializer} for guava-libraries {@link ImmutableSet}. * - *@implNote ImmutableSet builder would be a little bit more efficient for less than five elements - *(the array.clone as done by copyOf is saved), for more elements copyOf seems to get more efficient. + * (the array.clone as done by copyOf is saved), for more elements copyOf seems to get more efficient. + * @implNote ImmutableSet builder would be a little bit more efficient for less than five elements */ public class ImmutableSetSerializer extends Serializer> { diff --git a/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableSortedMapSerializer.java b/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableSortedMapSerializer.java index f2750539..a719491f 100644 --- a/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableSortedMapSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableSortedMapSerializer.java @@ -29,6 +29,7 @@ public void write(Kryo kryo, Output output, ImmutableSortedMap read(Kryo kryo, Input input, Class> type) { Map map = kryo.readObject(input, TreeMap.class); diff --git a/src/main/java/de/javakaffee/kryoserializers/guava/MultimapSerializerBase.java b/src/main/java/de/javakaffee/kryoserializers/guava/MultimapSerializerBase.java index 67bfe88c..8177f724 100644 --- a/src/main/java/de/javakaffee/kryoserializers/guava/MultimapSerializerBase.java +++ b/src/main/java/de/javakaffee/kryoserializers/guava/MultimapSerializerBase.java @@ -1,14 +1,13 @@ package de.javakaffee.kryoserializers.guava; -import java.util.Map; - import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.Serializer; import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output; - import com.google.common.collect.Multimap; +import java.util.Map; + public abstract class MultimapSerializerBase> extends Serializer { public MultimapSerializerBase(boolean acceptsNull, boolean immutable) { @@ -23,6 +22,7 @@ protected void writeMultimap(Kryo kryo, Output output, Multimap multimap) } } + @SuppressWarnings("unchecked") protected void readMultimap(Kryo kryo, Input input, Multimap multimap) { final int size = input.readInt(true); for (int i = 0; i < size; ++i) { diff --git a/src/main/java/de/javakaffee/kryoserializers/guava/ReverseListSerializer.java b/src/main/java/de/javakaffee/kryoserializers/guava/ReverseListSerializer.java index 65a9b6ba..d94f0238 100644 --- a/src/main/java/de/javakaffee/kryoserializers/guava/ReverseListSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/guava/ReverseListSerializer.java @@ -1,19 +1,19 @@ package de.javakaffee.kryoserializers.guava; -import com.google.common.collect.Lists; - import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.Serializer; import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output; import com.esotericsoftware.kryo.serializers.CollectionSerializer; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; /** - * A {@link Lists.ReverseList} Serializer. + * A {@link ImmutableList#reverse()} Serializer. * Treat as a {@link List} by reversing before write and after read. */ public abstract class ReverseListSerializer extends Serializer> { diff --git a/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaDateTimeSerializer.java b/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaDateTimeSerializer.java index 3648a655..e59ceaf5 100644 --- a/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaDateTimeSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaDateTimeSerializer.java @@ -16,6 +16,11 @@ */ package de.javakaffee.kryoserializers.jodatime; +import com.esotericsoftware.kryo.Kryo; +import com.esotericsoftware.kryo.Serializer; +import com.esotericsoftware.kryo.io.Input; +import com.esotericsoftware.kryo.io.Output; + import org.joda.time.Chronology; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; @@ -28,11 +33,6 @@ import org.joda.time.chrono.IslamicChronology; import org.joda.time.chrono.JulianChronology; -import com.esotericsoftware.kryo.Kryo; -import com.esotericsoftware.kryo.Serializer; -import com.esotericsoftware.kryo.io.Input; -import com.esotericsoftware.kryo.io.Output; - /** * A format for joda {@link DateTime}, that stores the millis, chronology and * time zone as separate attributes. If the chronology is {@link ISOChronology}, @@ -52,7 +52,6 @@ *
  • {@link BuddhistChronology}
  • *
  • {@link GJChronology}
  • * - *

    * * @author Martin Grotzke */ diff --git a/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaIntervalSerializer.java b/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaIntervalSerializer.java index 115011ae..421da531 100644 --- a/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaIntervalSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaIntervalSerializer.java @@ -14,6 +14,11 @@ */ package de.javakaffee.kryoserializers.jodatime; +import com.esotericsoftware.kryo.Kryo; +import com.esotericsoftware.kryo.Serializer; +import com.esotericsoftware.kryo.io.Input; +import com.esotericsoftware.kryo.io.Output; + import org.joda.time.Chronology; import org.joda.time.Interval; import org.joda.time.chrono.BuddhistChronology; @@ -25,11 +30,6 @@ import org.joda.time.chrono.IslamicChronology; import org.joda.time.chrono.JulianChronology; -import com.esotericsoftware.kryo.Kryo; -import com.esotericsoftware.kryo.Serializer; -import com.esotericsoftware.kryo.io.Input; -import com.esotericsoftware.kryo.io.Output; - /** * A format for Joda {@link Interval}, that stores the start and end millis, and chronology * as separate attributes. If the chronology is {@link ISOChronology}, @@ -46,7 +46,6 @@ *
  • {@link BuddhistChronology}
  • *
  • {@link GJChronology}
  • * - *

    * */ public class JodaIntervalSerializer extends Serializer { diff --git a/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaLocalDateSerializer.java b/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaLocalDateSerializer.java index 35ac8dbe..23d2cc4f 100644 --- a/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaLocalDateSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaLocalDateSerializer.java @@ -16,6 +16,11 @@ */ package de.javakaffee.kryoserializers.jodatime; +import com.esotericsoftware.kryo.Kryo; +import com.esotericsoftware.kryo.Serializer; +import com.esotericsoftware.kryo.io.Input; +import com.esotericsoftware.kryo.io.Output; + import org.joda.time.Chronology; import org.joda.time.LocalDate; import org.joda.time.chrono.BuddhistChronology; @@ -27,11 +32,6 @@ import org.joda.time.chrono.IslamicChronology; import org.joda.time.chrono.JulianChronology; -import com.esotericsoftware.kryo.Kryo; -import com.esotericsoftware.kryo.Serializer; -import com.esotericsoftware.kryo.io.Input; -import com.esotericsoftware.kryo.io.Output; - /** * A Kryo serializer for joda {@link LocalDate}. The LocalDate object is read or written as year, * month-of-year and day-of-month packed into one integer, and chronology as a separate attribute. @@ -56,7 +56,6 @@ *
  • {@link BuddhistChronology}
  • *
  • {@link GJChronology}
  • * - *

    * * @author Rennie Petersen */ diff --git a/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaLocalDateTimeSerializer.java b/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaLocalDateTimeSerializer.java index c3e94d36..d5a100e8 100644 --- a/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaLocalDateTimeSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaLocalDateTimeSerializer.java @@ -16,6 +16,11 @@ */ package de.javakaffee.kryoserializers.jodatime; +import com.esotericsoftware.kryo.Kryo; +import com.esotericsoftware.kryo.Serializer; +import com.esotericsoftware.kryo.io.Input; +import com.esotericsoftware.kryo.io.Output; + import org.joda.time.Chronology; import org.joda.time.LocalDateTime; import org.joda.time.chrono.BuddhistChronology; @@ -27,11 +32,6 @@ import org.joda.time.chrono.IslamicChronology; import org.joda.time.chrono.JulianChronology; -import com.esotericsoftware.kryo.Kryo; -import com.esotericsoftware.kryo.io.Input; -import com.esotericsoftware.kryo.io.Output; -import com.esotericsoftware.kryo.Serializer; - /** * A Kryo serializer for joda {@link LocalDateTime}. The LocalDateTime object is read or written as * year, month-of-year, day-of-month and millis-of-day packed into a long integer, and chronology as @@ -50,7 +50,6 @@ *
  • {@link BuddhistChronology}
  • *
  • {@link GJChronology}
  • * - *

    * * @author Rennie Petersen */ diff --git a/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaLocalTimeSerializer.java b/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaLocalTimeSerializer.java index 841606e9..4cae33b1 100644 --- a/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaLocalTimeSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaLocalTimeSerializer.java @@ -24,7 +24,6 @@ *
  • {@link BuddhistChronology}
  • *
  • {@link GJChronology}
  • * - *

    * * @author Rob Reeves */ diff --git a/src/main/java/de/javakaffee/kryoserializers/protobuf/ProtobufSerializer.java b/src/main/java/de/javakaffee/kryoserializers/protobuf/ProtobufSerializer.java index c28fd860..c3c9ca89 100644 --- a/src/main/java/de/javakaffee/kryoserializers/protobuf/ProtobufSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/protobuf/ProtobufSerializer.java @@ -37,6 +37,7 @@ public void write(Kryo kryo, Output output, T protobufMessage) { output.flush(); } + @SuppressWarnings("unchecked") @Override public T read(Kryo kryo, Input input, Class type) { // Read the length of our byte array @@ -51,7 +52,7 @@ public T read(Kryo kryo, Input input, Class type) { byte[] bytes = input.readBytes(length - 1); try { // Deserialize protobuf - return (T) (getParseFromMethod(type).invoke(type, bytes)); + return (T) (getParseFromMethod(type).invoke(type, (Object) bytes)); } catch (NoSuchMethodException e) { throw new RuntimeException("Unable to deserialize protobuf "+e.getMessage(), e); } catch (InvocationTargetException e) { From 5bc3adbcece3d5a8bc60b895c92146356dc2bdb3 Mon Sep 17 00:00:00 2001 From: Mitchell Skaggs Date: Wed, 31 Jan 2018 21:01:30 -0600 Subject: [PATCH 06/13] Added Spotless formatter (using Eclipse Java and Groovy settings from Spotless itself) --- build.gradle | 124 ++++++++------ gradle.properties | 0 spotless.eclipseformat.xml | 313 ++++++++++++++++++++++++++++++++++++ spotless.groovyformat.prefs | 2 + spotless.importorder | 7 + spotless.license | 15 ++ 6 files changed, 410 insertions(+), 51 deletions(-) create mode 100644 gradle.properties create mode 100644 spotless.eclipseformat.xml create mode 100644 spotless.groovyformat.prefs create mode 100644 spotless.importorder create mode 100644 spotless.license diff --git a/build.gradle b/build.gradle index 944eab04..8c3361cf 100644 --- a/build.gradle +++ b/build.gradle @@ -1,8 +1,8 @@ plugins { - id 'java-library' - id 'maven-publish' - id 'com.diffplug.gradle.spotless' version '3.8.0' - id 'com.github.ben-manes.versions' version '0.17.0' + id 'java-library' + id 'maven-publish' + id 'com.diffplug.gradle.spotless' version '3.8.0' + id 'com.github.ben-manes.versions' version '0.17.0' } group = 'de.javakaffee' @@ -14,72 +14,94 @@ sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 task sourcesJar(type: Jar) { - from sourceSets.main.allJava - classifier 'sources' + from sourceSets.main.allJava + classifier 'sources' } task javadocJar(type: Jar, dependsOn: javadoc) { - from javadoc.destinationDir - classifier 'javadoc' - - // Add support for new doc tags - (javadoc.options as CoreJavadocOptions).with { - addMultilineStringsOption("tag").setValue([ - "apiNote:a:API Note:", - "implSpec:a:Implementation Requirements:", - "implNote:a:Implementation Note:" - ]) - } + from javadoc.destinationDir + classifier 'javadoc' + + // Add support for new doc tags + (javadoc.options as CoreJavadocOptions).with { + addMultilineStringsOption("tag").setValue([ + "apiNote:a:API Note:", + "implSpec:a:Implementation Requirements:", + "implNote:a:Implementation Note:" + ]) + } } compileJava { - // Disable warnings about Sun classes (ReflectionFactory). - options.compilerArgs += ["-XDignore.symbol.file", "-Xlint:unchecked"] - options.fork = true - options.forkOptions.executable = 'javac' + // Disable warnings about Sun classes (ReflectionFactory). + options.compilerArgs += [ + "-XDignore.symbol.file", + "-Xlint:unchecked" + ] + options.fork = true + options.forkOptions.executable = 'javac' } publishing { - publications { - maven(MavenPublication) { - from components.java - //noinspection GroovyAssignabilityCheck - artifact sourcesJar - //noinspection GroovyAssignabilityCheck - artifact javadocJar - } - } + publications { + maven(MavenPublication) { + from components.java + //noinspection GroovyAssignabilityCheck + artifact sourcesJar + //noinspection GroovyAssignabilityCheck + artifact javadocJar + } + } } -test { - useTestNG() -} +test { useTestNG() } -repositories { - jcenter() -} +repositories { jcenter() } ext.optionalDependencies = [ - 'com.google.protobuf:protobuf-java:3.5.1', - 'joda-time:joda-time:2.9.9', - 'cglib:cglib:3.2.6', - 'org.apache.wicket:wicket-core:8.0.0-M8', - 'com.google.guava:guava:21.0', - 'com.github.andrewoma.dexx:collection:0.7' + 'com.google.protobuf:protobuf-java:3.5.1', + 'joda-time:joda-time:2.9.9', + 'cglib:cglib:3.2.6', + 'org.apache.wicket:wicket-core:8.0.0-M8', + 'com.google.guava:guava:21.0', + 'com.github.andrewoma.dexx:collection:0.7' ] dependencies { - api 'com.esotericsoftware:kryo:4.0.1' - compileOnly optionalDependencies + api 'com.esotericsoftware:kryo:4.0.1' + compileOnly optionalDependencies - // Testing + // Testing - testImplementation 'org.testng:testng:6.13.1' - testImplementation 'junit:junit:4.12' + testImplementation 'org.testng:testng:6.13.1' + testImplementation 'junit:junit:4.12' - testImplementation optionalDependencies + testImplementation optionalDependencies + + testImplementation 'javax.servlet:javax.servlet-api:4.0.0' + testImplementation 'org.slf4j:slf4j-simple:1.8.0-beta0' + testImplementation 'org.apache.commons:commons-lang3:3.7' +} - testImplementation 'javax.servlet:javax.servlet-api:4.0.0' - testImplementation 'org.slf4j:slf4j-simple:1.8.0-beta0' - testImplementation 'org.apache.commons:commons-lang3:3.7' +spotless { + java { + it.with { + licenseHeaderFile 'spotless.license' + importOrderFile 'spotless.importorder' + eclipse().configFile 'spotless.eclipseformat.xml' + trimTrailingWhitespace() + removeUnusedImports() + } + } + groovyGradle { + it.with { + greclipse().configFile('spotless.eclipseformat.xml', 'spotless.groovyformat.prefs') + } + } + freshmark { + it.with { + target '**/*.md' + propertiesFile('gradle.properties') + } + } } diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 00000000..e69de29b diff --git a/spotless.eclipseformat.xml b/spotless.eclipseformat.xml new file mode 100644 index 00000000..3813821e --- /dev/null +++ b/spotless.eclipseformat.xml @@ -0,0 +1,313 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spotless.groovyformat.prefs b/spotless.groovyformat.prefs new file mode 100644 index 00000000..da2cb796 --- /dev/null +++ b/spotless.groovyformat.prefs @@ -0,0 +1,2 @@ +groovy.formatter.remove.unnecessary.semicolons=true +groovy.formatter.longListLength=1 \ No newline at end of file diff --git a/spotless.importorder b/spotless.importorder new file mode 100644 index 00000000..bd30f3bc --- /dev/null +++ b/spotless.importorder @@ -0,0 +1,7 @@ +#Organize Import Order +5= +4=de.javakaffee +3=com +2=org +1=javax +0=java diff --git a/spotless.license b/spotless.license new file mode 100644 index 00000000..a99e6520 --- /dev/null +++ b/spotless.license @@ -0,0 +1,15 @@ +/* + * Copyright 2010 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ \ No newline at end of file From 4aeb849811ced4719e7cdd901eec1f2625ef54ef Mon Sep 17 00:00:00 2001 From: Mitchell Skaggs Date: Wed, 31 Jan 2018 21:40:03 -0600 Subject: [PATCH 07/13] First pass of Spotless --- spotless.eclipseformat.xml | 2 +- spotless.license | 5 +- .../ArraysAsListSerializer.java | 164 +- .../kryoserializers/BitSetSerializer.java | 80 +- .../CollectionsEmptyListSerializer.java | 21 +- .../CollectionsEmptyMapSerializer.java | 21 +- .../CollectionsEmptySetSerializer.java | 21 +- .../CollectionsSingletonListSerializer.java | 43 +- .../CollectionsSingletonMapSerializer.java | 37 +- .../CollectionsSingletonSetSerializer.java | 26 +- ...eldSerializerReflectionFactorySupport.java | 34 +- .../CopyForIterateCollectionSerializer.java | 14 +- .../CopyForIterateMapSerializer.java | 31 +- .../kryoserializers/DateSerializer.java | 68 +- .../kryoserializers/EnumMapSerializer.java | 139 +- .../kryoserializers/EnumSetSerializer.java | 89 +- .../FieldAnnotationAwareSerializer.java | 322 ++-- .../GregorianCalendarSerializer.java | 100 +- .../kryoserializers/JdkProxySerializer.java | 52 +- .../KryoReflectionFactorySupport.java | 146 +- .../kryoserializers/RegexSerializer.java | 46 +- .../kryoserializers/SubListSerializers.java | 438 ++--- .../SynchronizedCollectionsSerializer.java | 298 +-- .../kryoserializers/URISerializer.java | 38 +- .../kryoserializers/UUIDSerializer.java | 39 +- .../UnicodeBlockSerializer.java | 117 +- .../UnmodifiableCollectionsSerializer.java | 313 ++-- .../cglib/CGLibProxySerializer.java | 72 +- .../kryoserializers/dexx/ListSerializer.java | 107 +- .../kryoserializers/dexx/MapSerializer.java | 129 +- .../kryoserializers/dexx/SetSerializer.java | 107 +- .../guava/ArrayListMultimapSerializer.java | 75 +- .../guava/HashMultimapSerializer.java | 75 +- .../guava/ImmutableListSerializer.java | 130 +- .../guava/ImmutableMapSerializer.java | 103 +- .../guava/ImmutableMultimapSerializer.java | 185 +- .../guava/ImmutableSetSerializer.java | 120 +- .../guava/ImmutableSortedMapSerializer.java | 149 +- .../guava/ImmutableSortedSetSerializer.java | 113 +- .../guava/LinkedHashMultimapSerializer.java | 75 +- .../guava/LinkedListMultimapSerializer.java | 75 +- .../guava/MultimapSerializerBase.java | 58 +- .../guava/ReverseListSerializer.java | 120 +- .../guava/TreeMultimapSerializer.java | 77 +- .../UnmodifiableNavigableSetSerializer.java | 128 +- .../jodatime/IdentifiableChronology.java | 168 +- .../jodatime/JodaDateTimeSerializer.java | 72 +- .../jodatime/JodaIntervalSerializer.java | 63 +- .../jodatime/JodaLocalDateSerializer.java | 54 +- .../jodatime/JodaLocalDateTimeSerializer.java | 65 +- .../jodatime/JodaLocalTimeSerializer.java | 63 +- .../protobuf/ProtobufSerializer.java | 139 +- .../wicket/MiniMapSerializer.java | 89 +- .../EnumMapSerializerTest.java | 84 +- .../FieldAnnotationAwareSerializerTest.java | 179 +- .../javakaffee/kryoserializers/KryoTest.java | 1654 ++++++++--------- .../SubListSerializersTest.java | 290 +-- .../kryoserializers/TestClasses.java | 1524 ++++++++------- .../UnicodeBlockSerializerTest.java | 98 +- .../cglib/CGLibProxySerializerTest.java | 453 +++-- .../cglib/CustomClassLoader.java | 186 +- .../dexx/ListSerializerTest.java | 144 +- .../dexx/MapSerializerTest.java | 107 +- .../dexx/SetSerializerTest.java | 105 +- .../ArrayListMultimapSerializerTest.java | 55 +- .../guava/HashMultimapSerializerTest.java | 55 +- .../guava/ImmutableListSerializerTest.java | 265 +-- .../guava/ImmutableMapSerializerTest.java | 181 +- .../ImmutableMultimapSerializerTest.java | 411 ++-- .../guava/ImmutableSetSerializerTest.java | 158 +- .../ImmutableSortedMapSerializerTest.java | 200 +- .../ImmutableSortedSetSerializerTest.java | 181 +- .../LinkedHashMultimapSerializerTest.java | 55 +- .../LinkedListMultimapSerializerTest.java | 55 +- .../guava/MultimapSerializerTestBase.java | 129 +- .../guava/ReverseListSerializerTest.java | 230 +-- .../guava/TreeMultimapSerializerTest.java | 55 +- ...nmodifiableNavigableSetSerializerTest.java | 368 ++-- .../jodatime/JodaDateTimeSerializerTest.java | 48 +- .../jodatime/JodaIntervalSerializerTest.java | 50 +- .../jodatime/JodaLocalDateSerializerTest.java | 46 +- .../JodaLocalDateTimeSerializerTest.java | 46 +- .../jodatime/JodaLocalTimeSerializerTest.java | 69 +- .../protobuf/ProtobufSerializerTest.java | 366 ++-- .../protobuf/SampleProtoAOuterClass.java | 1249 +++++++------ .../protobuf/SampleProtoBOuterClass.java | 1617 ++++++++-------- .../wicket/MiniMapSerializerTest.java | 110 +- .../kryoserializers/wicket/WicketTest.java | 158 +- 88 files changed, 8546 insertions(+), 7750 deletions(-) diff --git a/spotless.eclipseformat.xml b/spotless.eclipseformat.xml index 3813821e..ecfc4323 100644 --- a/spotless.eclipseformat.xml +++ b/spotless.eclipseformat.xml @@ -30,7 +30,7 @@ - + diff --git a/spotless.license b/spotless.license index a99e6520..6efa9db8 100644 --- a/spotless.license +++ b/spotless.license @@ -1,5 +1,5 @@ /* - * Copyright 2010 Martin Grotzke + * Copyright $YEAR Martin Grotzke * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -12,4 +12,5 @@ * 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. - */ \ No newline at end of file + * + */ diff --git a/src/main/java/de/javakaffee/kryoserializers/ArraysAsListSerializer.java b/src/main/java/de/javakaffee/kryoserializers/ArraysAsListSerializer.java index 180f9fa3..8867fe01 100644 --- a/src/main/java/de/javakaffee/kryoserializers/ArraysAsListSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/ArraysAsListSerializer.java @@ -16,16 +16,16 @@ */ package de.javakaffee.kryoserializers; -import com.esotericsoftware.kryo.Kryo; -import com.esotericsoftware.kryo.Serializer; -import com.esotericsoftware.kryo.io.Input; -import com.esotericsoftware.kryo.io.Output; - import java.lang.reflect.Array; import java.lang.reflect.Field; import java.util.Arrays; import java.util.List; +import com.esotericsoftware.kryo.Kryo; +import com.esotericsoftware.kryo.Serializer; +import com.esotericsoftware.kryo.io.Input; +import com.esotericsoftware.kryo.io.Output; + /** * A kryo {@link Serializer} for lists created via {@link Arrays#asList(Object...)}. *

    @@ -37,86 +37,86 @@ */ public class ArraysAsListSerializer extends Serializer> { - private Field _arrayField; + private Field _arrayField; - public ArraysAsListSerializer() { - try { - _arrayField = Class.forName( "java.util.Arrays$ArrayList" ).getDeclaredField( "a" ); - _arrayField.setAccessible( true ); - } catch ( final Exception e ) { - throw new RuntimeException( e ); - } - } + public ArraysAsListSerializer() { + try { + _arrayField = Class.forName("java.util.Arrays$ArrayList").getDeclaredField("a"); + _arrayField.setAccessible(true); + } catch (final Exception e) { + throw new RuntimeException(e); + } + } - @Override - public List read(final Kryo kryo, final Input input, final Class> type) { - final int length = input.readInt(true); - Class componentType = kryo.readClass( input ).getType(); - if (componentType.isPrimitive()) { - componentType = getPrimitiveWrapperClass(componentType); - } - try { - final Object items = Array.newInstance( componentType, length ); - for( int i = 0; i < length; i++ ) { - Array.set(items, i, kryo.readClassAndObject( input )); - } - return Arrays.asList( (Object[])items ); - } catch ( final Exception e ) { - throw new RuntimeException( e ); - } - } + @Override + public List read(final Kryo kryo, final Input input, final Class> type) { + final int length = input.readInt(true); + Class componentType = kryo.readClass(input).getType(); + if (componentType.isPrimitive()) { + componentType = getPrimitiveWrapperClass(componentType); + } + try { + final Object items = Array.newInstance(componentType, length); + for (int i = 0; i < length; i++) { + Array.set(items, i, kryo.readClassAndObject(input)); + } + return Arrays.asList((Object[]) items); + } catch (final Exception e) { + throw new RuntimeException(e); + } + } - @Override - public void write(final Kryo kryo, final Output output, final List obj) { - try { - final Object[] array = (Object[]) _arrayField.get( obj ); - output.writeInt(array.length, true); - final Class componentType = array.getClass().getComponentType(); - kryo.writeClass( output, componentType ); - for( final Object item : array ) { - kryo.writeClassAndObject( output, item ); - } - } catch ( final RuntimeException e ) { - // Don't eat and wrap RuntimeExceptions because the ObjectBuffer.write... - // handles SerializationException specifically (resizing the buffer)... - throw e; - } catch ( final Exception e ) { - throw new RuntimeException( e ); - } - } + @Override + public void write(final Kryo kryo, final Output output, final List obj) { + try { + final Object[] array = (Object[]) _arrayField.get(obj); + output.writeInt(array.length, true); + final Class componentType = array.getClass().getComponentType(); + kryo.writeClass(output, componentType); + for (final Object item : array) { + kryo.writeClassAndObject(output, item); + } + } catch (final RuntimeException e) { + // Don't eat and wrap RuntimeExceptions because the ObjectBuffer.write... + // handles SerializationException specifically (resizing the buffer)... + throw e; + } catch (final Exception e) { + throw new RuntimeException(e); + } + } - @Override - public List copy(Kryo kryo, List original) { - try { - final Object[] array = (Object[]) _arrayField.get(original); - kryo.reference(array); - Object[] arrayCopy = kryo.copy(array); - return Arrays.asList(arrayCopy); - } catch (final Exception e) { - throw new RuntimeException(e); - } - } + @Override + public List copy(Kryo kryo, List original) { + try { + final Object[] array = (Object[]) _arrayField.get(original); + kryo.reference(array); + Object[] arrayCopy = kryo.copy(array); + return Arrays.asList(arrayCopy); + } catch (final Exception e) { + throw new RuntimeException(e); + } + } - private static Class getPrimitiveWrapperClass(final Class c) { - if (c.isPrimitive()) { - if (c.equals(Long.TYPE)) { - return Long.class; - } else if (c.equals(Integer.TYPE)) { - return Integer.class; - } else if (c.equals(Double.TYPE)) { - return Double.class; - } else if (c.equals(Float.TYPE)) { - return Float.class; - } else if (c.equals(Boolean.TYPE)) { - return Boolean.class; - } else if (c.equals(Character.TYPE)) { - return Character.class; - } else if (c.equals(Short.TYPE)) { - return Short.class; - } else if (c.equals(Byte.TYPE)) { - return Byte.class; - } - } - return c; - } + private static Class getPrimitiveWrapperClass(final Class c) { + if (c.isPrimitive()) { + if (c.equals(Long.TYPE)) { + return Long.class; + } else if (c.equals(Integer.TYPE)) { + return Integer.class; + } else if (c.equals(Double.TYPE)) { + return Double.class; + } else if (c.equals(Float.TYPE)) { + return Float.class; + } else if (c.equals(Boolean.TYPE)) { + return Boolean.class; + } else if (c.equals(Character.TYPE)) { + return Character.class; + } else if (c.equals(Short.TYPE)) { + return Short.class; + } else if (c.equals(Byte.TYPE)) { + return Byte.class; + } + } + return c; + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/BitSetSerializer.java b/src/main/java/de/javakaffee/kryoserializers/BitSetSerializer.java index ccfed98b..5f08db96 100644 --- a/src/main/java/de/javakaffee/kryoserializers/BitSetSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/BitSetSerializer.java @@ -1,3 +1,19 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers; import java.util.BitSet; @@ -9,36 +25,36 @@ public class BitSetSerializer extends Serializer { - @Override - public BitSet copy(final Kryo kryo, final BitSet original) { - final BitSet result = new BitSet(); - final int length = original.length(); - for(int i = 0; i < length; i++) { - result.set(i, original.get(i)); - } - return result; - } - - @Override - public void write(final Kryo kryo, final Output output, final BitSet bitSet) { - final int len = bitSet.length(); - - output.writeInt(len, true); - - for(int i = 0; i < len; i++) { - output.writeBoolean(bitSet.get(i)); - } - } - - @Override - public BitSet read(final Kryo kryo, final Input input, final Class bitSetClass) { - final int len = input.readInt(true); - final BitSet ret = new BitSet(len); - - for(int i = 0; i < len; i++) { - ret.set(i, input.readBoolean()); - } - - return ret; - } + @Override + public BitSet copy(final Kryo kryo, final BitSet original) { + final BitSet result = new BitSet(); + final int length = original.length(); + for (int i = 0; i < length; i++) { + result.set(i, original.get(i)); + } + return result; + } + + @Override + public void write(final Kryo kryo, final Output output, final BitSet bitSet) { + final int len = bitSet.length(); + + output.writeInt(len, true); + + for (int i = 0; i < len; i++) { + output.writeBoolean(bitSet.get(i)); + } + } + + @Override + public BitSet read(final Kryo kryo, final Input input, final Class bitSetClass) { + final int len = input.readInt(true); + final BitSet ret = new BitSet(len); + + for (int i = 0; i < len; i++) { + ret.set(i, input.readBoolean()); + } + + return ret; + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/CollectionsEmptyListSerializer.java b/src/main/java/de/javakaffee/kryoserializers/CollectionsEmptyListSerializer.java index 28ef37f9..e79f069e 100644 --- a/src/main/java/de/javakaffee/kryoserializers/CollectionsEmptyListSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/CollectionsEmptyListSerializer.java @@ -27,21 +27,20 @@ /** * A kryo {@link Serializer} for {@link List}s created via {@link Collections#emptyList()} * or that were just assigned the {@link Collections#EMPTY_LIST}. - * + * * @author Martin Grotzke */ public class CollectionsEmptyListSerializer extends Serializer> { - public CollectionsEmptyListSerializer() { - setImmutable(true); - } + public CollectionsEmptyListSerializer() { + setImmutable(true); + } - @Override - public List read(final Kryo kryo, final Input input, final Class> type) { - return Collections.EMPTY_LIST; - } + @Override + public List read(final Kryo kryo, final Input input, final Class> type) { + return Collections.EMPTY_LIST; + } - @Override - public void write(final Kryo kryo, final Output output, final List object) { - } + @Override + public void write(final Kryo kryo, final Output output, final List object) {} } diff --git a/src/main/java/de/javakaffee/kryoserializers/CollectionsEmptyMapSerializer.java b/src/main/java/de/javakaffee/kryoserializers/CollectionsEmptyMapSerializer.java index 1a121103..99129fe6 100644 --- a/src/main/java/de/javakaffee/kryoserializers/CollectionsEmptyMapSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/CollectionsEmptyMapSerializer.java @@ -27,21 +27,20 @@ /** * A kryo {@link Serializer} for {@link Map}s created via {@link Collections#emptyMap()} * or that were just assigned the {@link Collections#EMPTY_MAP}. - * + * * @author Martin Grotzke */ public class CollectionsEmptyMapSerializer extends Serializer> { - public CollectionsEmptyMapSerializer() { - setImmutable(true); - } + public CollectionsEmptyMapSerializer() { + setImmutable(true); + } - @Override - public Map read(final Kryo kryo, final Input input, final Class> type) { - return Collections.EMPTY_MAP; - } + @Override + public Map read(final Kryo kryo, final Input input, final Class> type) { + return Collections.EMPTY_MAP; + } - @Override - public void write(final Kryo kryo, final Output output, final Map object) { - } + @Override + public void write(final Kryo kryo, final Output output, final Map object) {} } diff --git a/src/main/java/de/javakaffee/kryoserializers/CollectionsEmptySetSerializer.java b/src/main/java/de/javakaffee/kryoserializers/CollectionsEmptySetSerializer.java index 77003075..c9a14397 100644 --- a/src/main/java/de/javakaffee/kryoserializers/CollectionsEmptySetSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/CollectionsEmptySetSerializer.java @@ -28,21 +28,20 @@ /** * A kryo {@link Serializer} for {@link Map}s created via {@link Collections#emptySet()} * or that were just assigned the {@link Collections#EMPTY_SET}. - * + * * @author Martin Grotzke */ public class CollectionsEmptySetSerializer extends Serializer> { - public CollectionsEmptySetSerializer() { - setImmutable(true); - } + public CollectionsEmptySetSerializer() { + setImmutable(true); + } - @Override - public Set read(final Kryo kryo, final Input input, final Class> type) { - return Collections.EMPTY_SET; - } + @Override + public Set read(final Kryo kryo, final Input input, final Class> type) { + return Collections.EMPTY_SET; + } - @Override - public void write(final Kryo kryo, final Output output, final Set object) { - } + @Override + public void write(final Kryo kryo, final Output output, final Set object) {} } diff --git a/src/main/java/de/javakaffee/kryoserializers/CollectionsSingletonListSerializer.java b/src/main/java/de/javakaffee/kryoserializers/CollectionsSingletonListSerializer.java index 188afd56..653ad26e 100644 --- a/src/main/java/de/javakaffee/kryoserializers/CollectionsSingletonListSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/CollectionsSingletonListSerializer.java @@ -16,44 +16,43 @@ */ package de.javakaffee.kryoserializers; +import java.util.Collections; +import java.util.List; + import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.Serializer; import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output; -import java.util.Collections; -import java.util.List; - /** * A kryo {@link Serializer} for {@link List}s created via {@link Collections#singletonList(Object)}. *

    * Note: This serializer does not support cyclic references, if a serialized object * is part of a cycle this might cause an error during deserialization. *

    - * + * * @author Martin Grotzke */ public class CollectionsSingletonListSerializer extends Serializer> { - public CollectionsSingletonListSerializer() { - } + public CollectionsSingletonListSerializer() {} - @Override - public List read(final Kryo kryo, final Input input, final Class> type) { - final Object obj = kryo.readClassAndObject( input ); - return Collections.singletonList( obj ); - } + @Override + public List read(final Kryo kryo, final Input input, final Class> type) { + final Object obj = kryo.readClassAndObject(input); + return Collections.singletonList(obj); + } - @Override - public void write(final Kryo kryo, final Output output, final List list) { - kryo.writeClassAndObject(output, list.get( 0 )); - } + @Override + public void write(final Kryo kryo, final Output output, final List list) { + kryo.writeClassAndObject(output, list.get(0)); + } - @Override - public List copy(Kryo kryo, List original) { - Object singleton = original.get(0); - kryo.reference(singleton); - Object newSingleton = kryo.copy(singleton); - return Collections.singletonList(newSingleton); - } + @Override + public List copy(Kryo kryo, List original) { + Object singleton = original.get(0); + kryo.reference(singleton); + Object newSingleton = kryo.copy(singleton); + return Collections.singletonList(newSingleton); + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/CollectionsSingletonMapSerializer.java b/src/main/java/de/javakaffee/kryoserializers/CollectionsSingletonMapSerializer.java index 02de1b06..1722228b 100644 --- a/src/main/java/de/javakaffee/kryoserializers/CollectionsSingletonMapSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/CollectionsSingletonMapSerializer.java @@ -32,28 +32,27 @@ * Note: This serializer does not support cyclic references, if a serialized object * is part of a cycle this might cause an error during deserialization. *

    - * + * * @author Martin Grotzke */ public class CollectionsSingletonMapSerializer extends Serializer> { - public CollectionsSingletonMapSerializer() { - setImmutable(true); - } - - @Override - public Map read(final Kryo kryo, final Input input, final Class> type) { - final Object key = kryo.readClassAndObject( input ); - final Object value = kryo.readClassAndObject( input ); - return Collections.singletonMap( key, value ); - } - - @Override - public void write(final Kryo kryo, final Output output, final Map map) { - final Entry entry = map.entrySet().iterator().next(); - kryo.writeClassAndObject( output, entry.getKey() ); - kryo.writeClassAndObject( output, entry.getValue() ); - } - + public CollectionsSingletonMapSerializer() { + setImmutable(true); + } + + @Override + public Map read(final Kryo kryo, final Input input, final Class> type) { + final Object key = kryo.readClassAndObject(input); + final Object value = kryo.readClassAndObject(input); + return Collections.singletonMap(key, value); + } + + @Override + public void write(final Kryo kryo, final Output output, final Map map) { + final Entry entry = map.entrySet().iterator().next(); + kryo.writeClassAndObject(output, entry.getKey()); + kryo.writeClassAndObject(output, entry.getValue()); + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/CollectionsSingletonSetSerializer.java b/src/main/java/de/javakaffee/kryoserializers/CollectionsSingletonSetSerializer.java index d18cca75..60793b72 100644 --- a/src/main/java/de/javakaffee/kryoserializers/CollectionsSingletonSetSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/CollectionsSingletonSetSerializer.java @@ -31,23 +31,23 @@ * Note: This serializer does not support cyclic references, if a serialized object * is part of a cycle this might cause an error during deserialization. *

    - * + * * @author Martin Grotzke */ public class CollectionsSingletonSetSerializer extends Serializer> { - public CollectionsSingletonSetSerializer() { - setImmutable(true); - } + public CollectionsSingletonSetSerializer() { + setImmutable(true); + } - @Override - public Set read(final Kryo kryo, final Input input, final Class> type) { - final Object obj = kryo.readClassAndObject( input ); - return Collections.singleton( obj ); - } + @Override + public Set read(final Kryo kryo, final Input input, final Class> type) { + final Object obj = kryo.readClassAndObject(input); + return Collections.singleton(obj); + } - @Override - public void write(final Kryo kryo, final Output output, final Set set) { - kryo.writeClassAndObject( output, set.iterator().next() ); - } + @Override + public void write(final Kryo kryo, final Output output, final Set set) { + kryo.writeClassAndObject(output, set.iterator().next()); + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/CompatibleFieldSerializerReflectionFactorySupport.java b/src/main/java/de/javakaffee/kryoserializers/CompatibleFieldSerializerReflectionFactorySupport.java index 5d7b1671..316e071e 100644 --- a/src/main/java/de/javakaffee/kryoserializers/CompatibleFieldSerializerReflectionFactorySupport.java +++ b/src/main/java/de/javakaffee/kryoserializers/CompatibleFieldSerializerReflectionFactorySupport.java @@ -24,25 +24,25 @@ * A {@link CompatibleFieldSerializer} specialization that uses sun's {@link sun.reflect.ReflectionFactory} to create * new instances for classes without a default constructor (via reuse of * {@link KryoReflectionFactorySupport#newInstanceFromReflectionFactory(Class)}). - * + * * @author Martin Grotzke */ @SuppressWarnings("restriction") public class CompatibleFieldSerializerReflectionFactorySupport extends CompatibleFieldSerializer { - /** - * Creates a new instance. - * @param kryo the kryo instance that is passed to {@link CompatibleFieldSerializer#CompatibleFieldSerializer(Kryo, Class)}. - * @param type the type to serialize. - */ - public CompatibleFieldSerializerReflectionFactorySupport(final Kryo kryo, final Class type) { - super( kryo, type ); - } - - @SuppressWarnings("unchecked") - @Override - public Object create(final Kryo kryo, final Input input, @SuppressWarnings("rawtypes") final Class type) { - return KryoReflectionFactorySupport.newInstanceFromReflectionFactory( type ); - } - -} \ No newline at end of file + /** + * Creates a new instance. + * @param kryo the kryo instance that is passed to {@link CompatibleFieldSerializer#CompatibleFieldSerializer(Kryo, Class)}. + * @param type the type to serialize. + */ + public CompatibleFieldSerializerReflectionFactorySupport(final Kryo kryo, final Class type) { + super(kryo, type); + } + + @SuppressWarnings("unchecked") + @Override + public Object create(final Kryo kryo, final Input input, @SuppressWarnings("rawtypes") final Class type) { + return KryoReflectionFactorySupport.newInstanceFromReflectionFactory(type); + } + +} diff --git a/src/main/java/de/javakaffee/kryoserializers/CopyForIterateCollectionSerializer.java b/src/main/java/de/javakaffee/kryoserializers/CopyForIterateCollectionSerializer.java index b2575822..7167c336 100644 --- a/src/main/java/de/javakaffee/kryoserializers/CopyForIterateCollectionSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/CopyForIterateCollectionSerializer.java @@ -32,15 +32,15 @@ * of concurrent modification exceptions, as even during taking the copy the * collection might be modified by another thread. *

    - * + * * @author Martin Grotzke */ public class CopyForIterateCollectionSerializer extends CollectionSerializer { - - @SuppressWarnings("unchecked") - @Override - public void write( final Kryo kryo, final Output output, @SuppressWarnings("rawtypes") final Collection object ) { - super.write( kryo, output, new ArrayList(object)); - } + + @SuppressWarnings("unchecked") + @Override + public void write(final Kryo kryo, final Output output, @SuppressWarnings("rawtypes") final Collection object) { + super.write(kryo, output, new ArrayList(object)); + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/CopyForIterateMapSerializer.java b/src/main/java/de/javakaffee/kryoserializers/CopyForIterateMapSerializer.java index 06474ad4..42f7c0c4 100644 --- a/src/main/java/de/javakaffee/kryoserializers/CopyForIterateMapSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/CopyForIterateMapSerializer.java @@ -33,24 +33,23 @@ * of concurrent modification exceptions, as even during taking the copy the * map might be modified by another thread. *

    - * + * * @author Martin Grotzke */ public class CopyForIterateMapSerializer extends MapSerializer { - - @SuppressWarnings("unchecked") - @Override - public void write( final Kryo kryo, final Output output, @SuppressWarnings("rawtypes") final Map object ) { - final Map map; - // we only need special support for linked hash map, as SortedMaps will - // recreate correct sorting during deserialization... - if ( object instanceof LinkedHashMap ) { - map = new LinkedHashMap( object ); - } - else { - map = new HashMap( object ); - } - super.write( kryo, output, map ); - } + + @SuppressWarnings("unchecked") + @Override + public void write(final Kryo kryo, final Output output, @SuppressWarnings("rawtypes") final Map object) { + final Map map; + // we only need special support for linked hash map, as SortedMaps will + // recreate correct sorting during deserialization... + if (object instanceof LinkedHashMap) { + map = new LinkedHashMap(object); + } else { + map = new HashMap(object); + } + super.write(kryo, output, map); + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/DateSerializer.java b/src/main/java/de/javakaffee/kryoserializers/DateSerializer.java index 730f0014..147f21ba 100644 --- a/src/main/java/de/javakaffee/kryoserializers/DateSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/DateSerializer.java @@ -16,14 +16,14 @@ */ package de.javakaffee.kryoserializers; +import java.lang.reflect.Constructor; +import java.util.Date; + import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.Serializer; import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output; -import java.lang.reflect.Constructor; -import java.util.Date; - /** * A kryo {@link Serializer} for {@link Date} and subclasses. Must be registered like this: *
    @@ -36,44 +36,44 @@
      *     }
      * };
      * 
    - * + * * @author Martin Grotzke */ public class DateSerializer extends Serializer { - private final Constructor _constructor; + private final Constructor _constructor; - public DateSerializer(final Class clazz) { - try { - _constructor = clazz.getConstructor(long.class); - } catch ( final Exception e ) { - throw new RuntimeException( e ); - } - } + public DateSerializer(final Class clazz) { + try { + _constructor = clazz.getConstructor(long.class); + } catch (final Exception e) { + throw new RuntimeException(e); + } + } - /** - * {@inheritDoc} - */ - @Override - public Date read(final Kryo kryo, final Input input, final Class type) { - try { - return _constructor.newInstance(input.readLong(true)); - } catch (final Exception e) { - throw new RuntimeException( e ); - } - } + /** + * {@inheritDoc} + */ + @Override + public Date read(final Kryo kryo, final Input input, final Class type) { + try { + return _constructor.newInstance(input.readLong(true)); + } catch (final Exception e) { + throw new RuntimeException(e); + } + } - /** - * {@inheritDoc} - */ - @Override - public void write(final Kryo kryo, final Output output, final Date obj) { - output.writeLong(obj.getTime(), true); - } + /** + * {@inheritDoc} + */ + @Override + public void write(final Kryo kryo, final Output output, final Date obj) { + output.writeLong(obj.getTime(), true); + } - @Override - public Date copy(final Kryo kryo, final Date original) { - return (Date) original.clone(); - } + @Override + public Date copy(final Kryo kryo, final Date original) { + return (Date) original.clone(); + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/EnumMapSerializer.java b/src/main/java/de/javakaffee/kryoserializers/EnumMapSerializer.java index d5410c22..4bc2c857 100644 --- a/src/main/java/de/javakaffee/kryoserializers/EnumMapSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/EnumMapSerializer.java @@ -30,81 +30,82 @@ /** * A serializer for {@link EnumMap}s. - * + * * @author Martin Grotzke */ public class EnumMapSerializer extends Serializer, ?>> { - - private static final Field TYPE_FIELD; - - static { - try { - TYPE_FIELD = EnumMap.class.getDeclaredField( "keyType" ); - TYPE_FIELD.setAccessible( true ); - } catch ( final Exception e ) { - throw new RuntimeException( "The EnumMap class seems to have changed, could not access expected field.", e ); - } - } - // Workaround reference reading, this should be removed sometimes. See also - // https://groups.google.com/d/msg/kryo-users/Eu5V4bxCfws/k-8UQ22y59AJ - private static final Object FAKE_REFERENCE = new Object(); + private static final Field TYPE_FIELD; + + static { + try { + TYPE_FIELD = EnumMap.class.getDeclaredField("keyType"); + TYPE_FIELD.setAccessible(true); + } catch (final Exception e) { + throw new RuntimeException("The EnumMap class seems to have changed, could not access expected field.", e); + } + } + + // Workaround reference reading, this should be removed sometimes. See also + // https://groups.google.com/d/msg/kryo-users/Eu5V4bxCfws/k-8UQ22y59AJ + private static final Object FAKE_REFERENCE = new Object(); + + @Override + @SuppressWarnings({"unchecked", "rawtypes"}) + public EnumMap, ?> copy(final Kryo kryo, final EnumMap, ?> original) { + // Make a shallow copy to copy the private key type of the original map without using reflection. + // This will work for empty original maps as well. + final EnumMap copy = new EnumMap(original); + for (final Map.Entry entry : original.entrySet()) { + copy.put((Enum) entry.getKey(), kryo.copy(entry.getValue())); + } + return copy; + } - @Override - @SuppressWarnings({"unchecked", "rawtypes"}) - public EnumMap, ?> copy(final Kryo kryo, final EnumMap, ?> original) { - // Make a shallow copy to copy the private key type of the original map without using reflection. - // This will work for empty original maps as well. - final EnumMap copy = new EnumMap(original); - for (final Map.Entry entry : original.entrySet()) { - copy.put((Enum)entry.getKey(), kryo.copy(entry.getValue())); - } - return copy; - } + @SuppressWarnings({"unchecked", "rawtypes"}) + private EnumMap, ?> create(final Kryo kryo, final Input input, + final Class, ?>> type) { + final Class> keyType = kryo.readClass(input).getType(); + return new EnumMap(keyType); + } - @SuppressWarnings( { "unchecked", "rawtypes" } ) - private EnumMap, ?> create(final Kryo kryo, final Input input, - final Class, ?>> type) { - final Class> keyType = kryo.readClass( input ).getType(); - return new EnumMap( keyType ); - } - - @Override - @SuppressWarnings({ "rawtypes", "unchecked" }) - public EnumMap, ?> read(final Kryo kryo, final Input input, - final Class, ?>> type) { - kryo.reference(FAKE_REFERENCE); - final EnumMap, ?> result = create(kryo, input, type); - final Class> keyType = getKeyType( result ); - final Enum[] enumConstants = keyType.getEnumConstants(); - final EnumMap rawResult = result; - final int size = input.readInt(true); - for ( int i = 0; i < size; i++ ) { - final int ordinal = input.readInt(true); - final Enum key = enumConstants[ordinal]; - final Object value = kryo.readClassAndObject( input ); - rawResult.put( key, value ); - } - return result; - } + @Override + @SuppressWarnings({"rawtypes", "unchecked"}) + public EnumMap, ?> read(final Kryo kryo, final Input input, + final Class, ?>> type) { + kryo.reference(FAKE_REFERENCE); + final EnumMap, ?> result = create(kryo, input, type); + final Class> keyType = getKeyType(result); + final Enum[] enumConstants = keyType.getEnumConstants(); + final EnumMap rawResult = result; + final int size = input.readInt(true); + for (int i = 0; i < size; i++) { + final int ordinal = input.readInt(true); + final Enum key = enumConstants[ordinal]; + final Object value = kryo.readClassAndObject(input); + rawResult.put(key, value); + } + return result; + } - @Override - public void write(final Kryo kryo, final Output output, final EnumMap, ?> map) { - kryo.writeClass( output, getKeyType( map ) ); - output.writeInt(map.size(), true); - for ( final Map.Entry,?> entry : map.entrySet() ) { - output.writeInt(entry.getKey().ordinal(), true); - kryo.writeClassAndObject(output, entry.getValue()); - } - if ( TRACE ) trace( "kryo", "Wrote EnumMap: " + map ); - } + @Override + public void write(final Kryo kryo, final Output output, final EnumMap, ?> map) { + kryo.writeClass(output, getKeyType(map)); + output.writeInt(map.size(), true); + for (final Map.Entry, ?> entry : map.entrySet()) { + output.writeInt(entry.getKey().ordinal(), true); + kryo.writeClassAndObject(output, entry.getValue()); + } + if (TRACE) + trace("kryo", "Wrote EnumMap: " + map); + } - @SuppressWarnings("unchecked") - private Class> getKeyType( final EnumMap map ) { - try { - return (Class>)TYPE_FIELD.get( map ); - } catch ( final Exception e ) { - throw new RuntimeException( "Could not access keys field.", e ); - } - } + @SuppressWarnings("unchecked") + private Class> getKeyType(final EnumMap map) { + try { + return (Class>) TYPE_FIELD.get(map); + } catch (final Exception e) { + throw new RuntimeException("Could not access keys field.", e); + } + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/EnumSetSerializer.java b/src/main/java/de/javakaffee/kryoserializers/EnumSetSerializer.java index deda81d6..c0e2054f 100644 --- a/src/main/java/de/javakaffee/kryoserializers/EnumSetSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/EnumSetSerializer.java @@ -29,56 +29,57 @@ /** * A serializer for {@link EnumSet}s. - * + * * @author Martin Grotzke */ -@SuppressWarnings( { "unchecked", "rawtypes" } ) +@SuppressWarnings({"unchecked", "rawtypes"}) public class EnumSetSerializer extends Serializer>> { - - private static final Field TYPE_FIELD; - - static { - try { - TYPE_FIELD = EnumSet.class.getDeclaredField( "elementType" ); - TYPE_FIELD.setAccessible( true ); - } catch ( final Exception e ) { - throw new RuntimeException( "The EnumSet class seems to have changed, could not access expected field.", e ); - } - } - @Override - public EnumSet> copy (final Kryo kryo, final EnumSet> original) { - return original.clone(); - } + private static final Field TYPE_FIELD; + + static { + try { + TYPE_FIELD = EnumSet.class.getDeclaredField("elementType"); + TYPE_FIELD.setAccessible(true); + } catch (final Exception e) { + throw new RuntimeException("The EnumSet class seems to have changed, could not access expected field.", e); + } + } + + @Override + public EnumSet> copy(final Kryo kryo, final EnumSet> original) { + return original.clone(); + } - @Override - public EnumSet read(final Kryo kryo, final Input input, final Class>> type) { - final Class elementType = kryo.readClass( input ).getType(); - final EnumSet result = EnumSet.noneOf( elementType ); - final int size = input.readInt(true); - final Enum[] enumConstants = elementType.getEnumConstants(); - for ( int i = 0; i < size; i++ ) { - result.add( enumConstants[input.readInt(true)] ); - } - return result; - } + @Override + public EnumSet read(final Kryo kryo, final Input input, final Class>> type) { + final Class elementType = kryo.readClass(input).getType(); + final EnumSet result = EnumSet.noneOf(elementType); + final int size = input.readInt(true); + final Enum[] enumConstants = elementType.getEnumConstants(); + for (int i = 0; i < size; i++) { + result.add(enumConstants[input.readInt(true)]); + } + return result; + } - @Override - public void write(final Kryo kryo, final Output output, final EnumSet> set) { - kryo.writeClass( output, getElementType( set ) ); - output.writeInt( set.size(), true ); - for (final Enum item : set) { - output.writeInt(item.ordinal(), true); - } + @Override + public void write(final Kryo kryo, final Output output, final EnumSet> set) { + kryo.writeClass(output, getElementType(set)); + output.writeInt(set.size(), true); + for (final Enum item : set) { + output.writeInt(item.ordinal(), true); + } - if ( TRACE ) trace( "kryo", "Wrote EnumSet: " + set ); - } + if (TRACE) + trace("kryo", "Wrote EnumSet: " + set); + } - private Class> getElementType( final EnumSet> set ) { - try { - return (Class)TYPE_FIELD.get( set ); - } catch ( final Exception e ) { - throw new RuntimeException( "Could not access keys field.", e ); - } - } + private Class> getElementType(final EnumSet> set) { + try { + return (Class) TYPE_FIELD.get(set); + } catch (final Exception e) { + throw new RuntimeException("Could not access keys field.", e); + } + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/FieldAnnotationAwareSerializer.java b/src/main/java/de/javakaffee/kryoserializers/FieldAnnotationAwareSerializer.java index 7ab44d12..90718aad 100644 --- a/src/main/java/de/javakaffee/kryoserializers/FieldAnnotationAwareSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/FieldAnnotationAwareSerializer.java @@ -1,9 +1,23 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers; -import com.esotericsoftware.kryo.Kryo; -import com.esotericsoftware.kryo.Serializer; -import com.esotericsoftware.kryo.factories.SerializerFactory; -import com.esotericsoftware.kryo.serializers.FieldSerializer; +import static com.esotericsoftware.minlog.Log.TRACE; +import static com.esotericsoftware.minlog.Log.trace; import java.lang.annotation.Annotation; import java.lang.reflect.Field; @@ -11,8 +25,10 @@ import java.util.HashSet; import java.util.Set; -import static com.esotericsoftware.minlog.Log.TRACE; -import static com.esotericsoftware.minlog.Log.trace; +import com.esotericsoftware.kryo.Kryo; +import com.esotericsoftware.kryo.Serializer; +import com.esotericsoftware.kryo.factories.SerializerFactory; +import com.esotericsoftware.kryo.serializers.FieldSerializer; /** * A kryo {@link FieldSerializer} that allows to exclusively include or exclude fields that @@ -39,150 +55,150 @@ */ public class FieldAnnotationAwareSerializer extends FieldSerializer { - /** - * A factory for creating instances of {@link FieldAnnotationAwareSerializer}. - */ - public static class Factory implements SerializerFactory { - - private final Collection> marked; - private final boolean disregarding; - - /** - * Creates a new factory. See {@link FieldAnnotationAwareSerializer#FieldAnnotationAwareSerializer( - *com.esotericsoftware.kryo.Kryo, Class, java.util.Collection, boolean)} - * for additional information on the constructor parameters. - * - * @param marked The annotations that will be considered of the resulting converter. - * @param disregarding If {@code true}, the serializer will ignore all annotated fields, - * if set to {@code false} it will exclusively look at annotated fields. - */ - public Factory(final Collection> marked, final boolean disregarding) { - this.marked = marked; - this.disregarding = disregarding; - } - - @Override - public Serializer makeSerializer(final Kryo kryo, final Class type) { - return new FieldAnnotationAwareSerializer(kryo, type, marked, disregarding); - } - } - - private final Set> marked; - - /** - * Determines whether annotated fields should be excluded from serialization. - *

    - * {@code true} if annotated fields should be excluded from serialization, - * {@code false} if only annotated fields should be included from serialization. - */ - private final boolean disregarding; - - /** - * Creates a new field annotation aware serializer. - * - * @param kryo The {@link Kryo} instace. - * @param type The type of the class being serialized. - * @param marked The annotations this serializer considers for its serialization process. Be aware tha - * a serializer with {@code disregarding} set to {@code false} will never be able to - * serialize fields that are not annotated with any of these annotations since it is not - * possible to add fields to a {@link FieldSerializer} once it is created. See the - * documentation to {@link FieldAnnotationAwareSerializer#addAnnotation(Class)} and - * {@link FieldAnnotationAwareSerializer#removeAnnotation(Class)} for further information. - * @param disregarding If {@code true}, the serializer will ignore all annotated fields, - * if set to {@code false} it will exclusively look at annotated fields. - */ - public FieldAnnotationAwareSerializer(final Kryo kryo, - final Class type, - final Collection> marked, - final boolean disregarding) { - super(kryo, type); - this.disregarding = disregarding; - this.marked = new HashSet>(marked); - rebuildCachedFields(); - } - - @Override - protected void rebuildCachedFields() { - // In order to avoid rebuilding the cached fields twice, the super constructor's call - // to this method will be suppressed. This can be done by a simple check of the initialization - // state of a property of this subclass. - if (marked == null) { - return; - } - super.rebuildCachedFields(); - removeFields(); - } - - private void removeFields() { - final CachedField[] cachedFields = getFields(); - for (final CachedField cachedField : cachedFields) { - final Field field = cachedField.getField(); - if (isRemove(field)) { - if (TRACE) { - trace("kryo", String.format("Ignoring field %s tag: %s", disregarding ? "without" : "with", cachedField)); - } - super.removeField(field.getName()); - } - } - } - - private boolean isRemove(final Field field) { - return !isMarked(field) ^ disregarding; - } - - private boolean isMarked(final Field field) { - for (final Annotation annotation : field.getAnnotations()) { - final Class annotationType = annotation.annotationType(); - if (marked.contains(annotationType)) { - return true; - } - } - return false; - } - - /** - * Adds an annotation to the annotations that are considered by this serializer. - *

    - * Important: This will not have an effect if the serializer was configured - * to exclusively serialize annotated fields by setting {@code disregarding} to - * {@code false}. This is similar to the contract of this serializer's superclass - * {@link FieldSerializer} which does not allow to add fields that were formerly - * removed. If this was possible, instances that were serialized before this field - * was added could not longer be properly deserialized. In order to make this contract - * break explicit, you need to create a new instance of this serializer if you want to - * include new fields to a serializer that exclusively serializes annotated fields. - * - * @param clazz The annotation class to be added. - * @return {@code true} if the method call had an effect. - */ - public boolean addAnnotation(final Class clazz) { - if (disregarding && marked.add(clazz)) { - initializeCachedFields(); - return true; - } - return false; - } - - /** - * Removes an annotation to the annotations that are considered by this serializer. - *

    - * Important: This will not have an effect if the serializer was configured - * to not serialize annotated fields by setting {@code disregarding} to - * {@code true}. This is similar to the contract of this serializer's superclass - * {@link FieldSerializer} which does not allow to add fields that were formerly - * removed. If this was possible, instances that were serialized before this field - * was added could not longer be properly deserialized. In order to make this contract - * break explicit, you need to create a new instance of this serializer if you want to - * include new fields to a serializer that ignores annotated fields for serialization. - * - * @param clazz The annotation class to be removed. - * @return {@code true} if the method call had an effect. - */ - public boolean removeAnnotation(final Class clazz) { - if (!disregarding && marked.remove(clazz)) { - initializeCachedFields(); - return true; - } - return false; - } -} \ No newline at end of file + /** + * A factory for creating instances of {@link FieldAnnotationAwareSerializer}. + */ + public static class Factory implements SerializerFactory { + + private final Collection> marked; + private final boolean disregarding; + + /** + * Creates a new factory. See {@link FieldAnnotationAwareSerializer#FieldAnnotationAwareSerializer( + *com.esotericsoftware.kryo.Kryo, Class, java.util.Collection, boolean)} + * for additional information on the constructor parameters. + * + * @param marked The annotations that will be considered of the resulting converter. + * @param disregarding If {@code true}, the serializer will ignore all annotated fields, + * if set to {@code false} it will exclusively look at annotated fields. + */ + public Factory(final Collection> marked, final boolean disregarding) { + this.marked = marked; + this.disregarding = disregarding; + } + + @Override + public Serializer makeSerializer(final Kryo kryo, final Class type) { + return new FieldAnnotationAwareSerializer(kryo, type, marked, disregarding); + } + } + + private final Set> marked; + + /** + * Determines whether annotated fields should be excluded from serialization. + *

    + * {@code true} if annotated fields should be excluded from serialization, + * {@code false} if only annotated fields should be included from serialization. + */ + private final boolean disregarding; + + /** + * Creates a new field annotation aware serializer. + * + * @param kryo The {@link Kryo} instace. + * @param type The type of the class being serialized. + * @param marked The annotations this serializer considers for its serialization process. Be aware tha + * a serializer with {@code disregarding} set to {@code false} will never be able to + * serialize fields that are not annotated with any of these annotations since it is not + * possible to add fields to a {@link FieldSerializer} once it is created. See the + * documentation to {@link FieldAnnotationAwareSerializer#addAnnotation(Class)} and + * {@link FieldAnnotationAwareSerializer#removeAnnotation(Class)} for further information. + * @param disregarding If {@code true}, the serializer will ignore all annotated fields, + * if set to {@code false} it will exclusively look at annotated fields. + */ + public FieldAnnotationAwareSerializer(final Kryo kryo, + final Class type, + final Collection> marked, + final boolean disregarding) { + super(kryo, type); + this.disregarding = disregarding; + this.marked = new HashSet>(marked); + rebuildCachedFields(); + } + + @Override + protected void rebuildCachedFields() { + // In order to avoid rebuilding the cached fields twice, the super constructor's call + // to this method will be suppressed. This can be done by a simple check of the initialization + // state of a property of this subclass. + if (marked == null) { + return; + } + super.rebuildCachedFields(); + removeFields(); + } + + private void removeFields() { + final CachedField[] cachedFields = getFields(); + for (final CachedField cachedField : cachedFields) { + final Field field = cachedField.getField(); + if (isRemove(field)) { + if (TRACE) { + trace("kryo", String.format("Ignoring field %s tag: %s", disregarding ? "without" : "with", cachedField)); + } + super.removeField(field.getName()); + } + } + } + + private boolean isRemove(final Field field) { + return !isMarked(field) ^ disregarding; + } + + private boolean isMarked(final Field field) { + for (final Annotation annotation : field.getAnnotations()) { + final Class annotationType = annotation.annotationType(); + if (marked.contains(annotationType)) { + return true; + } + } + return false; + } + + /** + * Adds an annotation to the annotations that are considered by this serializer. + *

    + * Important: This will not have an effect if the serializer was configured + * to exclusively serialize annotated fields by setting {@code disregarding} to + * {@code false}. This is similar to the contract of this serializer's superclass + * {@link FieldSerializer} which does not allow to add fields that were formerly + * removed. If this was possible, instances that were serialized before this field + * was added could not longer be properly deserialized. In order to make this contract + * break explicit, you need to create a new instance of this serializer if you want to + * include new fields to a serializer that exclusively serializes annotated fields. + * + * @param clazz The annotation class to be added. + * @return {@code true} if the method call had an effect. + */ + public boolean addAnnotation(final Class clazz) { + if (disregarding && marked.add(clazz)) { + initializeCachedFields(); + return true; + } + return false; + } + + /** + * Removes an annotation to the annotations that are considered by this serializer. + *

    + * Important: This will not have an effect if the serializer was configured + * to not serialize annotated fields by setting {@code disregarding} to + * {@code true}. This is similar to the contract of this serializer's superclass + * {@link FieldSerializer} which does not allow to add fields that were formerly + * removed. If this was possible, instances that were serialized before this field + * was added could not longer be properly deserialized. In order to make this contract + * break explicit, you need to create a new instance of this serializer if you want to + * include new fields to a serializer that ignores annotated fields for serialization. + * + * @param clazz The annotation class to be removed. + * @return {@code true} if the method call had an effect. + */ + public boolean removeAnnotation(final Class clazz) { + if (!disregarding && marked.remove(clazz)) { + initializeCachedFields(); + return true; + } + return false; + } +} diff --git a/src/main/java/de/javakaffee/kryoserializers/GregorianCalendarSerializer.java b/src/main/java/de/javakaffee/kryoserializers/GregorianCalendarSerializer.java index a24693d6..ddcb53a9 100644 --- a/src/main/java/de/javakaffee/kryoserializers/GregorianCalendarSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/GregorianCalendarSerializer.java @@ -35,62 +35,62 @@ * (created via Calendar.getInstance(Locale.ENGLISH)) * would take 1323 byte, this one only takes 24 byte. *

    - * + * * @author Martin Grotzke */ public class GregorianCalendarSerializer extends Serializer { - private final Field _zoneField; + private final Field _zoneField; + + public GregorianCalendarSerializer() { + try { + _zoneField = Calendar.class.getDeclaredField("zone"); + _zoneField.setAccessible(true); + } catch (final Exception e) { + throw new RuntimeException(e); + } + } + + @Override + public GregorianCalendar read(final Kryo kryo, final Input input, final Class type) { + final Calendar result = GregorianCalendar.getInstance(); + + result.setTimeInMillis(input.readLong(true)); + result.setLenient(input.readBoolean()); + result.setFirstDayOfWeek(input.readInt(true)); + result.setMinimalDaysInFirstWeek(input.readInt(true)); + + /* check if we actually need to set the timezone, as + * TimeZone.getTimeZone is synchronized, so we might prevent this + */ + final String timeZoneId = input.readString(); + if (!getTimeZone(result).getID().equals(timeZoneId)) { + result.setTimeZone(TimeZone.getTimeZone(timeZoneId)); + } - public GregorianCalendarSerializer() { - try { - _zoneField = Calendar.class.getDeclaredField( "zone" ); - _zoneField.setAccessible( true ); - } catch ( final Exception e ) { - throw new RuntimeException( e ); - } - } + return (GregorianCalendar) result; + } - @Override - public GregorianCalendar read(final Kryo kryo, final Input input, final Class type) { - final Calendar result = GregorianCalendar.getInstance(); - - result.setTimeInMillis( input.readLong( true ) ); - result.setLenient( input.readBoolean() ); - result.setFirstDayOfWeek( input.readInt( true ) ); - result.setMinimalDaysInFirstWeek( input.readInt( true ) ); - - /* check if we actually need to set the timezone, as - * TimeZone.getTimeZone is synchronized, so we might prevent this - */ - final String timeZoneId = input.readString(); - if ( !getTimeZone( result ).getID().equals( timeZoneId ) ) { - result.setTimeZone( TimeZone.getTimeZone( timeZoneId ) ); - } - - return (GregorianCalendar) result; - } + @Override + public void write(final Kryo kryo, final Output output, final GregorianCalendar calendar) { + output.writeLong(calendar.getTimeInMillis(), true); + output.writeBoolean(calendar.isLenient()); + output.writeInt(calendar.getFirstDayOfWeek(), true); + output.writeInt(calendar.getMinimalDaysInFirstWeek(), true); + output.writeString(getTimeZone(calendar).getID()); + } - @Override - public void write(final Kryo kryo, final Output output, final GregorianCalendar calendar) { - output.writeLong( calendar.getTimeInMillis(), true ); - output.writeBoolean( calendar.isLenient() ); - output.writeInt( calendar.getFirstDayOfWeek(), true ); - output.writeInt( calendar.getMinimalDaysInFirstWeek(), true ); - output.writeString( getTimeZone( calendar ).getID() ); - } - - @Override - public GregorianCalendar copy(final Kryo kryo, final GregorianCalendar original) { - return (GregorianCalendar) original.clone(); - } + @Override + public GregorianCalendar copy(final Kryo kryo, final GregorianCalendar original) { + return (GregorianCalendar) original.clone(); + } - private TimeZone getTimeZone( final Calendar obj ) { - /* access the timezone via the field, to prevent cloning of the tz */ - try { - return (TimeZone) _zoneField.get( obj ); - } catch ( final Exception e ) { - throw new RuntimeException( e ); - } - } + private TimeZone getTimeZone(final Calendar obj) { + /* access the timezone via the field, to prevent cloning of the tz */ + try { + return (TimeZone) _zoneField.get(obj); + } catch (final Exception e) { + throw new RuntimeException(e); + } + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/JdkProxySerializer.java b/src/main/java/de/javakaffee/kryoserializers/JdkProxySerializer.java index f3c74432..340cb8de 100644 --- a/src/main/java/de/javakaffee/kryoserializers/JdkProxySerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/JdkProxySerializer.java @@ -26,36 +26,36 @@ /** * A serializer for jdk proxies (proxies created via java.lang.reflect.Proxy.newProxyInstance). - * + * * @author Martin Grotzke */ public class JdkProxySerializer extends Serializer { - @Override - public Object read(final Kryo kryo, final Input input, final Class type) { - final InvocationHandler invocationHandler = (InvocationHandler) kryo.readClassAndObject( input ); - final Class[] interfaces = kryo.readObject( input, Class[].class ); - final ClassLoader classLoader = kryo.getClassLoader(); - try { - return Proxy.newProxyInstance( classLoader, interfaces, invocationHandler ); - } catch( final RuntimeException e ) { - System.err.println( getClass().getName()+ ".read:\n" + - "Could not create proxy using classLoader " + classLoader + "," + - " have invocationhandler.classloader: " + invocationHandler.getClass().getClassLoader() + - " have contextclassloader: " + Thread.currentThread().getContextClassLoader() ); - throw e; - } - } + @Override + public Object read(final Kryo kryo, final Input input, final Class type) { + final InvocationHandler invocationHandler = (InvocationHandler) kryo.readClassAndObject(input); + final Class[] interfaces = kryo.readObject(input, Class[].class); + final ClassLoader classLoader = kryo.getClassLoader(); + try { + return Proxy.newProxyInstance(classLoader, interfaces, invocationHandler); + } catch (final RuntimeException e) { + System.err.println(getClass().getName() + ".read:\n" + + "Could not create proxy using classLoader " + classLoader + "," + + " have invocationhandler.classloader: " + invocationHandler.getClass().getClassLoader() + + " have contextclassloader: " + Thread.currentThread().getContextClassLoader()); + throw e; + } + } - @Override - public void write(final Kryo kryo, final Output output, final Object obj) { - kryo.writeClassAndObject( output, Proxy.getInvocationHandler( obj ) ); - kryo.writeObject( output, obj.getClass().getInterfaces() ); - } + @Override + public void write(final Kryo kryo, final Output output, final Object obj) { + kryo.writeClassAndObject(output, Proxy.getInvocationHandler(obj)); + kryo.writeObject(output, obj.getClass().getInterfaces()); + } - @Override - public Object copy(final Kryo kryo, final Object original) { - return Proxy.newProxyInstance( kryo.getClassLoader(), original.getClass().getInterfaces(), - Proxy.getInvocationHandler(original) ); - } + @Override + public Object copy(final Kryo kryo, final Object original) { + return Proxy.newProxyInstance(kryo.getClassLoader(), original.getClass().getInterfaces(), + Proxy.getInvocationHandler(original)); + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/KryoReflectionFactorySupport.java b/src/main/java/de/javakaffee/kryoserializers/KryoReflectionFactorySupport.java index 14fda244..d218192d 100644 --- a/src/main/java/de/javakaffee/kryoserializers/KryoReflectionFactorySupport.java +++ b/src/main/java/de/javakaffee/kryoserializers/KryoReflectionFactorySupport.java @@ -16,95 +16,97 @@ */ package de.javakaffee.kryoserializers; -import com.esotericsoftware.kryo.Kryo; -import com.esotericsoftware.kryo.Serializer; -import com.esotericsoftware.kryo.serializers.FieldSerializer; - import java.lang.reflect.Constructor; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import com.esotericsoftware.kryo.Kryo; +import com.esotericsoftware.kryo.Serializer; +import com.esotericsoftware.kryo.serializers.FieldSerializer; + import sun.reflect.ReflectionFactory; /** * A {@link Kryo} specialization that uses sun's {@link ReflectionFactory} to create * new instance for classes without a default constructor. - * + * * @author Martin Grotzke */ @SuppressWarnings({"restriction", "sunapi"}) public class KryoReflectionFactorySupport extends Kryo { - private static final ReflectionFactory REFLECTION_FACTORY = ReflectionFactory.getReflectionFactory(); - private static final Object[] INITARGS = new Object[0]; - - private static final Map, Constructor> _constructors = new ConcurrentHashMap, Constructor>(); + private static final ReflectionFactory REFLECTION_FACTORY = ReflectionFactory.getReflectionFactory(); + private static final Object[] INITARGS = new Object[0]; + + private static final Map, Constructor> _constructors = new ConcurrentHashMap, Constructor>(); + + @Override + public Serializer getDefaultSerializer(@SuppressWarnings("rawtypes") final Class type) { + final Serializer result = super.getDefaultSerializer(type); + if (result instanceof FieldSerializer) { + // don't ignore synthetic fields so that inner classes work (see KryoTest.testInnerClass) + ((FieldSerializer) result).setIgnoreSyntheticFields(false); + } + return result; + } - @Override - public Serializer getDefaultSerializer(@SuppressWarnings("rawtypes") final Class type) { - final Serializer result = super.getDefaultSerializer(type); - if(result instanceof FieldSerializer) { - // don't ignore synthetic fields so that inner classes work (see KryoTest.testInnerClass) - ((FieldSerializer) result).setIgnoreSyntheticFields(false); - } - return result; - } + /** + * {@inheritDoc} + */ + @Override + @SuppressWarnings("unchecked") + public T newInstance(final Class type) { + if (type == null) { + throw new IllegalArgumentException("type cannot be null."); + } + Constructor constructor = _constructors.get(type); + if (constructor == null) { + constructor = getNoArgsConstructor(type); + if (constructor == null) { + constructor = newConstructorForSerialization(type); + } + _constructors.put(type, constructor); + } + return (T) newInstanceFrom(constructor); + } - /** - * {@inheritDoc} - */ - @Override - @SuppressWarnings( "unchecked" ) - public T newInstance( final Class type ) { - if (type == null) { throw new IllegalArgumentException("type cannot be null."); } - Constructor constructor = _constructors.get( type ); - if ( constructor == null ) { - constructor = getNoArgsConstructor( type ); - if ( constructor == null ) { - constructor = newConstructorForSerialization( type ); - } - _constructors.put( type, constructor ); - } - return (T) newInstanceFrom( constructor ); - } + private static Object newInstanceFrom(final Constructor constructor) { + try { + return constructor.newInstance(INITARGS); + } catch (final Exception e) { + throw new RuntimeException(e); + } + } - private static Object newInstanceFrom( final Constructor constructor ) { - try { - return constructor.newInstance( INITARGS ); - } catch ( final Exception e ) { - throw new RuntimeException( e ); - } - } + @SuppressWarnings("unchecked") + public static T newInstanceFromReflectionFactory(final Class type) { + Constructor constructor = _constructors.get(type); + if (constructor == null) { + constructor = newConstructorForSerialization(type); + _constructors.put(type, constructor); + } + return (T) newInstanceFrom(constructor); + } - @SuppressWarnings( "unchecked" ) - public static T newInstanceFromReflectionFactory( final Class type ) { - Constructor constructor = _constructors.get( type ); - if ( constructor == null ) { - constructor = newConstructorForSerialization( type ); - _constructors.put( type, constructor ); - } - return (T) newInstanceFrom( constructor ); - } + private static Constructor newConstructorForSerialization(final Class type) { + try { + final Constructor constructor = REFLECTION_FACTORY.newConstructorForSerialization(type, Object.class.getDeclaredConstructor(new Class[0])); + constructor.setAccessible(true); + return constructor; + } catch (final Exception e) { + throw new RuntimeException(e); + } + } - private static Constructor newConstructorForSerialization( final Class type ) { - try { - final Constructor constructor = REFLECTION_FACTORY.newConstructorForSerialization( type, Object.class.getDeclaredConstructor( new Class[0] ) ); - constructor.setAccessible( true ); - return constructor; - } catch ( final Exception e ) { - throw new RuntimeException( e ); - } - } + private static Constructor getNoArgsConstructor(final Class type) { + final Constructor[] constructors = type.getConstructors(); + for (final Constructor constructor : constructors) { + if (constructor.getParameterTypes().length == 0) { + constructor.setAccessible(true); + return constructor; + } + } + return null; + } - private static Constructor getNoArgsConstructor( final Class type ) { - final Constructor[] constructors = type.getConstructors(); - for ( final Constructor constructor : constructors ) { - if ( constructor.getParameterTypes().length == 0 ) { - constructor.setAccessible( true ); - return constructor; - } - } - return null; - } - -} \ No newline at end of file +} diff --git a/src/main/java/de/javakaffee/kryoserializers/RegexSerializer.java b/src/main/java/de/javakaffee/kryoserializers/RegexSerializer.java index a8857bb1..22e1cb14 100644 --- a/src/main/java/de/javakaffee/kryoserializers/RegexSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/RegexSerializer.java @@ -1,3 +1,19 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers; import java.util.regex.Pattern; @@ -9,26 +25,26 @@ /** * Kryo {@link Serializer} for regex {@link Pattern}s. - * + * * @author Martin Grotzke * @author serverperformance */ public class RegexSerializer extends Serializer { - public RegexSerializer() { - setImmutable(true); - } + public RegexSerializer() { + setImmutable(true); + } - @Override - public void write(final Kryo kryo, final Output output, final Pattern pattern) { - output.writeString(pattern.pattern()); - output.writeInt(pattern.flags(), true); - } + @Override + public void write(final Kryo kryo, final Output output, final Pattern pattern) { + output.writeString(pattern.pattern()); + output.writeInt(pattern.flags(), true); + } - @Override - public Pattern read(final Kryo kryo, final Input input, final Class patternClass) { - String regex = input.readString(); - int flags = input.readInt(true); - return Pattern.compile(regex, flags); - } + @Override + public Pattern read(final Kryo kryo, final Input input, final Class patternClass) { + String regex = input.readString(); + int flags = input.readInt(true); + return Pattern.compile(regex, flags); + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/SubListSerializers.java b/src/main/java/de/javakaffee/kryoserializers/SubListSerializers.java index d4448062..7f572fdb 100644 --- a/src/main/java/de/javakaffee/kryoserializers/SubListSerializers.java +++ b/src/main/java/de/javakaffee/kryoserializers/SubListSerializers.java @@ -16,236 +16,238 @@ */ package de.javakaffee.kryoserializers; -import com.esotericsoftware.kryo.Kryo; -import com.esotericsoftware.kryo.Serializer; -import com.esotericsoftware.kryo.io.Input; -import com.esotericsoftware.kryo.io.Output; - import java.lang.reflect.Field; import java.util.AbstractList; import java.util.ArrayList; import java.util.List; +import com.esotericsoftware.kryo.Kryo; +import com.esotericsoftware.kryo.Serializer; +import com.esotericsoftware.kryo.io.Input; +import com.esotericsoftware.kryo.io.Output; + /** * Kryo {@link Serializer}s for lists created via {@link List#subList(int, int)}. * An instance of a serializer can be obtained via {@link #createFor(Class)}, which * just returns null if the given type is not supported by these * serializers. - * + * * @author Martin Grotzke */ public class SubListSerializers { - static Class getClass(final String className) { - try { - return Class.forName(className); - } catch (final Exception e) { - throw new RuntimeException(e); - } - } - - static Class getClassOrNull(final String className) { - try { - return Class.forName(className); - } catch (final Exception e) { - return null; - } - } - - // Workaround reference reading, this should be removed sometimes. See also - // https://groups.google.com/d/msg/kryo-users/Eu5V4bxCfws/k-8UQ22y59AJ - private static final Object FAKE_REFERENCE = new Object(); - - /** - * Obtain a serializer for the given sublist type. If the type is not supported - * null is returned. - * @param type the class of the sublist. - * @return a serializer instance or null. - */ - @SuppressWarnings("rawtypes") - public static Serializer> createFor(final Class type) { - if (ArrayListSubListSerializer.canSerialize(type)) - return new ArrayListSubListSerializer(); - if (JavaUtilSubListSerializer.canSerialize(type)) - return new JavaUtilSubListSerializer(); - return null; - } - - /** - * Adds appropriate sublist serializers as default serializers. - * - * @param kryo the {@code Kryo} to add default serializers to. - * @return the input {@code Kryo} - */ - public static Kryo addDefaultSerializers(Kryo kryo) { - ArrayListSubListSerializer.addDefaultSerializer(kryo); - JavaUtilSubListSerializer.addDefaultSerializer(kryo); - return kryo; - } - - /** - * Supports sublists created via {@link ArrayList#subList(int, int)} since java7 (oracle jdk, - * represented by java.util.ArrayList$SubList). - */ - public static class ArrayListSubListSerializer extends Serializer> { - - public static final Class SUBLIST_CLASS = SubListSerializers.getClassOrNull("java.util.ArrayList$SubList"); - - private Field _parentField; - private Field _parentOffsetField; - private Field _sizeField; - - public ArrayListSubListSerializer() { - try { - final Class clazz = Class.forName("java.util.ArrayList$SubList"); - _parentField = clazz.getDeclaredField("parent"); - _parentOffsetField = clazz.getDeclaredField( "parentOffset" ); - _sizeField = clazz.getDeclaredField( "size" ); - _parentField.setAccessible( true ); - _parentOffsetField.setAccessible( true ); - _sizeField.setAccessible( true ); - } catch (final Exception e) { - throw new RuntimeException(e); - } - } - - /** - * Can be used to determine, if the given type can be handled by this serializer. - * - * @param type - * the class to check. - * @return true if the given class can be serialized/deserialized by this serializer. - */ - public static boolean canSerialize(final Class type) { - return SUBLIST_CLASS != null && SUBLIST_CLASS.isAssignableFrom(type); - } - - public static Kryo addDefaultSerializer(Kryo kryo) { - if(SUBLIST_CLASS != null) kryo.addDefaultSerializer(SUBLIST_CLASS, new ArrayListSubListSerializer()); - return kryo; - } - - @Override - public List read(final Kryo kryo, final Input input, final Class> clazz) { - kryo.reference(FAKE_REFERENCE); - final List list = (List) kryo.readClassAndObject(input); - final int fromIndex = input.readInt(true); - final int toIndex = input.readInt(true); - return list.subList(fromIndex, toIndex); - } - - @Override - public void write(final Kryo kryo, final Output output, final List obj) { - try { - kryo.writeClassAndObject(output, _parentField.get(obj)); - final int parentOffset = _parentOffsetField.getInt( obj ); - final int fromIndex = parentOffset; - output.writeInt(fromIndex, true); - final int toIndex = fromIndex + _sizeField.getInt( obj ); - output.writeInt(toIndex, true); - } catch (final RuntimeException e) { - // Don't eat and wrap RuntimeExceptions because the ObjectBuffer.write... - // handles SerializationException specifically (resizing the buffer)... - throw e; - } catch (final Exception e) { - throw new RuntimeException(e); - } - } - - @Override - public List copy(final Kryo kryo, final List original) { - kryo.reference(FAKE_REFERENCE); - try { - final List list = (List) _parentField.get(original); - final int parentOffset = _parentOffsetField.getInt( original ); - final int fromIndex = parentOffset; - final int toIndex = fromIndex + _sizeField.getInt( original ); - return kryo.copy(list).subList(fromIndex, toIndex); - } catch(final Exception e) { - throw new RuntimeException(e); - } - } - } - - /** - * Supports sublists created via {@link AbstractList#subList(int, int)}, e.g. LinkedList. - * In oracle jdk such sublists are represented by java.util.SubList. - */ - public static class JavaUtilSubListSerializer extends Serializer> { - - public static final Class SUBLIST_CLASS = SubListSerializers.getClassOrNull("java.util.SubList"); - - private Field _listField; - private Field _offsetField; - private Field _sizeField; - - public JavaUtilSubListSerializer() { - try { - final Class clazz = Class.forName("java.util.SubList"); - _listField = clazz.getDeclaredField("l"); - _offsetField = clazz.getDeclaredField("offset"); - _sizeField = clazz.getDeclaredField("size"); - _listField.setAccessible(true); - _offsetField.setAccessible(true); - _sizeField.setAccessible(true); - } catch (final Exception e) { - throw new RuntimeException(e); - } - } - - /** - * Can be used to determine, if the given type can be handled by this serializer. - * - * @param type - * the class to check. - * @return true if the given class can be serialized/deserialized by this serializer. - */ - public static boolean canSerialize(final Class type) { - return SUBLIST_CLASS != null && SUBLIST_CLASS.isAssignableFrom(type); - } - - public static Kryo addDefaultSerializer(Kryo kryo) { - if(SUBLIST_CLASS != null) kryo.addDefaultSerializer(SUBLIST_CLASS, new JavaUtilSubListSerializer()); - return kryo; - } - - @Override - public List read(final Kryo kryo, final Input input, final Class> clazz) { - kryo.reference(FAKE_REFERENCE); - final List list = (List) kryo.readClassAndObject(input); - final int fromIndex = input.readInt(true); - final int toIndex = input.readInt(true); - return list.subList(fromIndex, toIndex); - } - - @Override - public void write(final Kryo kryo, final Output output, final List obj) { - try { - kryo.writeClassAndObject(output, _listField.get(obj)); - final int fromIndex = _offsetField.getInt(obj); - output.writeInt(fromIndex, true); - final int toIndex = fromIndex + _sizeField.getInt(obj); - output.writeInt(toIndex, true); - } catch (final RuntimeException e) { - // Don't eat and wrap RuntimeExceptions because the ObjectBuffer.write... - // handles SerializationException specifically (resizing the buffer)... - throw e; - } catch (final Exception e) { - throw new RuntimeException(e); - } - } - - @Override - public List copy(final Kryo kryo, final List obj) { - kryo.reference(FAKE_REFERENCE); - try { - final List list = (List) _listField.get(obj); - final int fromIndex = _offsetField.getInt(obj); - final int toIndex = fromIndex + _sizeField.getInt(obj); - return kryo.copy(list).subList(fromIndex, toIndex); - } catch(final Exception e) { - throw new RuntimeException(e); - } - } - } + static Class getClass(final String className) { + try { + return Class.forName(className); + } catch (final Exception e) { + throw new RuntimeException(e); + } + } + + static Class getClassOrNull(final String className) { + try { + return Class.forName(className); + } catch (final Exception e) { + return null; + } + } + + // Workaround reference reading, this should be removed sometimes. See also + // https://groups.google.com/d/msg/kryo-users/Eu5V4bxCfws/k-8UQ22y59AJ + private static final Object FAKE_REFERENCE = new Object(); + + /** + * Obtain a serializer for the given sublist type. If the type is not supported + * null is returned. + * @param type the class of the sublist. + * @return a serializer instance or null. + */ + @SuppressWarnings("rawtypes") + public static Serializer> createFor(final Class type) { + if (ArrayListSubListSerializer.canSerialize(type)) + return new ArrayListSubListSerializer(); + if (JavaUtilSubListSerializer.canSerialize(type)) + return new JavaUtilSubListSerializer(); + return null; + } + + /** + * Adds appropriate sublist serializers as default serializers. + * + * @param kryo the {@code Kryo} to add default serializers to. + * @return the input {@code Kryo} + */ + public static Kryo addDefaultSerializers(Kryo kryo) { + ArrayListSubListSerializer.addDefaultSerializer(kryo); + JavaUtilSubListSerializer.addDefaultSerializer(kryo); + return kryo; + } + + /** + * Supports sublists created via {@link ArrayList#subList(int, int)} since java7 (oracle jdk, + * represented by java.util.ArrayList$SubList). + */ + public static class ArrayListSubListSerializer extends Serializer> { + + public static final Class SUBLIST_CLASS = SubListSerializers.getClassOrNull("java.util.ArrayList$SubList"); + + private Field _parentField; + private Field _parentOffsetField; + private Field _sizeField; + + public ArrayListSubListSerializer() { + try { + final Class clazz = Class.forName("java.util.ArrayList$SubList"); + _parentField = clazz.getDeclaredField("parent"); + _parentOffsetField = clazz.getDeclaredField("parentOffset"); + _sizeField = clazz.getDeclaredField("size"); + _parentField.setAccessible(true); + _parentOffsetField.setAccessible(true); + _sizeField.setAccessible(true); + } catch (final Exception e) { + throw new RuntimeException(e); + } + } + + /** + * Can be used to determine, if the given type can be handled by this serializer. + * + * @param type + * the class to check. + * @return true if the given class can be serialized/deserialized by this serializer. + */ + public static boolean canSerialize(final Class type) { + return SUBLIST_CLASS != null && SUBLIST_CLASS.isAssignableFrom(type); + } + + public static Kryo addDefaultSerializer(Kryo kryo) { + if (SUBLIST_CLASS != null) + kryo.addDefaultSerializer(SUBLIST_CLASS, new ArrayListSubListSerializer()); + return kryo; + } + + @Override + public List read(final Kryo kryo, final Input input, final Class> clazz) { + kryo.reference(FAKE_REFERENCE); + final List list = (List) kryo.readClassAndObject(input); + final int fromIndex = input.readInt(true); + final int toIndex = input.readInt(true); + return list.subList(fromIndex, toIndex); + } + + @Override + public void write(final Kryo kryo, final Output output, final List obj) { + try { + kryo.writeClassAndObject(output, _parentField.get(obj)); + final int parentOffset = _parentOffsetField.getInt(obj); + final int fromIndex = parentOffset; + output.writeInt(fromIndex, true); + final int toIndex = fromIndex + _sizeField.getInt(obj); + output.writeInt(toIndex, true); + } catch (final RuntimeException e) { + // Don't eat and wrap RuntimeExceptions because the ObjectBuffer.write... + // handles SerializationException specifically (resizing the buffer)... + throw e; + } catch (final Exception e) { + throw new RuntimeException(e); + } + } + + @Override + public List copy(final Kryo kryo, final List original) { + kryo.reference(FAKE_REFERENCE); + try { + final List list = (List) _parentField.get(original); + final int parentOffset = _parentOffsetField.getInt(original); + final int fromIndex = parentOffset; + final int toIndex = fromIndex + _sizeField.getInt(original); + return kryo.copy(list).subList(fromIndex, toIndex); + } catch (final Exception e) { + throw new RuntimeException(e); + } + } + } + + /** + * Supports sublists created via {@link AbstractList#subList(int, int)}, e.g. LinkedList. + * In oracle jdk such sublists are represented by java.util.SubList. + */ + public static class JavaUtilSubListSerializer extends Serializer> { + + public static final Class SUBLIST_CLASS = SubListSerializers.getClassOrNull("java.util.SubList"); + + private Field _listField; + private Field _offsetField; + private Field _sizeField; + + public JavaUtilSubListSerializer() { + try { + final Class clazz = Class.forName("java.util.SubList"); + _listField = clazz.getDeclaredField("l"); + _offsetField = clazz.getDeclaredField("offset"); + _sizeField = clazz.getDeclaredField("size"); + _listField.setAccessible(true); + _offsetField.setAccessible(true); + _sizeField.setAccessible(true); + } catch (final Exception e) { + throw new RuntimeException(e); + } + } + + /** + * Can be used to determine, if the given type can be handled by this serializer. + * + * @param type + * the class to check. + * @return true if the given class can be serialized/deserialized by this serializer. + */ + public static boolean canSerialize(final Class type) { + return SUBLIST_CLASS != null && SUBLIST_CLASS.isAssignableFrom(type); + } + + public static Kryo addDefaultSerializer(Kryo kryo) { + if (SUBLIST_CLASS != null) + kryo.addDefaultSerializer(SUBLIST_CLASS, new JavaUtilSubListSerializer()); + return kryo; + } + + @Override + public List read(final Kryo kryo, final Input input, final Class> clazz) { + kryo.reference(FAKE_REFERENCE); + final List list = (List) kryo.readClassAndObject(input); + final int fromIndex = input.readInt(true); + final int toIndex = input.readInt(true); + return list.subList(fromIndex, toIndex); + } + + @Override + public void write(final Kryo kryo, final Output output, final List obj) { + try { + kryo.writeClassAndObject(output, _listField.get(obj)); + final int fromIndex = _offsetField.getInt(obj); + output.writeInt(fromIndex, true); + final int toIndex = fromIndex + _sizeField.getInt(obj); + output.writeInt(toIndex, true); + } catch (final RuntimeException e) { + // Don't eat and wrap RuntimeExceptions because the ObjectBuffer.write... + // handles SerializationException specifically (resizing the buffer)... + throw e; + } catch (final Exception e) { + throw new RuntimeException(e); + } + } + + @Override + public List copy(final Kryo kryo, final List obj) { + kryo.reference(FAKE_REFERENCE); + try { + final List list = (List) _listField.get(obj); + final int fromIndex = _offsetField.getInt(obj); + final int toIndex = fromIndex + _sizeField.getInt(obj); + return kryo.copy(list).subList(fromIndex, toIndex); + } catch (final Exception e) { + throw new RuntimeException(e); + } + } + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/SynchronizedCollectionsSerializer.java b/src/main/java/de/javakaffee/kryoserializers/SynchronizedCollectionsSerializer.java index d749c38b..a0ef6ca6 100644 --- a/src/main/java/de/javakaffee/kryoserializers/SynchronizedCollectionsSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/SynchronizedCollectionsSerializer.java @@ -40,157 +40,157 @@ /** * A kryo {@link Serializer} for synchronized {@link Collection}s and {@link Map}s * created via {@link Collections}. - * + * * @author Martin Grotzke */ public class SynchronizedCollectionsSerializer extends Serializer { - - private static final Field SOURCE_COLLECTION_FIELD; - private static final Field SOURCE_MAP_FIELD; - - static { - try { - SOURCE_COLLECTION_FIELD = Class.forName("java.util.Collections$SynchronizedCollection" ) - .getDeclaredField( "c" ); - SOURCE_COLLECTION_FIELD.setAccessible( true ); - - SOURCE_MAP_FIELD = Class.forName("java.util.Collections$SynchronizedMap" ) - .getDeclaredField( "m" ); - SOURCE_MAP_FIELD.setAccessible( true ); - } catch ( final Exception e ) { - throw new RuntimeException( "Could not access source collection" + - " field in java.util.Collections$SynchronizedCollection.", e ); - } - } - - @Override - public Object read(final Kryo kryo, final Input input, final Class clazz) { - final int ordinal = input.readInt( true ); - final SynchronizedCollection collection = SynchronizedCollection.values()[ordinal]; - final Object sourceCollection = kryo.readClassAndObject( input ); - return collection.create( sourceCollection ); - } - - @Override - public void write(final Kryo kryo, final Output output, final Object object) { - try { - final SynchronizedCollection collection = SynchronizedCollection.valueOfType( object.getClass() ); - // the ordinal could be replaced by s.th. else (e.g. a explicitely managed "id") - output.writeInt( collection.ordinal(), true ); - kryo.writeClassAndObject( output, collection.sourceCollectionField.get( object ) ); - } catch ( final RuntimeException e ) { - // Don't eat and wrap RuntimeExceptions because the ObjectBuffer.write... - // handles SerializationException specifically (resizing the buffer)... - throw e; - } catch ( final Exception e ) { - throw new RuntimeException( e ); - } - } - - @Override - public Object copy(Kryo kryo, Object original) { - try { - final SynchronizedCollection collection = SynchronizedCollection.valueOfType( original.getClass() ); - Object sourceCollectionCopy = kryo.copy(collection.sourceCollectionField.get(original)); - return collection.create( sourceCollectionCopy ); - } catch ( final RuntimeException e ) { - // Don't eat and wrap RuntimeExceptions - throw e; - } catch ( final Exception e ) { - throw new RuntimeException( e ); - } - } - - private static enum SynchronizedCollection { - COLLECTION( Collections.synchronizedCollection( Arrays.asList( "" ) ).getClass(), SOURCE_COLLECTION_FIELD ){ - @Override - public Object create( final Object sourceCollection ) { - return Collections.synchronizedCollection( (Collection) sourceCollection ); - } - }, - RANDOM_ACCESS_LIST( Collections.synchronizedList( new ArrayList() ).getClass(), SOURCE_COLLECTION_FIELD ){ - @Override - public Object create( final Object sourceCollection ) { - return Collections.synchronizedList( (List) sourceCollection ); - } - }, - LIST( Collections.synchronizedList( new LinkedList() ).getClass(), SOURCE_COLLECTION_FIELD ){ - @Override - public Object create( final Object sourceCollection ) { - return Collections.synchronizedList( (List) sourceCollection ); - } - }, - SET( Collections.synchronizedSet( new HashSet() ).getClass(), SOURCE_COLLECTION_FIELD ){ - @Override - public Object create( final Object sourceCollection ) { - return Collections.synchronizedSet( (Set) sourceCollection ); - } - }, - SORTED_SET( Collections.synchronizedSortedSet( new TreeSet() ).getClass(), SOURCE_COLLECTION_FIELD ){ - @Override - public Object create( final Object sourceCollection ) { - return Collections.synchronizedSortedSet( (SortedSet) sourceCollection ); - } - }, - MAP( Collections.synchronizedMap( new HashMap() ).getClass(), SOURCE_MAP_FIELD ) { - - @Override - public Object create( final Object sourceCollection ) { - return Collections.synchronizedMap( (Map) sourceCollection ); - } - - }, - SORTED_MAP( Collections.synchronizedSortedMap( new TreeMap() ).getClass(), SOURCE_MAP_FIELD ) { - @Override - public Object create( final Object sourceCollection ) { - return Collections.synchronizedSortedMap( (SortedMap) sourceCollection ); - } - }; - - private final Class type; - private final Field sourceCollectionField; - - private SynchronizedCollection( final Class type, final Field sourceCollectionField ) { - this.type = type; - this.sourceCollectionField = sourceCollectionField; - } - - /** - * @param sourceCollection - */ - public abstract Object create( Object sourceCollection ); - - static SynchronizedCollection valueOfType( final Class type ) { - for( final SynchronizedCollection item : values() ) { - if ( item.type.equals( type ) ) { - return item; - } - } - throw new IllegalArgumentException( "The type " + type + " is not supported." ); - } - - } - - /** - * Creates a new {@link SynchronizedCollectionsSerializer} and registers its serializer - * for the several synchronized Collections that can be created via {@link Collections}, - * including {@link Map}s. - * - * @param kryo the {@link Kryo} instance to set the serializer on. - * - * @see Collections#synchronizedCollection(Collection) - * @see Collections#synchronizedList(List) - * @see Collections#synchronizedSet(Set) - * @see Collections#synchronizedSortedSet(SortedSet) - * @see Collections#synchronizedMap(Map) - * @see Collections#synchronizedSortedMap(SortedMap) - */ - public static void registerSerializers( final Kryo kryo ) { - final SynchronizedCollectionsSerializer serializer = new SynchronizedCollectionsSerializer(); - SynchronizedCollection.values(); - for ( final SynchronizedCollection item : SynchronizedCollection.values() ) { - kryo.register( item.type, serializer ); - } - } + + private static final Field SOURCE_COLLECTION_FIELD; + private static final Field SOURCE_MAP_FIELD; + + static { + try { + SOURCE_COLLECTION_FIELD = Class.forName("java.util.Collections$SynchronizedCollection") + .getDeclaredField("c"); + SOURCE_COLLECTION_FIELD.setAccessible(true); + + SOURCE_MAP_FIELD = Class.forName("java.util.Collections$SynchronizedMap") + .getDeclaredField("m"); + SOURCE_MAP_FIELD.setAccessible(true); + } catch (final Exception e) { + throw new RuntimeException("Could not access source collection" + + " field in java.util.Collections$SynchronizedCollection.", e); + } + } + + @Override + public Object read(final Kryo kryo, final Input input, final Class clazz) { + final int ordinal = input.readInt(true); + final SynchronizedCollection collection = SynchronizedCollection.values()[ordinal]; + final Object sourceCollection = kryo.readClassAndObject(input); + return collection.create(sourceCollection); + } + + @Override + public void write(final Kryo kryo, final Output output, final Object object) { + try { + final SynchronizedCollection collection = SynchronizedCollection.valueOfType(object.getClass()); + // the ordinal could be replaced by s.th. else (e.g. a explicitely managed "id") + output.writeInt(collection.ordinal(), true); + kryo.writeClassAndObject(output, collection.sourceCollectionField.get(object)); + } catch (final RuntimeException e) { + // Don't eat and wrap RuntimeExceptions because the ObjectBuffer.write... + // handles SerializationException specifically (resizing the buffer)... + throw e; + } catch (final Exception e) { + throw new RuntimeException(e); + } + } + + @Override + public Object copy(Kryo kryo, Object original) { + try { + final SynchronizedCollection collection = SynchronizedCollection.valueOfType(original.getClass()); + Object sourceCollectionCopy = kryo.copy(collection.sourceCollectionField.get(original)); + return collection.create(sourceCollectionCopy); + } catch (final RuntimeException e) { + // Don't eat and wrap RuntimeExceptions + throw e; + } catch (final Exception e) { + throw new RuntimeException(e); + } + } + + private static enum SynchronizedCollection { + COLLECTION(Collections.synchronizedCollection(Arrays.asList("")).getClass(), SOURCE_COLLECTION_FIELD) { + @Override + public Object create(final Object sourceCollection) { + return Collections.synchronizedCollection((Collection) sourceCollection); + } + }, + RANDOM_ACCESS_LIST(Collections.synchronizedList(new ArrayList()).getClass(), SOURCE_COLLECTION_FIELD) { + @Override + public Object create(final Object sourceCollection) { + return Collections.synchronizedList((List) sourceCollection); + } + }, + LIST(Collections.synchronizedList(new LinkedList()).getClass(), SOURCE_COLLECTION_FIELD) { + @Override + public Object create(final Object sourceCollection) { + return Collections.synchronizedList((List) sourceCollection); + } + }, + SET(Collections.synchronizedSet(new HashSet()).getClass(), SOURCE_COLLECTION_FIELD) { + @Override + public Object create(final Object sourceCollection) { + return Collections.synchronizedSet((Set) sourceCollection); + } + }, + SORTED_SET(Collections.synchronizedSortedSet(new TreeSet()).getClass(), SOURCE_COLLECTION_FIELD) { + @Override + public Object create(final Object sourceCollection) { + return Collections.synchronizedSortedSet((SortedSet) sourceCollection); + } + }, + MAP(Collections.synchronizedMap(new HashMap()).getClass(), SOURCE_MAP_FIELD) { + + @Override + public Object create(final Object sourceCollection) { + return Collections.synchronizedMap((Map) sourceCollection); + } + + }, + SORTED_MAP(Collections.synchronizedSortedMap(new TreeMap()).getClass(), SOURCE_MAP_FIELD) { + @Override + public Object create(final Object sourceCollection) { + return Collections.synchronizedSortedMap((SortedMap) sourceCollection); + } + }; + + private final Class type; + private final Field sourceCollectionField; + + private SynchronizedCollection(final Class type, final Field sourceCollectionField) { + this.type = type; + this.sourceCollectionField = sourceCollectionField; + } + + /** + * @param sourceCollection + */ + public abstract Object create(Object sourceCollection); + + static SynchronizedCollection valueOfType(final Class type) { + for (final SynchronizedCollection item : values()) { + if (item.type.equals(type)) { + return item; + } + } + throw new IllegalArgumentException("The type " + type + " is not supported."); + } + + } + + /** + * Creates a new {@link SynchronizedCollectionsSerializer} and registers its serializer + * for the several synchronized Collections that can be created via {@link Collections}, + * including {@link Map}s. + * + * @param kryo the {@link Kryo} instance to set the serializer on. + * + * @see Collections#synchronizedCollection(Collection) + * @see Collections#synchronizedList(List) + * @see Collections#synchronizedSet(Set) + * @see Collections#synchronizedSortedSet(SortedSet) + * @see Collections#synchronizedMap(Map) + * @see Collections#synchronizedSortedMap(SortedMap) + */ + public static void registerSerializers(final Kryo kryo) { + final SynchronizedCollectionsSerializer serializer = new SynchronizedCollectionsSerializer(); + SynchronizedCollection.values(); + for (final SynchronizedCollection item : SynchronizedCollection.values()) { + kryo.register(item.type, serializer); + } + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/URISerializer.java b/src/main/java/de/javakaffee/kryoserializers/URISerializer.java index 612ccc85..cd405301 100644 --- a/src/main/java/de/javakaffee/kryoserializers/URISerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/URISerializer.java @@ -1,3 +1,19 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers; import java.net.URI; @@ -9,17 +25,17 @@ public class URISerializer extends Serializer { - public URISerializer() { - setImmutable(true); - } + public URISerializer() { + setImmutable(true); + } - @Override - public void write(final Kryo kryo, final Output output, final URI uri) { - output.writeString(uri.toString()); - } + @Override + public void write(final Kryo kryo, final Output output, final URI uri) { + output.writeString(uri.toString()); + } - @Override - public URI read(final Kryo kryo, final Input input, final Class uriClass) { - return URI.create(input.readString()); - } + @Override + public URI read(final Kryo kryo, final Input input, final Class uriClass) { + return URI.create(input.readString()); + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/UUIDSerializer.java b/src/main/java/de/javakaffee/kryoserializers/UUIDSerializer.java index fa0ef92b..9d0ef492 100644 --- a/src/main/java/de/javakaffee/kryoserializers/UUIDSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/UUIDSerializer.java @@ -1,3 +1,19 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers; import java.util.UUID; @@ -9,17 +25,18 @@ public class UUIDSerializer extends Serializer { - public UUIDSerializer() { - setImmutable(true); - } + public UUIDSerializer() { + setImmutable(true); + } - @Override - public void write(final Kryo kryo, final Output output, final UUID uuid) { - output.writeLong(uuid.getMostSignificantBits()); - output.writeLong(uuid.getLeastSignificantBits()); - } + @Override + public void write(final Kryo kryo, final Output output, final UUID uuid) { + output.writeLong(uuid.getMostSignificantBits()); + output.writeLong(uuid.getLeastSignificantBits()); + } - @Override public UUID read(final Kryo kryo, final Input input, final Class uuidClass) { - return new UUID(input.readLong(), input.readLong()); - } + @Override + public UUID read(final Kryo kryo, final Input input, final Class uuidClass) { + return new UUID(input.readLong(), input.readLong()); + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/UnicodeBlockSerializer.java b/src/main/java/de/javakaffee/kryoserializers/UnicodeBlockSerializer.java index bd6919dd..2af93e68 100644 --- a/src/main/java/de/javakaffee/kryoserializers/UnicodeBlockSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/UnicodeBlockSerializer.java @@ -1,15 +1,31 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers; -import com.esotericsoftware.kryo.Kryo; -import com.esotericsoftware.kryo.Serializer; -import com.esotericsoftware.kryo.io.Input; -import com.esotericsoftware.kryo.io.Output; - import java.lang.Character.UnicodeBlock; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.IdentityHashMap; +import com.esotericsoftware.kryo.Kryo; +import com.esotericsoftware.kryo.Serializer; +import com.esotericsoftware.kryo.io.Input; +import com.esotericsoftware.kryo.io.Output; + /** * A kryo {@link Serializer} for fields of type {@link UnicodeBlock}, which is effectively but not * actually an enum. @@ -17,54 +33,53 @@ * @author Chris Hennick */ public class UnicodeBlockSerializer extends Serializer { - private static final IdentityHashMap BLOCK_NAMES - = new IdentityHashMap(); - static { - // Reflectively look up the instances and their names, which are in UnicodeBlock's static - // fields (necessary since UnicodeBlock isn't an actual enum) - for (Field field : UnicodeBlock.class.getDeclaredFields()) { - if (Modifier.isStatic(field.getModifiers())) { - try { - // For some reason, UnicodeBlock constants aren't already accessible, even - // though they're public! WTF? - field.setAccessible(true); - Object value = field.get(null); - if (value instanceof UnicodeBlock) { - BLOCK_NAMES.put((UnicodeBlock) value, field.getName()); - } - } catch (IllegalAccessException e) { - // Should never happen - throw new InternalError(); - } - } - } - } + private static final IdentityHashMap BLOCK_NAMES = new IdentityHashMap(); + static { + // Reflectively look up the instances and their names, which are in UnicodeBlock's static + // fields (necessary since UnicodeBlock isn't an actual enum) + for (Field field : UnicodeBlock.class.getDeclaredFields()) { + if (Modifier.isStatic(field.getModifiers())) { + try { + // For some reason, UnicodeBlock constants aren't already accessible, even + // though they're public! WTF? + field.setAccessible(true); + Object value = field.get(null); + if (value instanceof UnicodeBlock) { + BLOCK_NAMES.put((UnicodeBlock) value, field.getName()); + } + } catch (IllegalAccessException e) { + // Should never happen + throw new InternalError(); + } + } + } + } - public UnicodeBlockSerializer() { - super(); - } + public UnicodeBlockSerializer() { + super(); + } - /** - * {@inheritDoc} - */ - @Override - public void write(final Kryo kryo, final Output output, final UnicodeBlock obj) { - output.writeAscii(BLOCK_NAMES.get(obj)); - } + /** + * {@inheritDoc} + */ + @Override + public void write(final Kryo kryo, final Output output, final UnicodeBlock obj) { + output.writeAscii(BLOCK_NAMES.get(obj)); + } - /** - * Returns {@code original}; see {@link com.esotericsoftware.kryo.serializers.DefaultSerializers.EnumSerializer#copy} - * for why we behave this way. - */ - @Override - public UnicodeBlock copy(final Kryo kryo, final UnicodeBlock original) { - return original; - } + /** + * Returns {@code original}; see {@link com.esotericsoftware.kryo.serializers.DefaultSerializers.EnumSerializer#copy} + * for why we behave this way. + */ + @Override + public UnicodeBlock copy(final Kryo kryo, final UnicodeBlock original) { + return original; + } - @Override - public UnicodeBlock read(final Kryo kryo, final Input input, - final Class unicodeBlockClass) { - String name = input.readString(); - return (name == null) ? null : UnicodeBlock.forName(name); - } + @Override + public UnicodeBlock read(final Kryo kryo, final Input input, + final Class unicodeBlockClass) { + String name = input.readString(); + return (name == null) ? null : UnicodeBlock.forName(name); + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/UnmodifiableCollectionsSerializer.java b/src/main/java/de/javakaffee/kryoserializers/UnmodifiableCollectionsSerializer.java index 51e1ad7c..22c0ce0c 100644 --- a/src/main/java/de/javakaffee/kryoserializers/UnmodifiableCollectionsSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/UnmodifiableCollectionsSerializer.java @@ -17,20 +17,7 @@ package de.javakaffee.kryoserializers; import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.SortedMap; -import java.util.SortedSet; -import java.util.TreeMap; -import java.util.TreeSet; +import java.util.*; import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.Serializer; @@ -40,158 +27,156 @@ /** * A kryo {@link Serializer} for unmodifiable {@link Collection}s and {@link Map}s * created via {@link Collections}. - * + * * @author Martin Grotzke */ public class UnmodifiableCollectionsSerializer extends Serializer { - - private static final Field SOURCE_COLLECTION_FIELD; - private static final Field SOURCE_MAP_FIELD; - - static { - try { - SOURCE_COLLECTION_FIELD = Class.forName("java.util.Collections$UnmodifiableCollection" ) - .getDeclaredField( "c" ); - SOURCE_COLLECTION_FIELD.setAccessible( true ); - - - SOURCE_MAP_FIELD = Class.forName("java.util.Collections$UnmodifiableMap" ) - .getDeclaredField( "m" ); - SOURCE_MAP_FIELD.setAccessible( true ); - } catch ( final Exception e ) { - throw new RuntimeException( "Could not access source collection" + - " field in java.util.Collections$UnmodifiableCollection.", e ); - } - } - - @Override - public Object read(final Kryo kryo, final Input input, final Class clazz) { - final int ordinal = input.readInt( true ); - final UnmodifiableCollection unmodifiableCollection = UnmodifiableCollection.values()[ordinal]; - final Object sourceCollection = kryo.readClassAndObject( input ); - return unmodifiableCollection.create( sourceCollection ); - } - - @Override - public void write(final Kryo kryo, final Output output, final Object object) { - try { - final UnmodifiableCollection unmodifiableCollection = UnmodifiableCollection.valueOfType( object.getClass() ); - // the ordinal could be replaced by s.th. else (e.g. a explicitely managed "id") - output.writeInt( unmodifiableCollection.ordinal(), true ); - kryo.writeClassAndObject( output, unmodifiableCollection.sourceCollectionField.get( object ) ); - } catch ( final RuntimeException e ) { - // Don't eat and wrap RuntimeExceptions because the ObjectBuffer.write... - // handles SerializationException specifically (resizing the buffer)... - throw e; - } catch ( final Exception e ) { - throw new RuntimeException( e ); - } - } - - @Override - public Object copy(Kryo kryo, Object original) { - try { - final UnmodifiableCollection unmodifiableCollection = UnmodifiableCollection.valueOfType( original.getClass() ); - Object sourceCollectionCopy = kryo.copy(unmodifiableCollection.sourceCollectionField.get(original)); - return unmodifiableCollection.create( sourceCollectionCopy ); - } catch ( final RuntimeException e ) { - // Don't eat and wrap RuntimeExceptions - throw e; - } catch ( final Exception e ) { - throw new RuntimeException( e ); - } - } - - private static enum UnmodifiableCollection { - COLLECTION( Collections.unmodifiableCollection( Arrays.asList( "" ) ).getClass(), SOURCE_COLLECTION_FIELD ){ - @Override - public Object create( final Object sourceCollection ) { - return Collections.unmodifiableCollection( (Collection) sourceCollection ); - } - }, - RANDOM_ACCESS_LIST( Collections.unmodifiableList( new ArrayList() ).getClass(), SOURCE_COLLECTION_FIELD ){ - @Override - public Object create( final Object sourceCollection ) { - return Collections.unmodifiableList( (List) sourceCollection ); - } - }, - LIST( Collections.unmodifiableList( new LinkedList() ).getClass(), SOURCE_COLLECTION_FIELD ){ - @Override - public Object create( final Object sourceCollection ) { - return Collections.unmodifiableList( (List) sourceCollection ); - } - }, - SET( Collections.unmodifiableSet( new HashSet() ).getClass(), SOURCE_COLLECTION_FIELD ){ - @Override - public Object create( final Object sourceCollection ) { - return Collections.unmodifiableSet( (Set) sourceCollection ); - } - }, - SORTED_SET( Collections.unmodifiableSortedSet( new TreeSet() ).getClass(), SOURCE_COLLECTION_FIELD ){ - @Override - public Object create( final Object sourceCollection ) { - return Collections.unmodifiableSortedSet( (SortedSet) sourceCollection ); - } - }, - MAP( Collections.unmodifiableMap( new HashMap() ).getClass(), SOURCE_MAP_FIELD ) { - - @Override - public Object create( final Object sourceCollection ) { - return Collections.unmodifiableMap( (Map) sourceCollection ); - } - - }, - SORTED_MAP( Collections.unmodifiableSortedMap( new TreeMap() ).getClass(), SOURCE_MAP_FIELD ) { - @Override - public Object create( final Object sourceCollection ) { - return Collections.unmodifiableSortedMap( (SortedMap) sourceCollection ); - } - }; - - private final Class type; - private final Field sourceCollectionField; - - private UnmodifiableCollection( final Class type, final Field sourceCollectionField ) { - this.type = type; - this.sourceCollectionField = sourceCollectionField; - } - - /** - * @param sourceCollection - */ - public abstract Object create( Object sourceCollection ); - - static UnmodifiableCollection valueOfType( final Class type ) { - for( final UnmodifiableCollection item : values() ) { - if ( item.type.equals( type ) ) { - return item; - } - } - throw new IllegalArgumentException( "The type " + type + " is not supported." ); - } - - } - - /** - * Creates a new {@link UnmodifiableCollectionsSerializer} and registers its serializer - * for the several unmodifiable Collections that can be created via {@link Collections}, - * including {@link Map}s. - * - * @param kryo the {@link Kryo} instance to set the serializer on. - * - * @see Collections#unmodifiableCollection(Collection) - * @see Collections#unmodifiableList(List) - * @see Collections#unmodifiableSet(Set) - * @see Collections#unmodifiableSortedSet(SortedSet) - * @see Collections#unmodifiableMap(Map) - * @see Collections#unmodifiableSortedMap(SortedMap) - */ - public static void registerSerializers( final Kryo kryo ) { - final UnmodifiableCollectionsSerializer serializer = new UnmodifiableCollectionsSerializer(); - UnmodifiableCollection.values(); - for ( final UnmodifiableCollection item : UnmodifiableCollection.values() ) { - kryo.register( item.type, serializer ); - } - } + + private static final Field SOURCE_COLLECTION_FIELD; + private static final Field SOURCE_MAP_FIELD; + + static { + try { + SOURCE_COLLECTION_FIELD = Class.forName("java.util.Collections$UnmodifiableCollection") + .getDeclaredField("c"); + SOURCE_COLLECTION_FIELD.setAccessible(true); + + SOURCE_MAP_FIELD = Class.forName("java.util.Collections$UnmodifiableMap").getDeclaredField("m"); + SOURCE_MAP_FIELD.setAccessible(true); + } catch (final Exception e) { + throw new RuntimeException( + "Could not access source collection" + " field in java.util.Collections$UnmodifiableCollection.", + e); + } + } + + /** + * Creates a new {@link UnmodifiableCollectionsSerializer} and registers its serializer + * for the several unmodifiable Collections that can be created via {@link Collections}, + * including {@link Map}s. + * + * @param kryo the {@link Kryo} instance to set the serializer on. + * @see Collections#unmodifiableCollection(Collection) + * @see Collections#unmodifiableList(List) + * @see Collections#unmodifiableSet(Set) + * @see Collections#unmodifiableSortedSet(SortedSet) + * @see Collections#unmodifiableMap(Map) + * @see Collections#unmodifiableSortedMap(SortedMap) + */ + public static void registerSerializers(final Kryo kryo) { + final UnmodifiableCollectionsSerializer serializer = new UnmodifiableCollectionsSerializer(); + UnmodifiableCollection.values(); + for (final UnmodifiableCollection item : UnmodifiableCollection.values()) { + kryo.register(item.type, serializer); + } + } + + @Override + public Object read(final Kryo kryo, final Input input, final Class clazz) { + final int ordinal = input.readInt(true); + final UnmodifiableCollection unmodifiableCollection = UnmodifiableCollection.values()[ordinal]; + final Object sourceCollection = kryo.readClassAndObject(input); + return unmodifiableCollection.create(sourceCollection); + } + + @Override + public void write(final Kryo kryo, final Output output, final Object object) { + try { + final UnmodifiableCollection unmodifiableCollection = UnmodifiableCollection.valueOfType(object.getClass()); + // the ordinal could be replaced by s.th. else (e.g. a explicitely managed "id") + output.writeInt(unmodifiableCollection.ordinal(), true); + kryo.writeClassAndObject(output, unmodifiableCollection.sourceCollectionField.get(object)); + } catch (final RuntimeException e) { + // Don't eat and wrap RuntimeExceptions because the ObjectBuffer.write... + // handles SerializationException specifically (resizing the buffer)... + throw e; + } catch (final Exception e) { + throw new RuntimeException(e); + } + } + + @Override + public Object copy(Kryo kryo, Object original) { + try { + final UnmodifiableCollection unmodifiableCollection = UnmodifiableCollection + .valueOfType(original.getClass()); + Object sourceCollectionCopy = kryo.copy(unmodifiableCollection.sourceCollectionField.get(original)); + return unmodifiableCollection.create(sourceCollectionCopy); + } catch (final RuntimeException e) { + // Don't eat and wrap RuntimeExceptions + throw e; + } catch (final Exception e) { + throw new RuntimeException(e); + } + } + + private static enum UnmodifiableCollection { + COLLECTION(Collections.unmodifiableCollection(Arrays.asList("")).getClass(), SOURCE_COLLECTION_FIELD) { + @Override + public Object create(final Object sourceCollection) { + return Collections.unmodifiableCollection((Collection) sourceCollection); + } + }, + RANDOM_ACCESS_LIST(Collections.unmodifiableList(new ArrayList()).getClass(), SOURCE_COLLECTION_FIELD) { + @Override + public Object create(final Object sourceCollection) { + return Collections.unmodifiableList((List) sourceCollection); + } + }, + LIST(Collections.unmodifiableList(new LinkedList()).getClass(), SOURCE_COLLECTION_FIELD) { + @Override + public Object create(final Object sourceCollection) { + return Collections.unmodifiableList((List) sourceCollection); + } + }, + SET(Collections.unmodifiableSet(new HashSet()).getClass(), SOURCE_COLLECTION_FIELD) { + @Override + public Object create(final Object sourceCollection) { + return Collections.unmodifiableSet((Set) sourceCollection); + } + }, + SORTED_SET(Collections.unmodifiableSortedSet(new TreeSet()).getClass(), SOURCE_COLLECTION_FIELD) { + @Override + public Object create(final Object sourceCollection) { + return Collections.unmodifiableSortedSet((SortedSet) sourceCollection); + } + }, + MAP(Collections.unmodifiableMap(new HashMap()).getClass(), SOURCE_MAP_FIELD) { + @Override + public Object create(final Object sourceCollection) { + return Collections.unmodifiableMap((Map) sourceCollection); + } + + }, + SORTED_MAP(Collections.unmodifiableSortedMap(new TreeMap()).getClass(), SOURCE_MAP_FIELD) { + @Override + public Object create(final Object sourceCollection) { + return Collections.unmodifiableSortedMap((SortedMap) sourceCollection); + } + }; + + private final Class type; + private final Field sourceCollectionField; + + private UnmodifiableCollection(final Class type, final Field sourceCollectionField) { + this.type = type; + this.sourceCollectionField = sourceCollectionField; + } + + static UnmodifiableCollection valueOfType(final Class type) { + for (final UnmodifiableCollection item : values()) { + if (item.type.equals(type)) { + return item; + } + } + throw new IllegalArgumentException("The type " + type + " is not supported."); + } + + /** + * @param sourceCollection + */ + public abstract Object create(Object sourceCollection); + + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/cglib/CGLibProxySerializer.java b/src/main/java/de/javakaffee/kryoserializers/cglib/CGLibProxySerializer.java index 7f35a376..3998e5ae 100644 --- a/src/main/java/de/javakaffee/kryoserializers/cglib/CGLibProxySerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/cglib/CGLibProxySerializer.java @@ -16,58 +16,58 @@ */ package de.javakaffee.kryoserializers.cglib; -import net.sf.cglib.proxy.Callback; -import net.sf.cglib.proxy.Enhancer; -import net.sf.cglib.proxy.Factory; - import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.Serializer; import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output; +import net.sf.cglib.proxy.Callback; +import net.sf.cglib.proxy.Enhancer; +import net.sf.cglib.proxy.Factory; + /** * A kryo serializer for cglib proxies. It needs to be registered for {@link CGLibProxyMarker} class. * When the serializer for a certain class is requested (via {@link Kryo#getDefaultSerializer(Class)}) - * {@link #canSerialize(Class)} has to be checked with the provided class to see if + * {@link #canSerialize(Class)} has to be checked with the provided class to see if * a {@link CGLibProxySerializer} should be returned. - * + * * @author Martin Grotzke */ public class CGLibProxySerializer extends Serializer { - /** - * This class is used as a marker class - written to the class attribute - * on serialization and checked on deserialization (via {@link CGLibProxySerializer#canSerialize(Class)}). - */ - public static interface CGLibProxyMarker {} + /** + * This class is used as a marker class - written to the class attribute + * on serialization and checked on deserialization (via {@link CGLibProxySerializer#canSerialize(Class)}). + */ + public static interface CGLibProxyMarker {} + + public static final String DEFAULT_NAMING_MARKER = "$$EnhancerByCGLIB$$"; - public static final String DEFAULT_NAMING_MARKER = "$$EnhancerByCGLIB$$"; + public static boolean canSerialize(final Class cls) { + return Enhancer.isEnhanced(cls) && cls.getName().indexOf(DEFAULT_NAMING_MARKER) > 0; + } - public static boolean canSerialize( final Class cls ) { - return Enhancer.isEnhanced( cls ) && cls.getName().indexOf( DEFAULT_NAMING_MARKER ) > 0; - } - - @Override - public Object read(final Kryo kryo, final Input input, final Class type) { - final Class superclass = kryo.readClass( input ).getType(); - final Class[] interfaces = kryo.readObject(input, Class[].class); - final Callback[] callbacks = kryo.readObject(input, Callback[].class); - return createProxy( superclass, interfaces, callbacks ); - } + @Override + public Object read(final Kryo kryo, final Input input, final Class type) { + final Class superclass = kryo.readClass(input).getType(); + final Class[] interfaces = kryo.readObject(input, Class[].class); + final Callback[] callbacks = kryo.readObject(input, Callback[].class); + return createProxy(superclass, interfaces, callbacks); + } - @Override - public void write(final Kryo kryo, final Output output, final Object obj) { - kryo.writeClass( output, obj.getClass().getSuperclass() ); - kryo.writeObject( output, obj.getClass().getInterfaces() ); - kryo.writeObject( output, ((Factory)obj).getCallbacks() ); - } + @Override + public void write(final Kryo kryo, final Output output, final Object obj) { + kryo.writeClass(output, obj.getClass().getSuperclass()); + kryo.writeObject(output, obj.getClass().getInterfaces()); + kryo.writeObject(output, ((Factory) obj).getCallbacks()); + } - private Object createProxy( final Class targetClass, final Class[] interfaces, final Callback[] callbacks ) { - final Enhancer e = new Enhancer(); - e.setInterfaces( interfaces ); - e.setSuperclass( targetClass ); - e.setCallbacks( callbacks ); - return e.create(); - } + private Object createProxy(final Class targetClass, final Class[] interfaces, final Callback[] callbacks) { + final Enhancer e = new Enhancer(); + e.setInterfaces(interfaces); + e.setSuperclass(targetClass); + e.setCallbacks(callbacks); + return e.create(); + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/dexx/ListSerializer.java b/src/main/java/de/javakaffee/kryoserializers/dexx/ListSerializer.java index bdac1e04..c11aeeee 100644 --- a/src/main/java/de/javakaffee/kryoserializers/dexx/ListSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/dexx/ListSerializer.java @@ -1,10 +1,25 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers.dexx; import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.Serializer; import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output; - import com.github.andrewoma.dexx.collection.IndexedLists; import com.github.andrewoma.dexx.collection.List; @@ -13,58 +28,58 @@ */ public class ListSerializer extends Serializer { - private static final boolean DOES_NOT_ACCEPT_NULL = true; - private static final boolean IMMUTABLE = true; + private static final boolean DOES_NOT_ACCEPT_NULL = true; + private static final boolean IMMUTABLE = true; - public ListSerializer() { - super(DOES_NOT_ACCEPT_NULL, IMMUTABLE); - } + public ListSerializer() { + super(DOES_NOT_ACCEPT_NULL, IMMUTABLE); + } - @Override - public void write(Kryo kryo, Output output, List object) { - output.writeInt(object.size(), true); - for (Object elm : object) { - kryo.writeClassAndObject(output, elm); - } - } + @Override + public void write(Kryo kryo, Output output, List object) { + output.writeInt(object.size(), true); + for (Object elm : object) { + kryo.writeClassAndObject(output, elm); + } + } - @Override - public List read(Kryo kryo, Input input, Class aClass) { - final int size = input.readInt(true); - final Object[] list = new Object[size]; - for (int i = 0; i < size; ++i) { - list[i] = kryo.readClassAndObject(input); - } - return IndexedLists.copyOf(list); - } + @Override + public List read(Kryo kryo, Input input, Class aClass) { + final int size = input.readInt(true); + final Object[] list = new Object[size]; + for (int i = 0; i < size; ++i) { + list[i] = kryo.readClassAndObject(input); + } + return IndexedLists.copyOf(list); + } - /** - * Creates a new {@link de.javakaffee.kryoserializers.guava.ImmutableListSerializer} and registers its serializer - * - * @param kryo the {@link Kryo} instance to set the serializer on - */ - public static void registerSerializers(final Kryo kryo) { + /** + * Creates a new {@link de.javakaffee.kryoserializers.guava.ImmutableListSerializer} and registers its serializer + * + * @param kryo the {@link Kryo} instance to set the serializer on + */ + public static void registerSerializers(final Kryo kryo) { - final ListSerializer serializer = new ListSerializer(); + final ListSerializer serializer = new ListSerializer(); - kryo.register(List.class, serializer); + kryo.register(List.class, serializer); - // Note: - // Only registering above is good enough for serializing/deserializing. - // but if using Kryo#copy, following is required. + // Note: + // Only registering above is good enough for serializing/deserializing. + // but if using Kryo#copy, following is required. - kryo.register(IndexedLists.of().getClass(), serializer); - kryo.register(IndexedLists.of(1).getClass(), serializer); - kryo.register(IndexedLists.of(1,2).getClass(), serializer); - kryo.register(IndexedLists.of(1,2,3).getClass(), serializer); - kryo.register(IndexedLists.of(1,2,3,4).getClass(), serializer); - kryo.register(IndexedLists.of(1,2,3,4,5).getClass(), serializer); - kryo.register(IndexedLists.of(1,2,3,4,5,6).getClass(), serializer); - kryo.register(IndexedLists.of(1,2,3,4,5,6,7).getClass(), serializer); - kryo.register(IndexedLists.of(1,2,3,4,5,6,7,8).getClass(), serializer); - kryo.register(IndexedLists.of(1,2,3,4,5,6,7,8,9).getClass(), serializer); - kryo.register(IndexedLists.of(1,2,3,4,5,6,7,8,10).getClass(), serializer); - kryo.register(IndexedLists.of(1,2,3,4,5,6,7,8,10,11).getClass(), serializer); + kryo.register(IndexedLists.of().getClass(), serializer); + kryo.register(IndexedLists.of(1).getClass(), serializer); + kryo.register(IndexedLists.of(1, 2).getClass(), serializer); + kryo.register(IndexedLists.of(1, 2, 3).getClass(), serializer); + kryo.register(IndexedLists.of(1, 2, 3, 4).getClass(), serializer); + kryo.register(IndexedLists.of(1, 2, 3, 4, 5).getClass(), serializer); + kryo.register(IndexedLists.of(1, 2, 3, 4, 5, 6).getClass(), serializer); + kryo.register(IndexedLists.of(1, 2, 3, 4, 5, 6, 7).getClass(), serializer); + kryo.register(IndexedLists.of(1, 2, 3, 4, 5, 6, 7, 8).getClass(), serializer); + kryo.register(IndexedLists.of(1, 2, 3, 4, 5, 6, 7, 8, 9).getClass(), serializer); + kryo.register(IndexedLists.of(1, 2, 3, 4, 5, 6, 7, 8, 10).getClass(), serializer); + kryo.register(IndexedLists.of(1, 2, 3, 4, 5, 6, 7, 8, 10, 11).getClass(), serializer); - } + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/dexx/MapSerializer.java b/src/main/java/de/javakaffee/kryoserializers/dexx/MapSerializer.java index dbbb3433..48fc97c4 100644 --- a/src/main/java/de/javakaffee/kryoserializers/dexx/MapSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/dexx/MapSerializer.java @@ -1,73 +1,88 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers.dexx; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map.Entry; + import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.Serializer; import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output; - import com.github.andrewoma.dexx.collection.Map; import com.github.andrewoma.dexx.collection.Maps; import com.github.andrewoma.dexx.collection.Pair; -import java.util.HashMap; -import java.util.ArrayList; -import java.util.Map.Entry; - /** * A kryo {@link Serializer} for dexx {@link Map} */ public class MapSerializer extends Serializer> { - private static final boolean DOES_NOT_ACCEPT_NULL = true; - private static final boolean IMMUTABLE = true; - - public MapSerializer() { - super(DOES_NOT_ACCEPT_NULL, IMMUTABLE); - } - - @Override - public void write(Kryo kryo, Output output, Map immutableMap) { - kryo.writeObject(output, immutableMap.asMap()); - } - - @SuppressWarnings("unchecked") - @Override - public Map read(Kryo kryo, Input input, Class> type) { - HashMap map = kryo.readObject(input, HashMap.class); - ArrayList> listOfPairs = new ArrayList(); - - for (Entry entry : map.entrySet()) { - Pair pair = new Pair(entry.getKey(), entry.getValue()); - listOfPairs.add(pair); - } - - return Maps.copyOf(listOfPairs); - } - - /** - * Creates a new {@link de.javakaffee.kryoserializers.guava.ImmutableMapSerializer} and registers its serializer - * for the several ImmutableMap related classes. - * - * @param kryo the {@link Kryo} instance to set the serializer on - */ - public static void registerSerializers(final Kryo kryo) { - - final MapSerializer serializer = new MapSerializer(); - - kryo.register(Map.class, serializer); - kryo.register(Maps.of().getClass(), serializer); - - Object o1 = new Object(); - Object o2 = new Object(); - Object o3 = new Object(); - Object o4 = new Object(); - Object o5 = new Object(); - - kryo.register(Maps.of(o1, o1).getClass(), serializer); - kryo.register(Maps.of(o1, o1, o2, o2).getClass(), serializer); - kryo.register(Maps.of(o1, o1, o2, o2, o3, o3).getClass(), serializer); - kryo.register(Maps.of(o1, o1, o2, o2, o3, o3, o4, o4).getClass(), serializer); - kryo.register(Maps.of(o1, o1, o2, o2, o3, o3, o4, o4, o5, o5).getClass(), serializer); - - } + private static final boolean DOES_NOT_ACCEPT_NULL = true; + private static final boolean IMMUTABLE = true; + + public MapSerializer() { + super(DOES_NOT_ACCEPT_NULL, IMMUTABLE); + } + + @Override + public void write(Kryo kryo, Output output, Map immutableMap) { + kryo.writeObject(output, immutableMap.asMap()); + } + + @SuppressWarnings("unchecked") + @Override + public Map read(Kryo kryo, Input input, Class> type) { + HashMap map = kryo.readObject(input, HashMap.class); + ArrayList> listOfPairs = new ArrayList(); + + for (Entry entry : map.entrySet()) { + Pair pair = new Pair(entry.getKey(), entry.getValue()); + listOfPairs.add(pair); + } + + return Maps.copyOf(listOfPairs); + } + + /** + * Creates a new {@link de.javakaffee.kryoserializers.guava.ImmutableMapSerializer} and registers its serializer + * for the several ImmutableMap related classes. + * + * @param kryo the {@link Kryo} instance to set the serializer on + */ + public static void registerSerializers(final Kryo kryo) { + + final MapSerializer serializer = new MapSerializer(); + + kryo.register(Map.class, serializer); + kryo.register(Maps.of().getClass(), serializer); + + Object o1 = new Object(); + Object o2 = new Object(); + Object o3 = new Object(); + Object o4 = new Object(); + Object o5 = new Object(); + + kryo.register(Maps.of(o1, o1).getClass(), serializer); + kryo.register(Maps.of(o1, o1, o2, o2).getClass(), serializer); + kryo.register(Maps.of(o1, o1, o2, o2, o3, o3).getClass(), serializer); + kryo.register(Maps.of(o1, o1, o2, o2, o3, o3, o4, o4).getClass(), serializer); + kryo.register(Maps.of(o1, o1, o2, o2, o3, o3, o4, o4, o5, o5).getClass(), serializer); + + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/dexx/SetSerializer.java b/src/main/java/de/javakaffee/kryoserializers/dexx/SetSerializer.java index 92bf7f47..1d31ac92 100644 --- a/src/main/java/de/javakaffee/kryoserializers/dexx/SetSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/dexx/SetSerializer.java @@ -1,10 +1,25 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers.dexx; import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.Serializer; import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output; - import com.github.andrewoma.dexx.collection.Builder; import com.github.andrewoma.dexx.collection.Set; import com.github.andrewoma.dexx.collection.Sets; @@ -14,58 +29,58 @@ */ public class SetSerializer extends Serializer> { - private static final boolean DOES_NOT_ACCEPT_NULL = false; - private static final boolean IMMUTABLE = true; + private static final boolean DOES_NOT_ACCEPT_NULL = false; + private static final boolean IMMUTABLE = true; - public SetSerializer() { - super(DOES_NOT_ACCEPT_NULL, IMMUTABLE); - } + public SetSerializer() { + super(DOES_NOT_ACCEPT_NULL, IMMUTABLE); + } - @Override - public void write(Kryo kryo, Output output, Set object) { - output.writeInt(object.size(), true); - for (Object elm : object) { - kryo.writeClassAndObject(output, elm); - } - } + @Override + public void write(Kryo kryo, Output output, Set object) { + output.writeInt(object.size(), true); + for (Object elm : object) { + kryo.writeClassAndObject(output, elm); + } + } - @Override - public Set read(Kryo kryo, Input input, Class> type) { - final int size = input.readInt(true); - Builder> builder = Sets.builder(); - for (int i = 0; i < size; ++i) { - builder.add(kryo.readClassAndObject(input)); - } - return builder.build(); - } + @Override + public Set read(Kryo kryo, Input input, Class> type) { + final int size = input.readInt(true); + Builder> builder = Sets.builder(); + for (int i = 0; i < size; ++i) { + builder.add(kryo.readClassAndObject(input)); + } + return builder.build(); + } - /** - * Creates a new {@link de.javakaffee.kryoserializers.guava.ImmutableSetSerializer} and registers its serializer - * for the several ImmutableSet related classes. - * - * @param kryo the {@link Kryo} instance to set the serializer on - */ - public static void registerSerializers(final Kryo kryo) { + /** + * Creates a new {@link de.javakaffee.kryoserializers.guava.ImmutableSetSerializer} and registers its serializer + * for the several ImmutableSet related classes. + * + * @param kryo the {@link Kryo} instance to set the serializer on + */ + public static void registerSerializers(final Kryo kryo) { - final SetSerializer serializer = new SetSerializer(); + final SetSerializer serializer = new SetSerializer(); - kryo.register(Set.class, serializer); + kryo.register(Set.class, serializer); - // Note: - // Only registering above is good enough for serializing/deserializing. - // but if using Kryo#copy, following is required. + // Note: + // Only registering above is good enough for serializing/deserializing. + // but if using Kryo#copy, following is required. - kryo.register(Sets.of().getClass(), serializer); - kryo.register(Sets.of(1).getClass(), serializer); - kryo.register(Sets.of(1,2,3).getClass(), serializer); - kryo.register(Sets.of(1,2,3,4).getClass(), serializer); - kryo.register(Sets.of(1,2,3,4,5).getClass(), serializer); - kryo.register(Sets.of(1,2,3,4,5,6).getClass(), serializer); - kryo.register(Sets.of(1,2,3,4,5,6,7).getClass(), serializer); - kryo.register(Sets.of(1,2,3,4,5,6,7,8).getClass(), serializer); - kryo.register(Sets.of(1,2,3,4,5,6,7,8,9).getClass(), serializer); - kryo.register(Sets.of(1,2,3,4,5,6,7,8,9,10).getClass(), serializer); - kryo.register(Sets.of(1,2,3,4,5,6,7,8,9,10,11).getClass(), serializer); + kryo.register(Sets.of().getClass(), serializer); + kryo.register(Sets.of(1).getClass(), serializer); + kryo.register(Sets.of(1, 2, 3).getClass(), serializer); + kryo.register(Sets.of(1, 2, 3, 4).getClass(), serializer); + kryo.register(Sets.of(1, 2, 3, 4, 5).getClass(), serializer); + kryo.register(Sets.of(1, 2, 3, 4, 5, 6).getClass(), serializer); + kryo.register(Sets.of(1, 2, 3, 4, 5, 6, 7).getClass(), serializer); + kryo.register(Sets.of(1, 2, 3, 4, 5, 6, 7, 8).getClass(), serializer); + kryo.register(Sets.of(1, 2, 3, 4, 5, 6, 7, 8, 9).getClass(), serializer); + kryo.register(Sets.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10).getClass(), serializer); + kryo.register(Sets.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11).getClass(), serializer); - } + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/guava/ArrayListMultimapSerializer.java b/src/main/java/de/javakaffee/kryoserializers/guava/ArrayListMultimapSerializer.java index 90c24e66..aa3ef364 100644 --- a/src/main/java/de/javakaffee/kryoserializers/guava/ArrayListMultimapSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/guava/ArrayListMultimapSerializer.java @@ -1,10 +1,25 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers.guava; import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.Serializer; import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output; - import com.google.common.collect.ArrayListMultimap; /** @@ -13,33 +28,33 @@ */ public class ArrayListMultimapSerializer extends MultimapSerializerBase> { - private static final boolean DOES_NOT_ACCEPT_NULL = false; - - private static final boolean IMMUTABLE = false; - - public ArrayListMultimapSerializer() { - super(DOES_NOT_ACCEPT_NULL, IMMUTABLE); - } - - @Override - public void write(Kryo kryo, Output output, ArrayListMultimap multimap) { - writeMultimap(kryo, output, multimap); - } - - @Override - public ArrayListMultimap read(Kryo kryo, Input input, Class> type) { - final ArrayListMultimap multimap = ArrayListMultimap.create(); - readMultimap(kryo, input, multimap); - return multimap; - } - - /** - * Creates a new {@link ArrayListMultimapSerializer} and registers its serializer. - * - * @param kryo the {@link Kryo} instance to set the serializer on - */ - public static void registerSerializers(final Kryo kryo) { - final ArrayListMultimapSerializer serializer = new ArrayListMultimapSerializer(); - kryo.register(ArrayListMultimap.class, serializer); - } + private static final boolean DOES_NOT_ACCEPT_NULL = false; + + private static final boolean IMMUTABLE = false; + + public ArrayListMultimapSerializer() { + super(DOES_NOT_ACCEPT_NULL, IMMUTABLE); + } + + @Override + public void write(Kryo kryo, Output output, ArrayListMultimap multimap) { + writeMultimap(kryo, output, multimap); + } + + @Override + public ArrayListMultimap read(Kryo kryo, Input input, Class> type) { + final ArrayListMultimap multimap = ArrayListMultimap.create(); + readMultimap(kryo, input, multimap); + return multimap; + } + + /** + * Creates a new {@link ArrayListMultimapSerializer} and registers its serializer. + * + * @param kryo the {@link Kryo} instance to set the serializer on + */ + public static void registerSerializers(final Kryo kryo) { + final ArrayListMultimapSerializer serializer = new ArrayListMultimapSerializer(); + kryo.register(ArrayListMultimap.class, serializer); + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/guava/HashMultimapSerializer.java b/src/main/java/de/javakaffee/kryoserializers/guava/HashMultimapSerializer.java index 23d9af33..0cf09c9a 100644 --- a/src/main/java/de/javakaffee/kryoserializers/guava/HashMultimapSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/guava/HashMultimapSerializer.java @@ -1,10 +1,25 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers.guava; import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.Serializer; import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output; - import com.google.common.collect.HashMultimap; /** @@ -13,33 +28,33 @@ */ public class HashMultimapSerializer extends MultimapSerializerBase> { - private static final boolean DOES_NOT_ACCEPT_NULL = false; - - private static final boolean IMMUTABLE = false; - - public HashMultimapSerializer() { - super(DOES_NOT_ACCEPT_NULL, IMMUTABLE); - } - - @Override - public void write(Kryo kryo, Output output, HashMultimap multimap) { - writeMultimap(kryo, output, multimap); - } - - @Override - public HashMultimap read(Kryo kryo, Input input, Class> type) { - final HashMultimap multimap = HashMultimap.create(); - readMultimap(kryo, input, multimap); - return multimap; - } - - /** - * Creates a new {@link HashMultimapSerializer} and registers its serializer. - * - * @param kryo the {@link Kryo} instance to set the serializer on - */ - public static void registerSerializers(final Kryo kryo) { - final HashMultimapSerializer serializer = new HashMultimapSerializer(); - kryo.register(HashMultimap.class, serializer); - } + private static final boolean DOES_NOT_ACCEPT_NULL = false; + + private static final boolean IMMUTABLE = false; + + public HashMultimapSerializer() { + super(DOES_NOT_ACCEPT_NULL, IMMUTABLE); + } + + @Override + public void write(Kryo kryo, Output output, HashMultimap multimap) { + writeMultimap(kryo, output, multimap); + } + + @Override + public HashMultimap read(Kryo kryo, Input input, Class> type) { + final HashMultimap multimap = HashMultimap.create(); + readMultimap(kryo, input, multimap); + return multimap; + } + + /** + * Creates a new {@link HashMultimapSerializer} and registers its serializer. + * + * @param kryo the {@link Kryo} instance to set the serializer on + */ + public static void registerSerializers(final Kryo kryo) { + final HashMultimapSerializer serializer = new HashMultimapSerializer(); + kryo.register(HashMultimap.class, serializer); + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableListSerializer.java b/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableListSerializer.java index f12b3e8c..52681510 100644 --- a/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableListSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableListSerializer.java @@ -1,3 +1,19 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers.guava; import com.esotericsoftware.kryo.Kryo; @@ -15,73 +31,73 @@ */ public class ImmutableListSerializer extends Serializer> { - private static final boolean DOES_NOT_ACCEPT_NULL = false; - private static final boolean IMMUTABLE = true; + private static final boolean DOES_NOT_ACCEPT_NULL = false; + private static final boolean IMMUTABLE = true; - public ImmutableListSerializer() { - super(DOES_NOT_ACCEPT_NULL, IMMUTABLE); - } + public ImmutableListSerializer() { + super(DOES_NOT_ACCEPT_NULL, IMMUTABLE); + } - @Override - public void write(Kryo kryo, Output output, ImmutableList object) { - output.writeInt(object.size(), true); - for (Object elm : object) { - kryo.writeClassAndObject(output, elm); - } - } + @Override + public void write(Kryo kryo, Output output, ImmutableList object) { + output.writeInt(object.size(), true); + for (Object elm : object) { + kryo.writeClassAndObject(output, elm); + } + } - @Override - public ImmutableList read(Kryo kryo, Input input, Class> type) { - final int size = input.readInt(true); - final Object[] list = new Object[size]; - for (int i = 0; i < size; ++i) { - list[i] = kryo.readClassAndObject(input); - } - return ImmutableList.copyOf(list); - } + @Override + public ImmutableList read(Kryo kryo, Input input, Class> type) { + final int size = input.readInt(true); + final Object[] list = new Object[size]; + for (int i = 0; i < size; ++i) { + list[i] = kryo.readClassAndObject(input); + } + return ImmutableList.copyOf(list); + } - /** - * Creates a new {@link ImmutableListSerializer} and registers its serializer - * for the several ImmutableList related classes. - * - * @param kryo the {@link Kryo} instance to set the serializer on - */ - public static void registerSerializers(final Kryo kryo) { + /** + * Creates a new {@link ImmutableListSerializer} and registers its serializer + * for the several ImmutableList related classes. + * + * @param kryo the {@link Kryo} instance to set the serializer on + */ + public static void registerSerializers(final Kryo kryo) { - // ImmutableList (abstract class) - // +- RegularImmutableList - // | RegularImmutableList - // +- SingletonImmutableList - // | Optimized for List with only 1 element. - // +- SubList - // | Representation for part of ImmutableList - // +- ReverseImmutableList - // | For iterating in reverse order - // +- StringAsImmutableList - // | Used by Lists#charactersOf - // +- Values (ImmutableTable values) - // Used by return value of #values() when there are multiple cells + // ImmutableList (abstract class) + // +- RegularImmutableList + // | RegularImmutableList + // +- SingletonImmutableList + // | Optimized for List with only 1 element. + // +- SubList + // | Representation for part of ImmutableList + // +- ReverseImmutableList + // | For iterating in reverse order + // +- StringAsImmutableList + // | Used by Lists#charactersOf + // +- Values (ImmutableTable values) + // Used by return value of #values() when there are multiple cells - final ImmutableListSerializer serializer = new ImmutableListSerializer(); + final ImmutableListSerializer serializer = new ImmutableListSerializer(); - kryo.register(ImmutableList.class, serializer); + kryo.register(ImmutableList.class, serializer); - // Note: - // Only registering above is good enough for serializing/deserializing. - // but if using Kryo#copy, following is required. + // Note: + // Only registering above is good enough for serializing/deserializing. + // but if using Kryo#copy, following is required. - kryo.register(ImmutableList.of().getClass(), serializer); - kryo.register(ImmutableList.of(1).getClass(), serializer); - kryo.register(ImmutableList.of(1, 2, 3, 4).subList(1, 3).getClass(), serializer); - kryo.register(ImmutableList.of(1, 2).reverse().getClass(), serializer); + kryo.register(ImmutableList.of().getClass(), serializer); + kryo.register(ImmutableList.of(1).getClass(), serializer); + kryo.register(ImmutableList.of(1, 2, 3, 4).subList(1, 3).getClass(), serializer); + kryo.register(ImmutableList.of(1, 2).reverse().getClass(), serializer); - kryo.register(Lists.charactersOf("KryoRocks").getClass(), serializer); + kryo.register(Lists.charactersOf("KryoRocks").getClass(), serializer); - Table baseTable = HashBasedTable.create(); - baseTable.put(1, 2, 3); - baseTable.put(4, 5, 6); - Table table = ImmutableTable.copyOf(baseTable); - kryo.register(table.values().getClass(), serializer); + Table baseTable = HashBasedTable.create(); + baseTable.put(1, 2, 3); + baseTable.put(4, 5, 6); + Table table = ImmutableTable.copyOf(baseTable); + kryo.register(table.values().getClass(), serializer); - } + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableMapSerializer.java b/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableMapSerializer.java index af7157c5..267093b3 100644 --- a/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableMapSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableMapSerializer.java @@ -1,5 +1,25 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers.guava; +import java.util.EnumMap; +import java.util.HashMap; +import java.util.Map; + import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.Serializer; import com.esotericsoftware.kryo.io.Input; @@ -7,64 +27,59 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; -import java.util.EnumMap; -import java.util.HashMap; -import java.util.Map; - - /** * A kryo {@link Serializer} for guava-libraries {@link ImmutableMap}. */ public class ImmutableMapSerializer extends Serializer> { - private static final boolean DOES_NOT_ACCEPT_NULL = true; - private static final boolean IMMUTABLE = true; + private static final boolean DOES_NOT_ACCEPT_NULL = true; + private static final boolean IMMUTABLE = true; - public ImmutableMapSerializer() { - super(DOES_NOT_ACCEPT_NULL, IMMUTABLE); - } + public ImmutableMapSerializer() { + super(DOES_NOT_ACCEPT_NULL, IMMUTABLE); + } - @Override - public void write(Kryo kryo, Output output, ImmutableMap immutableMap) { - kryo.writeObject(output, Maps.newHashMap(immutableMap)); - } + @Override + public void write(Kryo kryo, Output output, ImmutableMap immutableMap) { + kryo.writeObject(output, Maps.newHashMap(immutableMap)); + } - @SuppressWarnings("unchecked") - @Override - public ImmutableMap read(Kryo kryo, Input input, Class> type) { - Map map = kryo.readObject(input, HashMap.class); - return ImmutableMap.copyOf(map); - } + @SuppressWarnings("unchecked") + @Override + public ImmutableMap read(Kryo kryo, Input input, Class> type) { + Map map = kryo.readObject(input, HashMap.class); + return ImmutableMap.copyOf(map); + } - /** - * Creates a new {@link ImmutableMapSerializer} and registers its serializer - * for the several ImmutableMap related classes. - * - * @param kryo the {@link Kryo} instance to set the serializer on - */ - public static void registerSerializers(final Kryo kryo) { + /** + * Creates a new {@link ImmutableMapSerializer} and registers its serializer + * for the several ImmutableMap related classes. + * + * @param kryo the {@link Kryo} instance to set the serializer on + */ + public static void registerSerializers(final Kryo kryo) { - final ImmutableMapSerializer serializer = new ImmutableMapSerializer(); + final ImmutableMapSerializer serializer = new ImmutableMapSerializer(); - kryo.register(ImmutableMap.class, serializer); - kryo.register(ImmutableMap.of().getClass(), serializer); + kryo.register(ImmutableMap.class, serializer); + kryo.register(ImmutableMap.of().getClass(), serializer); - Object o1 = new Object(); - Object o2 = new Object(); + Object o1 = new Object(); + Object o2 = new Object(); - kryo.register(ImmutableMap.of(o1, o1).getClass(), serializer); - kryo.register(ImmutableMap.of(o1, o1, o2, o2).getClass(), serializer); + kryo.register(ImmutableMap.of(o1, o1).getClass(), serializer); + kryo.register(ImmutableMap.of(o1, o1, o2, o2).getClass(), serializer); - Map enumMap = new EnumMap(DummyEnum.class); - for (DummyEnum e : DummyEnum.values()) { - enumMap.put(e, o1); - } + Map enumMap = new EnumMap(DummyEnum.class); + for (DummyEnum e : DummyEnum.values()) { + enumMap.put(e, o1); + } - kryo.register(ImmutableMap.copyOf(enumMap).getClass(), serializer); - } + kryo.register(ImmutableMap.copyOf(enumMap).getClass(), serializer); + } - private enum DummyEnum { - VALUE1, - VALUE2 - } + private enum DummyEnum { + VALUE1, + VALUE2 + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableMultimapSerializer.java b/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableMultimapSerializer.java index 05f5625e..a7e6a833 100644 --- a/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableMultimapSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableMultimapSerializer.java @@ -1,10 +1,29 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers.guava; +import java.util.List; +import java.util.Map; +import java.util.Set; + import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.Serializer; import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output; - import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableListMultimap; import com.google.common.collect.ImmutableMap; @@ -12,94 +31,88 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSetMultimap; -import java.util.List; -import java.util.Map; -import java.util.Set; - /** * A kryo {@link Serializer} for guava-libraries {@link ImmutableMultimap}. */ public class ImmutableMultimapSerializer extends Serializer> { - private static final boolean DOES_NOT_ACCEPT_NULL = true; - private static final boolean IMMUTABLE = true; - - public ImmutableMultimapSerializer() { - super(DOES_NOT_ACCEPT_NULL, IMMUTABLE); - } - - @Override - public void write(Kryo kryo, Output output, ImmutableMultimap immutableMultiMap) { - kryo.writeObject(output, ImmutableMap.copyOf(immutableMultiMap.asMap())); - } - - @SuppressWarnings("unchecked") - @Override - public ImmutableMultimap read(Kryo kryo, Input input, Class> type) { - final ImmutableMultimap.Builder builder; - if (type.equals (ImmutableListMultimap.class)) { - builder = ImmutableMultimap.builder(); - } - else if (type.equals (ImmutableSetMultimap.class)) { - builder = ImmutableSetMultimap.builder(); - } - else { - builder = ImmutableMultimap.builder(); - } - - final Map map = kryo.readObject(input, ImmutableMap.class); - final Set>> entries = map.entrySet(); - - for (Map.Entry> entry : entries) { - builder.putAll(entry.getKey(), entry.getValue()); - } - - return builder.build(); - } - - /** - * Creates a new {@link ImmutableMultimapSerializer} and registers its serializer - * for the several ImmutableMultimap related classes. - * - * @param kryo the {@link Kryo} instance to set the serializer on - */ - public static void registerSerializers(final Kryo kryo) { - // ImmutableMap is used by ImmutableMultimap. However, - // we already have a separate serializer class for ImmutableMap, - // ImmutableMapSerializer. If it is not already being used, register it. - Serializer immutableMapSerializer = kryo.getSerializer(ImmutableMap.class); - if (!(immutableMapSerializer instanceof ImmutableMapSerializer)) { - ImmutableMapSerializer.registerSerializers(kryo); - } - - // ImmutableList is used by ImmutableListMultimap. However, - // we already have a separate serializer class for ImmutableList, - // ImmutableListSerializer. If it is not already being used, register it. - Serializer immutableListSerializer = kryo.getSerializer(ImmutableList.class); - if (!(immutableListSerializer instanceof ImmutableListSerializer)) { - ImmutableListSerializer.registerSerializers(kryo); - } - - // ImmutableSet is used by ImmutableSetMultimap. However, - // we already have a separate serializer class for ImmutableSet, - // ImmutableSetSerializer. If it is not already being used, register it. - Serializer immutableSetSerializer = kryo.getSerializer(ImmutableSet.class); - if (!(immutableSetSerializer instanceof ImmutableSetSerializer)) { - ImmutableSetSerializer.registerSerializers(kryo); - } - - final ImmutableMultimapSerializer serializer = new ImmutableMultimapSerializer(); - - // ImmutableMultimap (abstract class) - // +- EmptyImmutableListMultimap - // +- ImmutableListMultimap - // +- EmptyImmutableSetMultimap - // +- ImmutableSetMultimap - - kryo.register(ImmutableMultimap.class, serializer); - kryo.register(ImmutableListMultimap.of().getClass(), serializer); - kryo.register(ImmutableListMultimap.of("A", "B").getClass(), serializer); - kryo.register(ImmutableSetMultimap.of().getClass(), serializer); - kryo.register(ImmutableSetMultimap.of("A", "B").getClass(), serializer); - } + private static final boolean DOES_NOT_ACCEPT_NULL = true; + private static final boolean IMMUTABLE = true; + + public ImmutableMultimapSerializer() { + super(DOES_NOT_ACCEPT_NULL, IMMUTABLE); + } + + @Override + public void write(Kryo kryo, Output output, ImmutableMultimap immutableMultiMap) { + kryo.writeObject(output, ImmutableMap.copyOf(immutableMultiMap.asMap())); + } + + @SuppressWarnings("unchecked") + @Override + public ImmutableMultimap read(Kryo kryo, Input input, Class> type) { + final ImmutableMultimap.Builder builder; + if (type.equals(ImmutableListMultimap.class)) { + builder = ImmutableMultimap.builder(); + } else if (type.equals(ImmutableSetMultimap.class)) { + builder = ImmutableSetMultimap.builder(); + } else { + builder = ImmutableMultimap.builder(); + } + + final Map map = kryo.readObject(input, ImmutableMap.class); + final Set>> entries = map.entrySet(); + + for (Map.Entry> entry : entries) { + builder.putAll(entry.getKey(), entry.getValue()); + } + + return builder.build(); + } + + /** + * Creates a new {@link ImmutableMultimapSerializer} and registers its serializer + * for the several ImmutableMultimap related classes. + * + * @param kryo the {@link Kryo} instance to set the serializer on + */ + public static void registerSerializers(final Kryo kryo) { + // ImmutableMap is used by ImmutableMultimap. However, + // we already have a separate serializer class for ImmutableMap, + // ImmutableMapSerializer. If it is not already being used, register it. + Serializer immutableMapSerializer = kryo.getSerializer(ImmutableMap.class); + if (!(immutableMapSerializer instanceof ImmutableMapSerializer)) { + ImmutableMapSerializer.registerSerializers(kryo); + } + + // ImmutableList is used by ImmutableListMultimap. However, + // we already have a separate serializer class for ImmutableList, + // ImmutableListSerializer. If it is not already being used, register it. + Serializer immutableListSerializer = kryo.getSerializer(ImmutableList.class); + if (!(immutableListSerializer instanceof ImmutableListSerializer)) { + ImmutableListSerializer.registerSerializers(kryo); + } + + // ImmutableSet is used by ImmutableSetMultimap. However, + // we already have a separate serializer class for ImmutableSet, + // ImmutableSetSerializer. If it is not already being used, register it. + Serializer immutableSetSerializer = kryo.getSerializer(ImmutableSet.class); + if (!(immutableSetSerializer instanceof ImmutableSetSerializer)) { + ImmutableSetSerializer.registerSerializers(kryo); + } + + final ImmutableMultimapSerializer serializer = new ImmutableMultimapSerializer(); + + // ImmutableMultimap (abstract class) + // +- EmptyImmutableListMultimap + // +- ImmutableListMultimap + // +- EmptyImmutableSetMultimap + // +- ImmutableSetMultimap + + kryo.register(ImmutableMultimap.class, serializer); + kryo.register(ImmutableListMultimap.of().getClass(), serializer); + kryo.register(ImmutableListMultimap.of("A", "B").getClass(), serializer); + kryo.register(ImmutableSetMultimap.of().getClass(), serializer); + kryo.register(ImmutableSetMultimap.of("A", "B").getClass(), serializer); + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableSetSerializer.java b/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableSetSerializer.java index a67102fa..4a9ff76b 100644 --- a/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableSetSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableSetSerializer.java @@ -1,3 +1,19 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers.guava; import com.esotericsoftware.kryo.Kryo; @@ -15,65 +31,67 @@ */ public class ImmutableSetSerializer extends Serializer> { - private static final boolean DOES_NOT_ACCEPT_NULL = false; - private static final boolean IMMUTABLE = true; + private static final boolean DOES_NOT_ACCEPT_NULL = false; + private static final boolean IMMUTABLE = true; - public ImmutableSetSerializer() { - super(DOES_NOT_ACCEPT_NULL, IMMUTABLE); - } + public ImmutableSetSerializer() { + super(DOES_NOT_ACCEPT_NULL, IMMUTABLE); + } - @Override - public void write(Kryo kryo, Output output, ImmutableSet object) { - output.writeInt(object.size(), true); - for (Object elm : object) { - kryo.writeClassAndObject(output, elm); - } - } + @Override + public void write(Kryo kryo, Output output, ImmutableSet object) { + output.writeInt(object.size(), true); + for (Object elm : object) { + kryo.writeClassAndObject(output, elm); + } + } - @Override - public ImmutableSet read(Kryo kryo, Input input, Class> type) { - final int size = input.readInt(true); - ImmutableSet.Builder builder = ImmutableSet.builder(); - for (int i = 0; i < size; ++i) { - builder.add(kryo.readClassAndObject(input)); - } - return builder.build(); - } + @Override + public ImmutableSet read(Kryo kryo, Input input, Class> type) { + final int size = input.readInt(true); + ImmutableSet.Builder builder = ImmutableSet.builder(); + for (int i = 0; i < size; ++i) { + builder.add(kryo.readClassAndObject(input)); + } + return builder.build(); + } - /** - * Creates a new {@link ImmutableSetSerializer} and registers its serializer - * for the several ImmutableSet related classes. - * - * @param kryo the {@link Kryo} instance to set the serializer on - */ - public static void registerSerializers(final Kryo kryo) { + /** + * Creates a new {@link ImmutableSetSerializer} and registers its serializer + * for the several ImmutableSet related classes. + * + * @param kryo the {@link Kryo} instance to set the serializer on + */ + public static void registerSerializers(final Kryo kryo) { - // ImmutableList (abstract class) - // +- EmptyImmutableSet - // | EmptyImmutableSet - // +- SingletonImmutableSet - // | Optimized for Set with only 1 element. - // +- RegularImmutableSet - // | RegularImmutableList - // +- EnumImmutableSet - // | EnumImmutableSet + // ImmutableList (abstract class) + // +- EmptyImmutableSet + // | EmptyImmutableSet + // +- SingletonImmutableSet + // | Optimized for Set with only 1 element. + // +- RegularImmutableSet + // | RegularImmutableList + // +- EnumImmutableSet + // | EnumImmutableSet - final ImmutableSetSerializer serializer = new ImmutableSetSerializer(); + final ImmutableSetSerializer serializer = new ImmutableSetSerializer(); - kryo.register(ImmutableSet.class, serializer); + kryo.register(ImmutableSet.class, serializer); - // Note: - // Only registering above is good enough for serializing/deserializing. - // but if using Kryo#copy, following is required. + // Note: + // Only registering above is good enough for serializing/deserializing. + // but if using Kryo#copy, following is required. - kryo.register(ImmutableSet.of().getClass(), serializer); - kryo.register(ImmutableSet.of(1).getClass(), serializer); - kryo.register(ImmutableSet.of(1,2,3).getClass(), serializer); + kryo.register(ImmutableSet.of().getClass(), serializer); + kryo.register(ImmutableSet.of(1).getClass(), serializer); + kryo.register(ImmutableSet.of(1, 2, 3).getClass(), serializer); - kryo.register(Sets.immutableEnumSet(SomeEnum.A, SomeEnum.B, SomeEnum.C).getClass(), serializer); - } + kryo.register(Sets.immutableEnumSet(SomeEnum.A, SomeEnum.B, SomeEnum.C).getClass(), serializer); + } - private enum SomeEnum { - A, B, C - } -} \ No newline at end of file + private enum SomeEnum { + A, + B, + C + } +} diff --git a/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableSortedMapSerializer.java b/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableSortedMapSerializer.java index a719491f..f7140d53 100644 --- a/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableSortedMapSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableSortedMapSerializer.java @@ -1,5 +1,25 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers.guava; +import java.util.EnumMap; +import java.util.Map; +import java.util.TreeMap; + import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.Serializer; import com.esotericsoftware.kryo.io.Input; @@ -7,76 +27,71 @@ import com.google.common.collect.ImmutableSortedMap; import com.google.common.collect.Maps; -import java.util.EnumMap; -import java.util.Map; -import java.util.TreeMap; - - /** * A kryo {@link Serializer} for guava-libraries {@link ImmutableSortedMap}. */ public class ImmutableSortedMapSerializer extends Serializer> { - private static final boolean DOES_NOT_ACCEPT_NULL = true; - private static final boolean IMMUTABLE = true; - - public ImmutableSortedMapSerializer() { - super(DOES_NOT_ACCEPT_NULL, IMMUTABLE); - } - - @Override - public void write(Kryo kryo, Output output, ImmutableSortedMap immutableMap) { - kryo.writeObject(output, Maps.newTreeMap(immutableMap)); - } - - @SuppressWarnings("unchecked") - @Override - public ImmutableSortedMap read(Kryo kryo, Input input, Class> type) { - Map map = kryo.readObject(input, TreeMap.class); - return ImmutableSortedMap.copyOf(map); - } - - /** - * Creates a new {@link ImmutableSortedMapSerializer} and registers its serializer - * for the several ImmutableMap related classes. - * - * @param kryo the {@link Kryo} instance to set the serializer on - */ - public static void registerSerializers(final Kryo kryo) { - - final ImmutableSortedMapSerializer serializer = new ImmutableSortedMapSerializer(); - - kryo.register(ImmutableSortedMap.class, serializer); - kryo.register(ImmutableSortedMap.of().getClass(), serializer); - - final Comparable k1 = new Comparable() { - @Override - public int compareTo(Object o) { - return o == this ? 0 : -1; - } - }; - final Comparable k2 = new Comparable() { - @Override - public int compareTo(Object o) { - return o == this ? 0 : 1; - } - }; - final Object v1 = new Object(); - final Object v2 = new Object(); - - kryo.register(ImmutableSortedMap.of(k1, v1).getClass(), serializer); - kryo.register(ImmutableSortedMap.of(k1, v1, k2, v2).getClass(), serializer); - - Map enumMap = new EnumMap(DummyEnum.class); - for (DummyEnum e : DummyEnum.values()) { - enumMap.put(e, v1); - } - - kryo.register(ImmutableSortedMap.copyOf(enumMap).getClass(), serializer); - } - - private enum DummyEnum { - VALUE1, - VALUE2 - } + private static final boolean DOES_NOT_ACCEPT_NULL = true; + private static final boolean IMMUTABLE = true; + + public ImmutableSortedMapSerializer() { + super(DOES_NOT_ACCEPT_NULL, IMMUTABLE); + } + + @Override + public void write(Kryo kryo, Output output, ImmutableSortedMap immutableMap) { + kryo.writeObject(output, Maps.newTreeMap(immutableMap)); + } + + @SuppressWarnings("unchecked") + @Override + public ImmutableSortedMap read(Kryo kryo, Input input, Class> type) { + Map map = kryo.readObject(input, TreeMap.class); + return ImmutableSortedMap.copyOf(map); + } + + /** + * Creates a new {@link ImmutableSortedMapSerializer} and registers its serializer + * for the several ImmutableMap related classes. + * + * @param kryo the {@link Kryo} instance to set the serializer on + */ + public static void registerSerializers(final Kryo kryo) { + + final ImmutableSortedMapSerializer serializer = new ImmutableSortedMapSerializer(); + + kryo.register(ImmutableSortedMap.class, serializer); + kryo.register(ImmutableSortedMap.of().getClass(), serializer); + + final Comparable k1 = new Comparable() { + @Override + public int compareTo(Object o) { + return o == this ? 0 : -1; + } + }; + final Comparable k2 = new Comparable() { + @Override + public int compareTo(Object o) { + return o == this ? 0 : 1; + } + }; + final Object v1 = new Object(); + final Object v2 = new Object(); + + kryo.register(ImmutableSortedMap.of(k1, v1).getClass(), serializer); + kryo.register(ImmutableSortedMap.of(k1, v1, k2, v2).getClass(), serializer); + + Map enumMap = new EnumMap(DummyEnum.class); + for (DummyEnum e : DummyEnum.values()) { + enumMap.put(e, v1); + } + + kryo.register(ImmutableSortedMap.copyOf(enumMap).getClass(), serializer); + } + + private enum DummyEnum { + VALUE1, + VALUE2 + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableSortedSetSerializer.java b/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableSortedSetSerializer.java index 3cebb7a5..462e9f16 100644 --- a/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableSortedSetSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableSortedSetSerializer.java @@ -1,62 +1,79 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers.guava; +import java.util.Comparator; + import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.Serializer; import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output; import com.google.common.collect.ImmutableSortedSet; -import java.util.Comparator; /** * A kryo {@link Serializer} for guava-libraries {@link ImmutableSortedSet}. */ public class ImmutableSortedSetSerializer extends Serializer> { - private static final boolean DOES_NOT_ACCEPT_NULL = false; - private static final boolean IMMUTABLE = true; - - public ImmutableSortedSetSerializer() { - super(DOES_NOT_ACCEPT_NULL, IMMUTABLE); - } - - @Override - public void write(Kryo kryo, Output output, ImmutableSortedSet object) { - kryo.writeClassAndObject(output, object.comparator()); - output.writeInt(object.size(), true); - for (Object elm : object) { - kryo.writeClassAndObject(output, elm); - } - } - - @Override - public ImmutableSortedSet read(Kryo kryo, Input input, Class> type) { - @SuppressWarnings ("unchecked") - ImmutableSortedSet.Builder builder = ImmutableSortedSet.orderedBy((Comparator)kryo.readClassAndObject (input)); - final int size = input.readInt(true); - for (int i = 0; i < size; ++i) { - builder.add(kryo.readClassAndObject(input)); - } - return builder.build(); - } - - /** - * Creates a new {@link ImmutableSortedSetSerializer} and registers its serializer - * for the several ImmutableSortedSet related classes. - * - * @param kryo the {@link Kryo} instance to set the serializer on - */ - public static void registerSerializers(final Kryo kryo) { - - // ImmutableSortedSet (abstract class) - // +- EmptyImmutableSortedSet - // +- RegularImmutableSortedSet - // +- DescendingImmutableSortedSet - - final ImmutableSortedSetSerializer serializer = new ImmutableSortedSetSerializer(); - - kryo.register(ImmutableSortedSet.class, serializer); - kryo.register(ImmutableSortedSet.of().getClass(), serializer); - kryo.register(ImmutableSortedSet.of("").getClass(), serializer); - kryo.register(ImmutableSortedSet.of().descendingSet ().getClass(), serializer); - } + private static final boolean DOES_NOT_ACCEPT_NULL = false; + private static final boolean IMMUTABLE = true; + + public ImmutableSortedSetSerializer() { + super(DOES_NOT_ACCEPT_NULL, IMMUTABLE); + } + + @Override + public void write(Kryo kryo, Output output, ImmutableSortedSet object) { + kryo.writeClassAndObject(output, object.comparator()); + output.writeInt(object.size(), true); + for (Object elm : object) { + kryo.writeClassAndObject(output, elm); + } + } + + @Override + public ImmutableSortedSet read(Kryo kryo, Input input, Class> type) { + @SuppressWarnings("unchecked") + ImmutableSortedSet.Builder builder = ImmutableSortedSet.orderedBy((Comparator) kryo.readClassAndObject(input)); + final int size = input.readInt(true); + for (int i = 0; i < size; ++i) { + builder.add(kryo.readClassAndObject(input)); + } + return builder.build(); + } + + /** + * Creates a new {@link ImmutableSortedSetSerializer} and registers its serializer + * for the several ImmutableSortedSet related classes. + * + * @param kryo the {@link Kryo} instance to set the serializer on + */ + public static void registerSerializers(final Kryo kryo) { + + // ImmutableSortedSet (abstract class) + // +- EmptyImmutableSortedSet + // +- RegularImmutableSortedSet + // +- DescendingImmutableSortedSet + + final ImmutableSortedSetSerializer serializer = new ImmutableSortedSetSerializer(); + + kryo.register(ImmutableSortedSet.class, serializer); + kryo.register(ImmutableSortedSet.of().getClass(), serializer); + kryo.register(ImmutableSortedSet.of("").getClass(), serializer); + kryo.register(ImmutableSortedSet.of().descendingSet().getClass(), serializer); + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/guava/LinkedHashMultimapSerializer.java b/src/main/java/de/javakaffee/kryoserializers/guava/LinkedHashMultimapSerializer.java index 7099e8b7..fbcad104 100644 --- a/src/main/java/de/javakaffee/kryoserializers/guava/LinkedHashMultimapSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/guava/LinkedHashMultimapSerializer.java @@ -1,10 +1,25 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers.guava; import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.Serializer; import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output; - import com.google.common.collect.LinkedHashMultimap; /** @@ -13,33 +28,33 @@ */ public class LinkedHashMultimapSerializer extends MultimapSerializerBase> { - private static final boolean DOES_NOT_ACCEPT_NULL = false; - - private static final boolean IMMUTABLE = false; - - public LinkedHashMultimapSerializer() { - super(DOES_NOT_ACCEPT_NULL, IMMUTABLE); - } - - @Override - public void write(Kryo kryo, Output output, LinkedHashMultimap multimap) { - writeMultimap(kryo, output, multimap); - } - - @Override - public LinkedHashMultimap read(Kryo kryo, Input input, Class> type) { - final LinkedHashMultimap multimap = LinkedHashMultimap.create(); - readMultimap(kryo, input, multimap); - return multimap; - } - - /** - * Creates a new {@link LinkedHashMultimapSerializer} and registers its serializer. - * - * @param kryo the {@link Kryo} instance to set the serializer on - */ - public static void registerSerializers(final Kryo kryo) { - final LinkedHashMultimapSerializer serializer = new LinkedHashMultimapSerializer(); - kryo.register(LinkedHashMultimap.class, serializer); - } + private static final boolean DOES_NOT_ACCEPT_NULL = false; + + private static final boolean IMMUTABLE = false; + + public LinkedHashMultimapSerializer() { + super(DOES_NOT_ACCEPT_NULL, IMMUTABLE); + } + + @Override + public void write(Kryo kryo, Output output, LinkedHashMultimap multimap) { + writeMultimap(kryo, output, multimap); + } + + @Override + public LinkedHashMultimap read(Kryo kryo, Input input, Class> type) { + final LinkedHashMultimap multimap = LinkedHashMultimap.create(); + readMultimap(kryo, input, multimap); + return multimap; + } + + /** + * Creates a new {@link LinkedHashMultimapSerializer} and registers its serializer. + * + * @param kryo the {@link Kryo} instance to set the serializer on + */ + public static void registerSerializers(final Kryo kryo) { + final LinkedHashMultimapSerializer serializer = new LinkedHashMultimapSerializer(); + kryo.register(LinkedHashMultimap.class, serializer); + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/guava/LinkedListMultimapSerializer.java b/src/main/java/de/javakaffee/kryoserializers/guava/LinkedListMultimapSerializer.java index 5599b023..cb29b2b0 100644 --- a/src/main/java/de/javakaffee/kryoserializers/guava/LinkedListMultimapSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/guava/LinkedListMultimapSerializer.java @@ -1,10 +1,25 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers.guava; import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.Serializer; import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output; - import com.google.common.collect.LinkedListMultimap; /** @@ -13,33 +28,33 @@ */ public class LinkedListMultimapSerializer extends MultimapSerializerBase> { - private static final boolean DOES_NOT_ACCEPT_NULL = false; - - private static final boolean IMMUTABLE = false; - - public LinkedListMultimapSerializer() { - super(DOES_NOT_ACCEPT_NULL, IMMUTABLE); - } - - @Override - public void write(Kryo kryo, Output output, LinkedListMultimap multimap) { - writeMultimap(kryo, output, multimap); - } - - @Override - public LinkedListMultimap read(Kryo kryo, Input input, Class> type) { - final LinkedListMultimap multimap = LinkedListMultimap.create(); - readMultimap(kryo, input, multimap); - return multimap; - } - - /** - * Creates a new {@link LinkedListMultimapSerializer} and registers its serializer. - * - * @param kryo the {@link Kryo} instance to set the serializer on - */ - public static void registerSerializers(final Kryo kryo) { - final LinkedListMultimapSerializer serializer = new LinkedListMultimapSerializer(); - kryo.register(LinkedListMultimap.class, serializer); - } + private static final boolean DOES_NOT_ACCEPT_NULL = false; + + private static final boolean IMMUTABLE = false; + + public LinkedListMultimapSerializer() { + super(DOES_NOT_ACCEPT_NULL, IMMUTABLE); + } + + @Override + public void write(Kryo kryo, Output output, LinkedListMultimap multimap) { + writeMultimap(kryo, output, multimap); + } + + @Override + public LinkedListMultimap read(Kryo kryo, Input input, Class> type) { + final LinkedListMultimap multimap = LinkedListMultimap.create(); + readMultimap(kryo, input, multimap); + return multimap; + } + + /** + * Creates a new {@link LinkedListMultimapSerializer} and registers its serializer. + * + * @param kryo the {@link Kryo} instance to set the serializer on + */ + public static void registerSerializers(final Kryo kryo) { + final LinkedListMultimapSerializer serializer = new LinkedListMultimapSerializer(); + kryo.register(LinkedListMultimap.class, serializer); + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/guava/MultimapSerializerBase.java b/src/main/java/de/javakaffee/kryoserializers/guava/MultimapSerializerBase.java index 8177f724..4d6738e9 100644 --- a/src/main/java/de/javakaffee/kryoserializers/guava/MultimapSerializerBase.java +++ b/src/main/java/de/javakaffee/kryoserializers/guava/MultimapSerializerBase.java @@ -1,34 +1,50 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers.guava; +import java.util.Map; + import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.Serializer; import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output; import com.google.common.collect.Multimap; -import java.util.Map; - public abstract class MultimapSerializerBase> extends Serializer { - public MultimapSerializerBase(boolean acceptsNull, boolean immutable) { - super(acceptsNull, immutable); - } + public MultimapSerializerBase(boolean acceptsNull, boolean immutable) { + super(acceptsNull, immutable); + } - protected void writeMultimap(Kryo kryo, Output output, Multimap multimap) { - output.writeInt(multimap.size(), true); - for (final Map.Entry entry : multimap.entries()) { - kryo.writeClassAndObject(output, entry.getKey()); - kryo.writeClassAndObject(output, entry.getValue()); - } - } + protected void writeMultimap(Kryo kryo, Output output, Multimap multimap) { + output.writeInt(multimap.size(), true); + for (final Map.Entry entry : multimap.entries()) { + kryo.writeClassAndObject(output, entry.getKey()); + kryo.writeClassAndObject(output, entry.getValue()); + } + } - @SuppressWarnings("unchecked") - protected void readMultimap(Kryo kryo, Input input, Multimap multimap) { - final int size = input.readInt(true); - for (int i = 0; i < size; ++i) { - final K key = (K) kryo.readClassAndObject(input); - final V value = (V) kryo.readClassAndObject(input); - multimap.put(key, value); - } - } + @SuppressWarnings("unchecked") + protected void readMultimap(Kryo kryo, Input input, Multimap multimap) { + final int size = input.readInt(true); + for (int i = 0; i < size; ++i) { + final K key = (K) kryo.readClassAndObject(input); + final V value = (V) kryo.readClassAndObject(input); + multimap.put(key, value); + } + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/guava/ReverseListSerializer.java b/src/main/java/de/javakaffee/kryoserializers/guava/ReverseListSerializer.java index d94f0238..8ff47e7e 100644 --- a/src/main/java/de/javakaffee/kryoserializers/guava/ReverseListSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/guava/ReverseListSerializer.java @@ -1,5 +1,25 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers.guava; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.Serializer; import com.esotericsoftware.kryo.io.Input; @@ -8,71 +28,67 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; - /** * A {@link ImmutableList#reverse()} Serializer. * Treat as a {@link List} by reversing before write and after read. */ public abstract class ReverseListSerializer extends Serializer> { - private static final CollectionSerializer serializer = new CollectionSerializer(); + private static final CollectionSerializer serializer = new CollectionSerializer(); - @SuppressWarnings("unchecked") - @Override - public void write(Kryo kryo, Output output, List object) { - // reverse the ReverseList to get the "forward" list, and treat as regular List. - List forwardList = Lists.reverse(object); - serializer.write(kryo, output, forwardList); - } + @SuppressWarnings("unchecked") + @Override + public void write(Kryo kryo, Output output, List object) { + // reverse the ReverseList to get the "forward" list, and treat as regular List. + List forwardList = Lists.reverse(object); + serializer.write(kryo, output, forwardList); + } - @SuppressWarnings("unchecked") - @Override - public List copy(Kryo kryo, List original) { - List forwardList = Lists.reverse(original); - return Lists.reverse((List) serializer.copy(kryo, forwardList)); - } + @SuppressWarnings("unchecked") + @Override + public List copy(Kryo kryo, List original) { + List forwardList = Lists.reverse(original); + return Lists.reverse((List) serializer.copy(kryo, forwardList)); + } - public static void registerSerializers(final Kryo kryo) { - kryo.register(Lists.reverse(Lists.newLinkedList()).getClass(), forReverseList()); - kryo.register(Lists.reverse(Lists.newArrayList()).getClass(), forRandomAccessReverseList()); - } + public static void registerSerializers(final Kryo kryo) { + kryo.register(Lists.reverse(Lists.newLinkedList()).getClass(), forReverseList()); + kryo.register(Lists.reverse(Lists.newArrayList()).getClass(), forRandomAccessReverseList()); + } - public static ReverseListSerializer forReverseList() { - return new ReverseListSerializer.ReverseList(); - } + public static ReverseListSerializer forReverseList() { + return new ReverseListSerializer.ReverseList(); + } - public static ReverseListSerializer forRandomAccessReverseList() { - return new ReverseListSerializer.RandomAccessReverseList(); - } + public static ReverseListSerializer forRandomAccessReverseList() { + return new ReverseListSerializer.RandomAccessReverseList(); + } - /** - * A {@link Lists.ReverseList} implementation based on a {@link LinkedList}. - */ - private static class ReverseList extends ReverseListSerializer { + /** + * A {@link Lists.ReverseList} implementation based on a {@link LinkedList}. + */ + private static class ReverseList extends ReverseListSerializer { - @SuppressWarnings("unchecked") - @Override - public List read(Kryo kryo, Input input, Class> type) { - // reading a "forward" list as a LinkedList and returning the reversed list. - List forwardList = (List) serializer.read(kryo, input, (Class) LinkedList.class); - return Lists.reverse(forwardList); - } - } + @SuppressWarnings("unchecked") + @Override + public List read(Kryo kryo, Input input, Class> type) { + // reading a "forward" list as a LinkedList and returning the reversed list. + List forwardList = (List) serializer.read(kryo, input, (Class) LinkedList.class); + return Lists.reverse(forwardList); + } + } - /** - * A {@link Lists.ReverseList} implementation based on an {@link ArrayList}. - */ - private static class RandomAccessReverseList extends ReverseListSerializer { + /** + * A {@link Lists.ReverseList} implementation based on an {@link ArrayList}. + */ + private static class RandomAccessReverseList extends ReverseListSerializer { - @SuppressWarnings("unchecked") - @Override - public List read(Kryo kryo, Input input, Class> type) { - // reading a "forward" list as a ArrayList and returning the reversed list. - List forwardList = (List) serializer.read(kryo, input, (Class) ArrayList.class); - return Lists.reverse(forwardList); - } - } + @SuppressWarnings("unchecked") + @Override + public List read(Kryo kryo, Input input, Class> type) { + // reading a "forward" list as a ArrayList and returning the reversed list. + List forwardList = (List) serializer.read(kryo, input, (Class) ArrayList.class); + return Lists.reverse(forwardList); + } + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/guava/TreeMultimapSerializer.java b/src/main/java/de/javakaffee/kryoserializers/guava/TreeMultimapSerializer.java index 7bae7d12..79015754 100644 --- a/src/main/java/de/javakaffee/kryoserializers/guava/TreeMultimapSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/guava/TreeMultimapSerializer.java @@ -1,10 +1,25 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers.guava; import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.Serializer; import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output; - import com.google.common.collect.TreeMultimap; /** @@ -14,34 +29,34 @@ */ public class TreeMultimapSerializer extends MultimapSerializerBase> { - /* assumes default comparator */ - private static final boolean DOES_NOT_ACCEPT_NULL = true; - - private static final boolean IMMUTABLE = false; - - public TreeMultimapSerializer() { - super(DOES_NOT_ACCEPT_NULL, IMMUTABLE); - } - - @Override - public void write(Kryo kryo, Output output, TreeMultimap multimap) { - writeMultimap(kryo, output, multimap); - } - - @Override - public TreeMultimap read(Kryo kryo, Input input, Class> type) { - final TreeMultimap multimap = TreeMultimap.create(); - readMultimap(kryo, input, multimap); - return multimap; - } - - /** - * Creates a new {@link TreeMultimapSerializer} and registers its serializer. - * - * @param kryo the {@link Kryo} instance to set the serializer on - */ - public static void registerSerializers(final Kryo kryo) { - final TreeMultimapSerializer serializer = new TreeMultimapSerializer(); - kryo.register(TreeMultimap.class, serializer); - } + /* assumes default comparator */ + private static final boolean DOES_NOT_ACCEPT_NULL = true; + + private static final boolean IMMUTABLE = false; + + public TreeMultimapSerializer() { + super(DOES_NOT_ACCEPT_NULL, IMMUTABLE); + } + + @Override + public void write(Kryo kryo, Output output, TreeMultimap multimap) { + writeMultimap(kryo, output, multimap); + } + + @Override + public TreeMultimap read(Kryo kryo, Input input, Class> type) { + final TreeMultimap multimap = TreeMultimap.create(); + readMultimap(kryo, input, multimap); + return multimap; + } + + /** + * Creates a new {@link TreeMultimapSerializer} and registers its serializer. + * + * @param kryo the {@link Kryo} instance to set the serializer on + */ + public static void registerSerializers(final Kryo kryo) { + final TreeMultimapSerializer serializer = new TreeMultimapSerializer(); + kryo.register(TreeMultimap.class, serializer); + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/guava/UnmodifiableNavigableSetSerializer.java b/src/main/java/de/javakaffee/kryoserializers/guava/UnmodifiableNavigableSetSerializer.java index d94df4fd..84fe032f 100644 --- a/src/main/java/de/javakaffee/kryoserializers/guava/UnmodifiableNavigableSetSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/guava/UnmodifiableNavigableSetSerializer.java @@ -1,5 +1,25 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers.guava; +import java.lang.reflect.Field; +import java.util.NavigableSet; +import java.util.TreeSet; + import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.Serializer; import com.esotericsoftware.kryo.io.Input; @@ -8,74 +28,70 @@ import com.google.common.collect.ImmutableSortedSet; import com.google.common.collect.Sets; -import java.lang.reflect.Field; -import java.util.NavigableSet; -import java.util.TreeSet; - /** * A kryo {@link Serializer} for guava-libraries {@link ImmutableSortedSet}. */ public class UnmodifiableNavigableSetSerializer extends Serializer> { - Field delegate; + Field delegate; - public UnmodifiableNavigableSetSerializer() { - // Do not allow nulls - super(false); - try { - Class clazz = Class.forName(Sets.class.getCanonicalName() + "$UnmodifiableNavigableSet"); - delegate = clazz.getDeclaredField("delegate"); - delegate.setAccessible(true); - } catch (IllegalArgumentException e) { - throw new RuntimeException("Issues reflectively writing UnmodifiableNavigableSet", e); - } catch (ClassNotFoundException e) { - throw new RuntimeException("Issues reflectively writing UnmodifiableNavigableSet", e); - } catch (SecurityException e) { - throw new RuntimeException("Issues reflectively writing UnmodifiableNavigableSet", e); - } catch (NoSuchFieldException e) { - throw new RuntimeException("Issues reflectively writing UnmodifiableNavigableSet", e); - } - } + public UnmodifiableNavigableSetSerializer() { + // Do not allow nulls + super(false); + try { + Class clazz = Class.forName(Sets.class.getCanonicalName() + "$UnmodifiableNavigableSet"); + delegate = clazz.getDeclaredField("delegate"); + delegate.setAccessible(true); + } catch (IllegalArgumentException e) { + throw new RuntimeException("Issues reflectively writing UnmodifiableNavigableSet", e); + } catch (ClassNotFoundException e) { + throw new RuntimeException("Issues reflectively writing UnmodifiableNavigableSet", e); + } catch (SecurityException e) { + throw new RuntimeException("Issues reflectively writing UnmodifiableNavigableSet", e); + } catch (NoSuchFieldException e) { + throw new RuntimeException("Issues reflectively writing UnmodifiableNavigableSet", e); + } + } - @VisibleForTesting - protected Object getDelegateFromUnmodifiableNavigableSet(NavigableSet object) { - try { - return delegate.get(object); - } catch (IllegalArgumentException e) { - throw new RuntimeException("Issues reflectively writing UnmodifiableNavigableSet", e); - } catch (IllegalAccessException e) { - throw new RuntimeException("Issues reflectively writing UnmodifiableNavigableSet", e); - } - } + @VisibleForTesting + protected Object getDelegateFromUnmodifiableNavigableSet(NavigableSet object) { + try { + return delegate.get(object); + } catch (IllegalArgumentException e) { + throw new RuntimeException("Issues reflectively writing UnmodifiableNavigableSet", e); + } catch (IllegalAccessException e) { + throw new RuntimeException("Issues reflectively writing UnmodifiableNavigableSet", e); + } + } - @Override - public void write(Kryo kryo, Output output, NavigableSet object) { - // We want to preserve the underlying delegate class, so we need to reflectively get it and write it directly via kryo - kryo.writeClassAndObject(output, getDelegateFromUnmodifiableNavigableSet(object)); - } + @Override + public void write(Kryo kryo, Output output, NavigableSet object) { + // We want to preserve the underlying delegate class, so we need to reflectively get it and write it directly via kryo + kryo.writeClassAndObject(output, getDelegateFromUnmodifiableNavigableSet(object)); + } - @Override - public NavigableSet read(Kryo kryo, Input input, Class> type) { - return Sets.unmodifiableNavigableSet((NavigableSet) kryo.readClassAndObject(input)); - } + @Override + public NavigableSet read(Kryo kryo, Input input, Class> type) { + return Sets.unmodifiableNavigableSet((NavigableSet) kryo.readClassAndObject(input)); + } - @Override - public NavigableSet copy(Kryo kryo, NavigableSet original) { - return Sets.unmodifiableNavigableSet((NavigableSet) kryo.copy(getDelegateFromUnmodifiableNavigableSet(original))); - } + @Override + public NavigableSet copy(Kryo kryo, NavigableSet original) { + return Sets.unmodifiableNavigableSet((NavigableSet) kryo.copy(getDelegateFromUnmodifiableNavigableSet(original))); + } - /** - * Creates a new {@link UnmodifiableNavigableSetSerializer} and registers its serializer - * for the UnmodifiableNavigableSetSerializer related class. - * - * @param kryo the {@link Kryo} instance to set the serializer on - */ - public static void registerSerializers(final Kryo kryo) { + /** + * Creates a new {@link UnmodifiableNavigableSetSerializer} and registers its serializer + * for the UnmodifiableNavigableSetSerializer related class. + * + * @param kryo the {@link Kryo} instance to set the serializer on + */ + public static void registerSerializers(final Kryo kryo) { - // UnmodifiableNavigableSetSerializer (private class) + // UnmodifiableNavigableSetSerializer (private class) - final UnmodifiableNavigableSetSerializer serializer = new UnmodifiableNavigableSetSerializer(); + final UnmodifiableNavigableSetSerializer serializer = new UnmodifiableNavigableSetSerializer(); - kryo.register(Sets.unmodifiableNavigableSet(new TreeSet()).getClass(), serializer); - } + kryo.register(Sets.unmodifiableNavigableSet(new TreeSet()).getClass(), serializer); + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/jodatime/IdentifiableChronology.java b/src/main/java/de/javakaffee/kryoserializers/jodatime/IdentifiableChronology.java index 4f91d45e..0394a7e1 100644 --- a/src/main/java/de/javakaffee/kryoserializers/jodatime/IdentifiableChronology.java +++ b/src/main/java/de/javakaffee/kryoserializers/jodatime/IdentifiableChronology.java @@ -1,14 +1,23 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers.jodatime; import org.joda.time.Chronology; -import org.joda.time.chrono.BuddhistChronology; -import org.joda.time.chrono.CopticChronology; -import org.joda.time.chrono.EthiopicChronology; -import org.joda.time.chrono.GJChronology; -import org.joda.time.chrono.GregorianChronology; -import org.joda.time.chrono.ISOChronology; -import org.joda.time.chrono.IslamicChronology; -import org.joda.time.chrono.JulianChronology; +import org.joda.time.chrono.*; import com.esotericsoftware.kryo.io.Input; @@ -16,77 +25,78 @@ * An enumeration that provides a String id for subclasses of {@link Chronology}. * For {@link ISOChronology}, null is used as id, as {@link ISOChronology} * is used as default and the id does not have to be serialized. - * + * * @author Martin Grotzke (martin.grotzke@freiheit.com) (initial creation) */ enum IdentifiableChronology { - - ISO( null, ISOChronology.getInstance() ), - COPTIC( "COPTIC", CopticChronology.getInstance() ), - ETHIOPIC( "ETHIOPIC", EthiopicChronology.getInstance()), - GREGORIAN("GREGORIAN", GregorianChronology.getInstance()), - JULIAN("JULIAN", JulianChronology.getInstance()), - ISLAMIC("ISLAMIC",IslamicChronology.getInstance()), - BUDDHIST( "BUDDHIST", BuddhistChronology.getInstance()), - GJ( "GJ", GJChronology.getInstance()); - - private final String _id; - private final Chronology _chronology; - - private IdentifiableChronology( final String id, final Chronology chronology ) { - _id = id; - _chronology = chronology; - } - - public String getId() { - return _id; - } - - /** - * Determines the id for the given {@link Chronology} subclass that later - * can be used to resolve the {@link Chronology} with {@link #valueOfId(String)}. - * For {@link ISOChronology} class null is returned. - * - * @param clazz a subclass of {@link Chronology}. - * @return an id, or null for {@link ISOChronology}. - * @throws IllegalArgumentException if the {@link Chronology} is not supported. - */ - public static String getIdByChronology( final Class clazz ) throws IllegalArgumentException { - for( final IdentifiableChronology item : values() ) { - if ( clazz.equals( item._chronology.getClass() ) ) { - return item._id; - } - } - throw new IllegalArgumentException( "Chronology not supported: " + clazz.getSimpleName() ); - } - - /** - * Returns the chronology of the {@link IdentifiableChronology} matching the - * provided id. If the provided id is null, - * {@link ISOChronology} is returned. - * @param id the id from {@link #getIdByChronology(Class)}. - * @return a matching {@link Chronology} if any was found. - * @throws IllegalArgumentException if no match was found. - */ - public static Chronology valueOfId(final String id) throws IllegalArgumentException { - if ( id == null ) { - return ISO._chronology; - } - for( final IdentifiableChronology item : values() ) { - if ( id.equals( item._id ) ) { - return item._chronology; - } - } - throw new IllegalArgumentException( "No chronology found for id " + id ); - } - - static Chronology readChronology( final Input input ) { - final String chronologyId = input.readString(); - return IdentifiableChronology.valueOfId( "".equals( chronologyId ) ? null : chronologyId ); - } - - static String getChronologyId( final Chronology chronology ) { - return IdentifiableChronology.getIdByChronology( chronology.getClass() ); - } - -} \ No newline at end of file + + ISO(null, ISOChronology.getInstance()), + COPTIC("COPTIC", CopticChronology.getInstance()), + ETHIOPIC("ETHIOPIC", EthiopicChronology.getInstance()), + GREGORIAN("GREGORIAN", GregorianChronology.getInstance()), + JULIAN("JULIAN", JulianChronology.getInstance()), + ISLAMIC("ISLAMIC", IslamicChronology.getInstance()), + BUDDHIST("BUDDHIST", BuddhistChronology.getInstance()), + GJ("GJ", GJChronology.getInstance()); + + private final String _id; + private final Chronology _chronology; + + private IdentifiableChronology(final String id, final Chronology chronology) { + _id = id; + _chronology = chronology; + } + + /** + * Determines the id for the given {@link Chronology} subclass that later + * can be used to resolve the {@link Chronology} with {@link #valueOfId(String)}. + * For {@link ISOChronology} class null is returned. + * + * @param clazz a subclass of {@link Chronology}. + * @return an id, or null for {@link ISOChronology}. + * @throws IllegalArgumentException if the {@link Chronology} is not supported. + */ + public static String getIdByChronology(final Class clazz) throws IllegalArgumentException { + for (final IdentifiableChronology item : values()) { + if (clazz.equals(item._chronology.getClass())) { + return item._id; + } + } + throw new IllegalArgumentException("Chronology not supported: " + clazz.getSimpleName()); + } + + /** + * Returns the chronology of the {@link IdentifiableChronology} matching the + * provided id. If the provided id is null, + * {@link ISOChronology} is returned. + * + * @param id the id from {@link #getIdByChronology(Class)}. + * @return a matching {@link Chronology} if any was found. + * @throws IllegalArgumentException if no match was found. + */ + public static Chronology valueOfId(final String id) throws IllegalArgumentException { + if (id == null) { + return ISO._chronology; + } + for (final IdentifiableChronology item : values()) { + if (id.equals(item._id)) { + return item._chronology; + } + } + throw new IllegalArgumentException("No chronology found for id " + id); + } + + static Chronology readChronology(final Input input) { + final String chronologyId = input.readString(); + return IdentifiableChronology.valueOfId("".equals(chronologyId) ? null : chronologyId); + } + + static String getChronologyId(final Chronology chronology) { + return IdentifiableChronology.getIdByChronology(chronology.getClass()); + } + + public String getId() { + return _id; + } + +} diff --git a/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaDateTimeSerializer.java b/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaDateTimeSerializer.java index e59ceaf5..979218ff 100644 --- a/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaDateTimeSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaDateTimeSerializer.java @@ -16,11 +16,6 @@ */ package de.javakaffee.kryoserializers.jodatime; -import com.esotericsoftware.kryo.Kryo; -import com.esotericsoftware.kryo.Serializer; -import com.esotericsoftware.kryo.io.Input; -import com.esotericsoftware.kryo.io.Output; - import org.joda.time.Chronology; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; @@ -33,6 +28,11 @@ import org.joda.time.chrono.IslamicChronology; import org.joda.time.chrono.JulianChronology; +import com.esotericsoftware.kryo.Kryo; +import com.esotericsoftware.kryo.Serializer; +import com.esotericsoftware.kryo.io.Input; +import com.esotericsoftware.kryo.io.Output; + /** * A format for joda {@link DateTime}, that stores the millis, chronology and * time zone as separate attributes. If the chronology is {@link ISOChronology}, @@ -57,43 +57,43 @@ */ public class JodaDateTimeSerializer extends Serializer { - static final String MILLIS = "millis"; - static final String DATE_TIME = "dt"; - static final String CHRONOLOGY = "ch"; - static final String TIME_ZONE = "tz"; + static final String MILLIS = "millis"; + static final String DATE_TIME = "dt"; + static final String CHRONOLOGY = "ch"; + static final String TIME_ZONE = "tz"; - public JodaDateTimeSerializer() { - setImmutable(true); - } + public JodaDateTimeSerializer() { + setImmutable(true); + } - @Override - public DateTime read(final Kryo kryo, final Input input, final Class type) { - final long millis = input.readLong(true); - final Chronology chronology = IdentifiableChronology.readChronology( input ); - final DateTimeZone tz = readTimeZone( input ); - return new DateTime( millis, chronology.withZone( tz ) ); - } + @Override + public DateTime read(final Kryo kryo, final Input input, final Class type) { + final long millis = input.readLong(true); + final Chronology chronology = IdentifiableChronology.readChronology(input); + final DateTimeZone tz = readTimeZone(input); + return new DateTime(millis, chronology.withZone(tz)); + } - @Override - public void write(final Kryo kryo, final Output output, final DateTime obj) { - output.writeLong(obj.getMillis(), true); + @Override + public void write(final Kryo kryo, final Output output, final DateTime obj) { + output.writeLong(obj.getMillis(), true); - final String chronologyId = IdentifiableChronology.getChronologyId( obj.getChronology() ); - output.writeString(chronologyId == null ? "" : chronologyId); + final String chronologyId = IdentifiableChronology.getChronologyId(obj.getChronology()); + output.writeString(chronologyId == null ? "" : chronologyId); - output.writeString(obj.getZone().getID()); - } + output.writeString(obj.getZone().getID()); + } - private DateTimeZone readTimeZone( final Input input ) { - final String tz = input.readString(); + private DateTimeZone readTimeZone(final Input input) { + final String tz = input.readString(); - // special case for "" to maintain backwards compatibility, but generally this is considered harmful, - // potentially remove this with the next major release that involves breaking changes - // https://github.com/magro/kryo-serializers/issues/30 - if ("".equals(tz)) { - return DateTimeZone.getDefault(); - } + // special case for "" to maintain backwards compatibility, but generally this is considered harmful, + // potentially remove this with the next major release that involves breaking changes + // https://github.com/magro/kryo-serializers/issues/30 + if ("".equals(tz)) { + return DateTimeZone.getDefault(); + } - return DateTimeZone.forID(tz); - } + return DateTimeZone.forID(tz); + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaIntervalSerializer.java b/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaIntervalSerializer.java index 421da531..b512ae85 100644 --- a/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaIntervalSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaIntervalSerializer.java @@ -1,4 +1,6 @@ /* + * Copyright 2018 Martin Grotzke + * * 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 @@ -14,11 +16,6 @@ */ package de.javakaffee.kryoserializers.jodatime; -import com.esotericsoftware.kryo.Kryo; -import com.esotericsoftware.kryo.Serializer; -import com.esotericsoftware.kryo.io.Input; -import com.esotericsoftware.kryo.io.Output; - import org.joda.time.Chronology; import org.joda.time.Interval; import org.joda.time.chrono.BuddhistChronology; @@ -30,8 +27,13 @@ import org.joda.time.chrono.IslamicChronology; import org.joda.time.chrono.JulianChronology; +import com.esotericsoftware.kryo.Kryo; +import com.esotericsoftware.kryo.Serializer; +import com.esotericsoftware.kryo.io.Input; +import com.esotericsoftware.kryo.io.Output; + /** - * A format for Joda {@link Interval}, that stores the start and end millis, and chronology + * A format for Joda {@link Interval}, that stores the start and end millis, and chronology * as separate attributes. If the chronology is {@link ISOChronology}, * the attribute is omitted, thus {@link ISOChronology} is seen as default. *

    @@ -46,35 +48,34 @@ *

  • {@link BuddhistChronology}
  • *
  • {@link GJChronology}
  • * - * + * */ public class JodaIntervalSerializer extends Serializer { - public JodaIntervalSerializer() { - setImmutable(true); - } + public JodaIntervalSerializer() { + setImmutable(true); + } + + @Override + public Interval read(final Kryo kryo, final Input input, final Class type) { + + long startMillis = input.readLong(true); + long endMillis = input.readLong(true); + + final Chronology chronology = IdentifiableChronology.readChronology(input); + + return new Interval(startMillis, endMillis, chronology); + } - @Override - public Interval read(final Kryo kryo, final Input input, final Class type) { - - long startMillis = input.readLong(true); - long endMillis = input.readLong(true); - - final Chronology chronology = IdentifiableChronology.readChronology( input ); - - return new Interval(startMillis, endMillis, chronology); - } + @Override + public void write(final Kryo kryo, final Output output, final Interval obj) { + final long startMillis = obj.getStartMillis(); + final long endMillis = obj.getEndMillis(); + final String chronologyId = IdentifiableChronology.getChronologyId(obj.getChronology()); - @Override - public void write(final Kryo kryo, final Output output, final Interval obj) { - final long startMillis = obj.getStartMillis(); - final long endMillis = obj.getEndMillis(); - final String chronologyId = IdentifiableChronology.getChronologyId( obj.getChronology() ); - - output.writeLong(startMillis, true); - output.writeLong(endMillis, true); - output.writeString(chronologyId == null ? "" : chronologyId); - } - + output.writeLong(startMillis, true); + output.writeLong(endMillis, true); + output.writeString(chronologyId == null ? "" : chronologyId); + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaLocalDateSerializer.java b/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaLocalDateSerializer.java index 23d2cc4f..4707b133 100644 --- a/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaLocalDateSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaLocalDateSerializer.java @@ -1,5 +1,5 @@ /* - * Copyright 2015 Rennie Petersen + * Copyright 2018 Martin Grotzke * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,11 +16,6 @@ */ package de.javakaffee.kryoserializers.jodatime; -import com.esotericsoftware.kryo.Kryo; -import com.esotericsoftware.kryo.Serializer; -import com.esotericsoftware.kryo.io.Input; -import com.esotericsoftware.kryo.io.Output; - import org.joda.time.Chronology; import org.joda.time.LocalDate; import org.joda.time.chrono.BuddhistChronology; @@ -32,6 +27,11 @@ import org.joda.time.chrono.IslamicChronology; import org.joda.time.chrono.JulianChronology; +import com.esotericsoftware.kryo.Kryo; +import com.esotericsoftware.kryo.Serializer; +import com.esotericsoftware.kryo.io.Input; +import com.esotericsoftware.kryo.io.Output; + /** * A Kryo serializer for joda {@link LocalDate}. The LocalDate object is read or written as year, * month-of-year and day-of-month packed into one integer, and chronology as a separate attribute. @@ -61,27 +61,27 @@ */ public class JodaLocalDateSerializer extends Serializer { - public JodaLocalDateSerializer() { - setImmutable(true); - } + public JodaLocalDateSerializer() { + setImmutable(true); + } - @Override - public LocalDate read(final Kryo kryo, final Input input, final Class type) { - final int packedYearMonthDay = input.readInt(true); - final Chronology chronology = IdentifiableChronology.readChronology(input); - return new LocalDate(packedYearMonthDay / (13 * 32), - (packedYearMonthDay % (13 * 32)) / 32, - packedYearMonthDay % 32, - chronology); - } + @Override + public LocalDate read(final Kryo kryo, final Input input, final Class type) { + final int packedYearMonthDay = input.readInt(true); + final Chronology chronology = IdentifiableChronology.readChronology(input); + return new LocalDate(packedYearMonthDay / (13 * 32), + (packedYearMonthDay % (13 * 32)) / 32, + packedYearMonthDay % 32, + chronology); + } - @Override - public void write(final Kryo kryo, final Output output, final LocalDate localDate) { - final int packedYearMonthDay = localDate.getYear() * 13 * 32 + - localDate.getMonthOfYear() * 32 + - localDate.getDayOfMonth(); - output.writeInt(packedYearMonthDay, true); - final String chronologyId = IdentifiableChronology.getChronologyId(localDate.getChronology()); - output.writeString(chronologyId == null ? "" : chronologyId); - } + @Override + public void write(final Kryo kryo, final Output output, final LocalDate localDate) { + final int packedYearMonthDay = localDate.getYear() * 13 * 32 + + localDate.getMonthOfYear() * 32 + + localDate.getDayOfMonth(); + output.writeInt(packedYearMonthDay, true); + final String chronologyId = IdentifiableChronology.getChronologyId(localDate.getChronology()); + output.writeString(chronologyId == null ? "" : chronologyId); + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaLocalDateTimeSerializer.java b/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaLocalDateTimeSerializer.java index d5a100e8..311784f5 100644 --- a/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaLocalDateTimeSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaLocalDateTimeSerializer.java @@ -1,5 +1,5 @@ /* - * Copyright 2015 Rennie Petersen + * Copyright 2018 Martin Grotzke * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,11 +16,6 @@ */ package de.javakaffee.kryoserializers.jodatime; -import com.esotericsoftware.kryo.Kryo; -import com.esotericsoftware.kryo.Serializer; -import com.esotericsoftware.kryo.io.Input; -import com.esotericsoftware.kryo.io.Output; - import org.joda.time.Chronology; import org.joda.time.LocalDateTime; import org.joda.time.chrono.BuddhistChronology; @@ -32,6 +27,11 @@ import org.joda.time.chrono.IslamicChronology; import org.joda.time.chrono.JulianChronology; +import com.esotericsoftware.kryo.Kryo; +import com.esotericsoftware.kryo.Serializer; +import com.esotericsoftware.kryo.io.Input; +import com.esotericsoftware.kryo.io.Output; + /** * A Kryo serializer for joda {@link LocalDateTime}. The LocalDateTime object is read or written as * year, month-of-year, day-of-month and millis-of-day packed into a long integer, and chronology as @@ -55,32 +55,33 @@ */ public class JodaLocalDateTimeSerializer extends Serializer { - public JodaLocalDateTimeSerializer() { setImmutable(true); } + public JodaLocalDateTimeSerializer() { + setImmutable(true); + } - @Override - public LocalDateTime read(Kryo kryo, Input input, Class type) { - final long packedLocalDateTime = input.readLong(true); - final int packedYearMonthDay = (int)(packedLocalDateTime / 86400000); - final int millisOfDay = (int)(packedLocalDateTime % 86400000); - final Chronology chronology = IdentifiableChronology.readChronology(input); - return new LocalDateTime(packedYearMonthDay / (13 * 32), - (packedYearMonthDay % (13 * 32)) / 32, - packedYearMonthDay % 32, - millisOfDay / 3600000, - (millisOfDay % 3600000) / 60000, - (millisOfDay % 60000) / 1000, - millisOfDay % 1000, - chronology ); - } + @Override + public LocalDateTime read(Kryo kryo, Input input, Class type) { + final long packedLocalDateTime = input.readLong(true); + final int packedYearMonthDay = (int) (packedLocalDateTime / 86400000); + final int millisOfDay = (int) (packedLocalDateTime % 86400000); + final Chronology chronology = IdentifiableChronology.readChronology(input); + return new LocalDateTime(packedYearMonthDay / (13 * 32), + (packedYearMonthDay % (13 * 32)) / 32, + packedYearMonthDay % 32, + millisOfDay / 3600000, + (millisOfDay % 3600000) / 60000, + (millisOfDay % 60000) / 1000, + millisOfDay % 1000, + chronology); + } - @Override - public void write(Kryo kryo, Output output, LocalDateTime localDateTime) { - final int packedYearMonthDay = localDateTime.getYear() * 13 * 32 + - localDateTime.getMonthOfYear() * 32 + - localDateTime.getDayOfMonth(); - output.writeLong((long)packedYearMonthDay * 86400000 + localDateTime.getMillisOfDay(), true); - final String chronologyId = - IdentifiableChronology.getChronologyId(localDateTime.getChronology()); - output.writeString(chronologyId == null ? "" : chronologyId); - } + @Override + public void write(Kryo kryo, Output output, LocalDateTime localDateTime) { + final int packedYearMonthDay = localDateTime.getYear() * 13 * 32 + + localDateTime.getMonthOfYear() * 32 + + localDateTime.getDayOfMonth(); + output.writeLong((long) packedYearMonthDay * 86400000 + localDateTime.getMillisOfDay(), true); + final String chronologyId = IdentifiableChronology.getChronologyId(localDateTime.getChronology()); + output.writeString(chronologyId == null ? "" : chronologyId); + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaLocalTimeSerializer.java b/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaLocalTimeSerializer.java index 4cae33b1..c9c1af60 100644 --- a/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaLocalTimeSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaLocalTimeSerializer.java @@ -1,14 +1,31 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers.jodatime; -import com.esotericsoftware.kryo.Kryo; -import com.esotericsoftware.kryo.Serializer; -import com.esotericsoftware.kryo.io.Input; -import com.esotericsoftware.kryo.io.Output; import org.joda.time.Chronology; import org.joda.time.DateTimeZone; import org.joda.time.LocalTime; import org.joda.time.chrono.*; +import com.esotericsoftware.kryo.Kryo; +import com.esotericsoftware.kryo.Serializer; +import com.esotericsoftware.kryo.io.Input; +import com.esotericsoftware.kryo.io.Output; + /** * A format for Joda {@link LocalTime}, that stores the milliseconds of the day and chronology * as separate attributes. @@ -28,27 +45,27 @@ * @author Rob Reeves */ public class JodaLocalTimeSerializer extends Serializer { - @Override - public void write(Kryo kryo, Output output, LocalTime object) { - final int time = object.getMillisOfDay(); - output.writeInt(time, true); + @Override + public void write(Kryo kryo, Output output, LocalTime object) { + final int time = object.getMillisOfDay(); + output.writeInt(time, true); - //LocalTime always converts the internal DateTimeZone to UTC so there is no need to serialize it. - final String chronologyId = IdentifiableChronology.getChronologyId(object.getChronology()); - output.writeString(chronologyId); - } + //LocalTime always converts the internal DateTimeZone to UTC so there is no need to serialize it. + final String chronologyId = IdentifiableChronology.getChronologyId(object.getChronology()); + output.writeString(chronologyId); + } - @Override - public LocalTime read(Kryo kryo, Input input, Class type) { - final int time = input.readInt(true); - final Chronology chronology = IdentifiableChronology.readChronology(input); + @Override + public LocalTime read(Kryo kryo, Input input, Class type) { + final int time = input.readInt(true); + final Chronology chronology = IdentifiableChronology.readChronology(input); - //LocalTime always converts the internal DateTimeZone to UTC. - return new LocalTime(time, chronology.withZone(DateTimeZone.UTC)); - } + //LocalTime always converts the internal DateTimeZone to UTC. + return new LocalTime(time, chronology.withZone(DateTimeZone.UTC)); + } - @Override - public LocalTime copy(Kryo kryo, LocalTime original) { - return new LocalTime(original); - } + @Override + public LocalTime copy(Kryo kryo, LocalTime original) { + return new LocalTime(original); + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/protobuf/ProtobufSerializer.java b/src/main/java/de/javakaffee/kryoserializers/protobuf/ProtobufSerializer.java index c3c9ca89..ef75eec3 100644 --- a/src/main/java/de/javakaffee/kryoserializers/protobuf/ProtobufSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/protobuf/ProtobufSerializer.java @@ -1,80 +1,97 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers.protobuf; +import static com.esotericsoftware.kryo.Kryo.NULL; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.Serializer; import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output; import com.google.protobuf.GeneratedMessage; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import static com.esotericsoftware.kryo.Kryo.NULL; - public class ProtobufSerializer extends Serializer { - private Method parseFromMethod = null; + private Method parseFromMethod = null; - @Override - public void write(Kryo kryo, Output output, T protobufMessage) { - // If our protobuf is null - if (protobufMessage == null) { - // Write our special null value - output.writeByte(NULL); - output.flush(); + @Override + public void write(Kryo kryo, Output output, T protobufMessage) { + // If our protobuf is null + if (protobufMessage == null) { + // Write our special null value + output.writeByte(NULL); + output.flush(); - // and we're done - return; - } + // and we're done + return; + } - // Otherwise serialize protobuf to a byteArray - byte[] bytes = protobufMessage.toByteArray(); + // Otherwise serialize protobuf to a byteArray + byte[] bytes = protobufMessage.toByteArray(); - // Write the length of our byte array - output.writeInt(bytes.length + 1, true); + // Write the length of our byte array + output.writeInt(bytes.length + 1, true); - // Write the byte array out - output.writeBytes(bytes); - output.flush(); - } + // Write the byte array out + output.writeBytes(bytes); + output.flush(); + } - @SuppressWarnings("unchecked") - @Override - public T read(Kryo kryo, Input input, Class type) { - // Read the length of our byte array - int length = input.readInt(true); + @SuppressWarnings("unchecked") + @Override + public T read(Kryo kryo, Input input, Class type) { + // Read the length of our byte array + int length = input.readInt(true); - // If the length is equal to our special null value - if (length == NULL) { - // Just return null - return null; - } - // Otherwise read the byte array length - byte[] bytes = input.readBytes(length - 1); - try { - // Deserialize protobuf - return (T) (getParseFromMethod(type).invoke(type, (Object) bytes)); - } catch (NoSuchMethodException e) { - throw new RuntimeException("Unable to deserialize protobuf "+e.getMessage(), e); - } catch (InvocationTargetException e) { - throw new RuntimeException("Unable to deserialize protobuf "+e.getMessage(), e); - } catch (IllegalAccessException e) { - throw new RuntimeException("Unable to deserialize protobuf "+e.getMessage(), e); - } - } + // If the length is equal to our special null value + if (length == NULL) { + // Just return null + return null; + } + // Otherwise read the byte array length + byte[] bytes = input.readBytes(length - 1); + try { + // Deserialize protobuf + return (T) (getParseFromMethod(type).invoke(type, (Object) bytes)); + } catch (NoSuchMethodException e) { + throw new RuntimeException("Unable to deserialize protobuf " + e.getMessage(), e); + } catch (InvocationTargetException e) { + throw new RuntimeException("Unable to deserialize protobuf " + e.getMessage(), e); + } catch (IllegalAccessException e) { + throw new RuntimeException("Unable to deserialize protobuf " + e.getMessage(), e); + } + } - /** - * Caches method reflection lookup - * @throws NoSuchMethodException - */ - private Method getParseFromMethod(Class type) throws NoSuchMethodException { - if (parseFromMethod == null) { - parseFromMethod = type.getMethod("parseFrom", byte[].class); - } - return parseFromMethod; - } + /** + * Caches method reflection lookup + * @throws NoSuchMethodException + */ + private Method getParseFromMethod(Class type) throws NoSuchMethodException { + if (parseFromMethod == null) { + parseFromMethod = type.getMethod("parseFrom", byte[].class); + } + return parseFromMethod; + } - @Override - public boolean getAcceptsNull () { - return true; - } -} \ No newline at end of file + @Override + public boolean getAcceptsNull() { + return true; + } +} diff --git a/src/main/java/de/javakaffee/kryoserializers/wicket/MiniMapSerializer.java b/src/main/java/de/javakaffee/kryoserializers/wicket/MiniMapSerializer.java index 855d9ba5..e3f58c28 100644 --- a/src/main/java/de/javakaffee/kryoserializers/wicket/MiniMapSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/wicket/MiniMapSerializer.java @@ -31,57 +31,58 @@ /** * A format for wicket's {@link MiniMap}. - * + * * @author Martin Grotzke */ public class MiniMapSerializer extends Serializer> { - - /* To be correct we need to know the size of the internal array, otherwise - * we might create a too small MiniMap on deserilization - */ - private static final Field KEYS_FIELD; - - static { - try { - KEYS_FIELD = MiniMap.class.getDeclaredField( "keys" ); - KEYS_FIELD.setAccessible( true ); - } catch ( final Exception e ) { - throw new RuntimeException( "The MiniMap seems to have changed, could not access expected field.", e ); - } - } - private int getMaxEntries( final MiniMap map ) { - try { - return ( (Object[])KEYS_FIELD.get( map ) ).length; - } catch ( final Exception e ) { - throw new RuntimeException( "Could not access keys field.", e ); - } - } + /* To be correct we need to know the size of the internal array, otherwise + * we might create a too small MiniMap on deserilization + */ + private static final Field KEYS_FIELD; + + static { + try { + KEYS_FIELD = MiniMap.class.getDeclaredField("keys"); + KEYS_FIELD.setAccessible(true); + } catch (final Exception e) { + throw new RuntimeException("The MiniMap seems to have changed, could not access expected field.", e); + } + } + + private int getMaxEntries(final MiniMap map) { + try { + return ((Object[]) KEYS_FIELD.get(map)).length; + } catch (final Exception e) { + throw new RuntimeException("Could not access keys field.", e); + } + } - @Override - public void write(final Kryo kryo, final Output output, final MiniMap map) { - output.writeInt(getMaxEntries( map ), true); - output.writeInt( map.size(), true); + @Override + public void write(final Kryo kryo, final Output output, final MiniMap map) { + output.writeInt(getMaxEntries(map), true); + output.writeInt(map.size(), true); - for (final Entry entry : map.entrySet()) { - kryo.writeClassAndObject(output, entry.getKey()); - kryo.writeClassAndObject(output, entry.getValue()); - } + for (final Entry entry : map.entrySet()) { + kryo.writeClassAndObject(output, entry.getKey()); + kryo.writeClassAndObject(output, entry.getValue()); + } - if ( TRACE ) trace( "kryo", "Wrote map: " + map ); - } + if (TRACE) + trace("kryo", "Wrote map: " + map); + } - @Override - public MiniMap read(final Kryo kryo, final Input input, final Class> type) { - final int maxEntries = input.readInt( true ); - final MiniMap result = new MiniMap( maxEntries ); - final int size = input.readInt( true ); - for ( int i = 0; i < size; i++ ) { - final Object key = kryo.readClassAndObject( input ); - final Object value = kryo.readClassAndObject( input ); - result.put( key, value ); - } - return result; - } + @Override + public MiniMap read(final Kryo kryo, final Input input, final Class> type) { + final int maxEntries = input.readInt(true); + final MiniMap result = new MiniMap(maxEntries); + final int size = input.readInt(true); + for (int i = 0; i < size; i++) { + final Object key = kryo.readClassAndObject(input); + final Object value = kryo.readClassAndObject(input); + result.put(key, value); + } + return result; + } } diff --git a/src/test/java/de/javakaffee/kryoserializers/EnumMapSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/EnumMapSerializerTest.java index 41a52598..0e67a9a5 100755 --- a/src/test/java/de/javakaffee/kryoserializers/EnumMapSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/EnumMapSerializerTest.java @@ -1,6 +1,24 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers; -import static org.testng.Assert.*; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotSame; +import static org.testng.Assert.assertTrue; import java.util.EnumMap; import java.util.HashSet; @@ -16,43 +34,53 @@ */ public class EnumMapSerializerTest { private static enum Vipers { - SNAKE_CHARMER, BLACK_MAMBA, COTTONMOUTH, COPPERHEAD, CALIFORNIA_MOUNTAIN_SNAKE, SIDEWINDER; + SNAKE_CHARMER, + BLACK_MAMBA, + COTTONMOUTH, + COPPERHEAD, + CALIFORNIA_MOUNTAIN_SNAKE, + SIDEWINDER; } private static enum Colors { - BLUE, ORANGE, PINK, WHITE, BROWN, BLONDE; + BLUE, + ORANGE, + PINK, + WHITE, + BROWN, + BLONDE; } - private Kryo _kryo; - private EnumMap> _original; - - @BeforeTest - protected void beforeTest() { - _kryo = new Kryo(); + private Kryo _kryo; + private EnumMap> _original; + + @BeforeTest + protected void beforeTest() { + _kryo = new Kryo(); _kryo.register(EnumMap.class, new EnumMapSerializer()); _original = new EnumMap>(Vipers.class); - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Test(expectedExceptions={ClassCastException.class}) - public void testCopyEmpty() throws Exception { - EnumMap copy = _kryo.copy(_original); - // The next statement asserts that the key type of the copy is initialized correctly - - // it should throw the expected ClassCastException. - copy.put(Colors.BROWN, new HashSet()); - } + } + + @SuppressWarnings({"unchecked", "rawtypes"}) + @Test(expectedExceptions = {ClassCastException.class}) + public void testCopyEmpty() throws Exception { + EnumMap copy = _kryo.copy(_original); + // The next statement asserts that the key type of the copy is initialized correctly - + // it should throw the expected ClassCastException. + copy.put(Colors.BROWN, new HashSet()); + } @Test - public void testDeepCopy() throws Exception { + public void testDeepCopy() throws Exception { final Set mambaAka = new HashSet(); mambaAka.add("Beatrix Kiddo"); mambaAka.add("The Bride"); - _original.put(Vipers.BLACK_MAMBA, mambaAka); - - EnumMap> copy = _kryo.copy(_original); - assertNotSame(_original, copy); - assertTrue(copy.containsKey(Vipers.BLACK_MAMBA)); - assertNotSame(_original.get(Vipers.BLACK_MAMBA), copy.get(Vipers.BLACK_MAMBA)); - assertEquals(_original, copy); - } + _original.put(Vipers.BLACK_MAMBA, mambaAka); + + EnumMap> copy = _kryo.copy(_original); + assertNotSame(_original, copy); + assertTrue(copy.containsKey(Vipers.BLACK_MAMBA)); + assertNotSame(_original.get(Vipers.BLACK_MAMBA), copy.get(Vipers.BLACK_MAMBA)); + assertEquals(_original, copy); + } } diff --git a/src/test/java/de/javakaffee/kryoserializers/FieldAnnotationAwareSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/FieldAnnotationAwareSerializerTest.java index 25bf6a9b..eba76ffc 100644 --- a/src/test/java/de/javakaffee/kryoserializers/FieldAnnotationAwareSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/FieldAnnotationAwareSerializerTest.java @@ -1,11 +1,26 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers; -import com.esotericsoftware.kryo.Kryo; -import com.esotericsoftware.kryo.factories.SerializerFactory; -import com.esotericsoftware.kryo.io.Input; -import com.esotericsoftware.kryo.io.Output; - -import org.testng.annotations.Test; +import static java.nio.charset.StandardCharsets.UTF_8; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertNull; +import static org.testng.Assert.assertTrue; import java.lang.annotation.Annotation; import java.lang.annotation.ElementType; @@ -15,11 +30,12 @@ import java.nio.ByteBuffer; import java.util.Arrays; -import static java.nio.charset.StandardCharsets.UTF_8; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertFalse; -import static org.testng.Assert.assertNull; -import static org.testng.Assert.assertTrue; +import org.testng.annotations.Test; + +import com.esotericsoftware.kryo.Kryo; +import com.esotericsoftware.kryo.factories.SerializerFactory; +import com.esotericsoftware.kryo.io.Input; +import com.esotericsoftware.kryo.io.Output; /** * A test case for the {@link FieldAnnotationAwareSerializer}. @@ -29,102 +45,101 @@ */ public class FieldAnnotationAwareSerializerTest { - // Use Non-ASCII characters in order to be able to check the byte buffer for - // the existence of the string values. - protected static final String FIRST_VALUE = "\u00e5\u00e6\u00f8 first value"; - protected static final String SECOND_VALUE = "\u00e4\u00f6\u00fc second value"; + // Use Non-ASCII characters in order to be able to check the byte buffer for + // the existence of the string values. + protected static final String FIRST_VALUE = "\u00e5\u00e6\u00f8 first value"; + protected static final String SECOND_VALUE = "\u00e4\u00f6\u00fc second value"; - private static final int BUFFER_SIZE = 1024; + private static final int BUFFER_SIZE = 1024; - private CustomBean makeBean() { - final CustomBean customBean = new CustomBean(); - customBean.setFirstValue(FIRST_VALUE); - customBean.setSecondValue(SECOND_VALUE); - return customBean; - } + private CustomBean makeBean() { + final CustomBean customBean = new CustomBean(); + customBean.setFirstValue(FIRST_VALUE); + customBean.setSecondValue(SECOND_VALUE); + return customBean; + } - private byte[] makeBuffer() { - return new byte[BUFFER_SIZE]; - } + private byte[] makeBuffer() { + return new byte[BUFFER_SIZE]; + } - @Test - public void testExcludeFields() throws Exception { + @Test + public void testExcludeFields() throws Exception { - final Kryo kryo = new Kryo(); - @SuppressWarnings("unchecked") + final Kryo kryo = new Kryo(); + @SuppressWarnings("unchecked") final SerializerFactory disregardingSerializerFactory = new FieldAnnotationAwareSerializer.Factory( - Arrays.>asList(CustomMark.class), true); - kryo.addDefaultSerializer(CustomBean.class, disregardingSerializerFactory); + Arrays.> asList(CustomMark.class), true); + kryo.addDefaultSerializer(CustomBean.class, disregardingSerializerFactory); - final byte[] buffer = makeBuffer(); + final byte[] buffer = makeBuffer(); - final CustomBean outputBean = makeBean(); - final Output output = new Output(buffer); - kryo.writeObject(output, outputBean); + final CustomBean outputBean = makeBean(); + final Output output = new Output(buffer); + kryo.writeObject(output, outputBean); - final Input input = new Input(buffer); - final CustomBean inputBean = kryo.readObject(input, CustomBean.class); + final Input input = new Input(buffer); + final CustomBean inputBean = kryo.readObject(input, CustomBean.class); - String decodedBuffer = UTF_8.decode(ByteBuffer.wrap(buffer)).toString(); + String decodedBuffer = UTF_8.decode(ByteBuffer.wrap(buffer)).toString(); - assertEquals(inputBean.getSecondValue(), outputBean.getSecondValue()); - assertFalse(decodedBuffer.contains(outputBean.getFirstValue())); - assertTrue(decodedBuffer.contains(outputBean.getSecondValue())); - assertNull(inputBean.getFirstValue()); - } + assertEquals(inputBean.getSecondValue(), outputBean.getSecondValue()); + assertFalse(decodedBuffer.contains(outputBean.getFirstValue())); + assertTrue(decodedBuffer.contains(outputBean.getSecondValue())); + assertNull(inputBean.getFirstValue()); + } - @Test - public void testIncludeFields() throws Exception { + @Test + public void testIncludeFields() throws Exception { - final Kryo kryo = new Kryo(); - @SuppressWarnings("unchecked") + final Kryo kryo = new Kryo(); + @SuppressWarnings("unchecked") final SerializerFactory regardingSerializerFactory = new FieldAnnotationAwareSerializer.Factory( - Arrays.>asList(CustomMark.class), false); - kryo.addDefaultSerializer(CustomBean.class, regardingSerializerFactory); + Arrays.> asList(CustomMark.class), false); + kryo.addDefaultSerializer(CustomBean.class, regardingSerializerFactory); - final byte[] buffer = makeBuffer(); + final byte[] buffer = makeBuffer(); - final CustomBean outputBean = makeBean(); - final Output output = new Output(buffer); - kryo.writeObject(output, outputBean); + final CustomBean outputBean = makeBean(); + final Output output = new Output(buffer); + kryo.writeObject(output, outputBean); - final Input input = new Input(buffer); - final CustomBean inputBean = kryo.readObject(input, CustomBean.class); + final Input input = new Input(buffer); + final CustomBean inputBean = kryo.readObject(input, CustomBean.class); - String decodedBuffer = UTF_8.decode(ByteBuffer.wrap(buffer)).toString(); + String decodedBuffer = UTF_8.decode(ByteBuffer.wrap(buffer)).toString(); - assertEquals(inputBean.getFirstValue(), outputBean.getFirstValue()); - assertTrue(decodedBuffer.contains(outputBean.getFirstValue())); - assertFalse(decodedBuffer.contains(outputBean.getSecondValue())); - assertNull(inputBean.getSecondValue()); - } + assertEquals(inputBean.getFirstValue(), outputBean.getFirstValue()); + assertTrue(decodedBuffer.contains(outputBean.getFirstValue())); + assertFalse(decodedBuffer.contains(outputBean.getSecondValue())); + assertNull(inputBean.getSecondValue()); + } - private static class CustomBean { + private static class CustomBean { - @CustomMark - private String firstValue; + @CustomMark + private String firstValue; - private String secondValue; + private String secondValue; - public String getSecondValue() { - return secondValue; - } + public String getSecondValue() { + return secondValue; + } - public void setSecondValue(final String secondValue) { - this.secondValue = secondValue; - } + public void setSecondValue(final String secondValue) { + this.secondValue = secondValue; + } - public String getFirstValue() { - return firstValue; - } + public String getFirstValue() { + return firstValue; + } - public void setFirstValue(final String firstValue) { - this.firstValue = firstValue; - } - } + public void setFirstValue(final String firstValue) { + this.firstValue = firstValue; + } + } - @Target(ElementType.FIELD) - @Retention(RetentionPolicy.RUNTIME) - private static @interface CustomMark { - } + @Target(ElementType.FIELD) + @Retention(RetentionPolicy.RUNTIME) + private static @interface CustomMark {} } diff --git a/src/test/java/de/javakaffee/kryoserializers/KryoTest.java b/src/test/java/de/javakaffee/kryoserializers/KryoTest.java index 5df70796..544897b7 100644 --- a/src/test/java/de/javakaffee/kryoserializers/KryoTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/KryoTest.java @@ -16,19 +16,6 @@ */ package de.javakaffee.kryoserializers; -import com.esotericsoftware.kryo.Kryo; -import com.esotericsoftware.kryo.Serializer; -import com.esotericsoftware.kryo.io.Input; -import com.esotericsoftware.kryo.io.Output; -import com.esotericsoftware.kryo.serializers.DefaultSerializers.BigDecimalSerializer; -import com.esotericsoftware.kryo.serializers.DefaultSerializers.BigIntegerSerializer; - -import org.apache.commons.lang3.mutable.MutableInt; -import org.testng.Assert; -import org.testng.annotations.BeforeTest; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; - import java.lang.reflect.Field; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Modifier; @@ -36,46 +23,28 @@ import java.math.BigInteger; import java.net.URI; import java.sql.Timestamp; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.BitSet; -import java.util.Calendar; -import java.util.Collection; -import java.util.Collections; -import java.util.Currency; -import java.util.Date; -import java.util.EnumMap; -import java.util.EnumSet; -import java.util.GregorianCalendar; -import java.util.HashMap; -import java.util.HashSet; -import java.util.IdentityHashMap; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Set; -import java.util.UUID; +import java.util.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import java.util.regex.Pattern; -import de.javakaffee.kryoserializers.TestClasses.ClassWithoutDefaultConstructor; -import de.javakaffee.kryoserializers.TestClasses.Container; -import de.javakaffee.kryoserializers.TestClasses.CounterHolder; -import de.javakaffee.kryoserializers.TestClasses.CounterHolderArray; -import de.javakaffee.kryoserializers.TestClasses.Email; -import de.javakaffee.kryoserializers.TestClasses.HashMapWithIntConstructorOnly; -import de.javakaffee.kryoserializers.TestClasses.Holder; -import de.javakaffee.kryoserializers.TestClasses.HolderArray; -import de.javakaffee.kryoserializers.TestClasses.HolderList; -import de.javakaffee.kryoserializers.TestClasses.MyContainer; -import de.javakaffee.kryoserializers.TestClasses.Person; +import org.apache.commons.lang3.mutable.MutableInt; +import org.testng.Assert; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import com.esotericsoftware.kryo.Kryo; +import com.esotericsoftware.kryo.Serializer; +import com.esotericsoftware.kryo.io.Input; +import com.esotericsoftware.kryo.io.Output; +import com.esotericsoftware.kryo.serializers.DefaultSerializers.BigDecimalSerializer; +import com.esotericsoftware.kryo.serializers.DefaultSerializers.BigIntegerSerializer; + +import de.javakaffee.kryoserializers.TestClasses.*; import de.javakaffee.kryoserializers.TestClasses.Person.Gender; -import de.javakaffee.kryoserializers.TestClasses.SomeInterface; -import static de.javakaffee.kryoserializers.TestClasses.createPerson; +import static de.javakaffee.kryoserializers.TestClasses.*; import static org.testng.Assert.assertEquals; /** @@ -84,809 +53,792 @@ * @author Martin Grotzke */ public class KryoTest { - - private Kryo _kryo; - - @BeforeTest - protected void beforeTest() { - _kryo = new KryoReflectionFactorySupport() { - - @Override - @SuppressWarnings( { "rawtypes", "unchecked" } ) - public Serializer getDefaultSerializer( final Class type ) { - if ( EnumSet.class.isAssignableFrom( type ) ) { - return new EnumSetSerializer(); - } - if ( EnumMap.class.isAssignableFrom( type ) ) { - return new EnumMapSerializer(); - } - if ( Collection.class.isAssignableFrom( type ) ) { - return new CopyForIterateCollectionSerializer(); - } - if ( Map.class.isAssignableFrom( type ) ) { - return new CopyForIterateMapSerializer(); - } - if ( Date.class.isAssignableFrom( type ) ) { - return new DateSerializer( type ); - } - return super.getDefaultSerializer( type ); - } - }; - _kryo.setRegistrationRequired(false); - _kryo.register( Arrays.asList( "" ).getClass(), new ArraysAsListSerializer() ); - _kryo.register( Collections.EMPTY_LIST.getClass(), new CollectionsEmptyListSerializer() ); - _kryo.register( Collections.EMPTY_MAP.getClass(), new CollectionsEmptyMapSerializer() ); - _kryo.register( Collections.EMPTY_SET.getClass(), new CollectionsEmptySetSerializer() ); - _kryo.register( Collections.singletonList( "" ).getClass(), new CollectionsSingletonListSerializer() ); - _kryo.register( Collections.singleton( "" ).getClass(), new CollectionsSingletonSetSerializer() ); - _kryo.register( Collections.singletonMap( "", "" ).getClass(), new CollectionsSingletonMapSerializer() ); - _kryo.register( BigDecimal.class, new BigDecimalSerializer() ); - _kryo.register( BigInteger.class, new BigIntegerSerializer() ); - _kryo.register( Pattern.class, new RegexSerializer() ); - _kryo.register( BitSet.class, new BitSetSerializer() ); - _kryo.register( URI.class, new URISerializer() ); - _kryo.register( UUID.class, new UUIDSerializer() ); - _kryo.register( GregorianCalendar.class, new GregorianCalendarSerializer() ); - _kryo.register( InvocationHandler.class, new JdkProxySerializer() ); - UnmodifiableCollectionsSerializer.registerSerializers( _kryo ); - SynchronizedCollectionsSerializer.registerSerializers( _kryo ); - } - - @Test( enabled = true ) - public void testSingletonList() throws Exception { - final List obj = Collections.singletonList( "foo" ); - final List deserialized = deserialize( serialize( obj ), obj.getClass() ); - assertDeepEquals( deserialized, obj ); - } - - @Test( enabled = true ) - public void testCopySingletonList() throws Exception { - final List obj = Collections.singletonList( "foo" ); - final List copy = _kryo.copy( obj ); - assertDeepEquals( copy, obj ); - } - - @Test( enabled = true ) - public void testSingletonSet() throws Exception { - final Set obj = Collections.singleton( "foo" ); - final Set deserialized = deserialize( serialize( obj ), obj.getClass() ); - assertDeepEquals( deserialized, obj ); - } - - @Test( enabled = true ) - public void testCopySingletonSet() throws Exception { - final Set obj = Collections.singleton( "foo" ); - final Set copy = _kryo.copy( obj ); - assertDeepEquals( copy, obj ); - } - - @Test( enabled = true ) - public void testSingletonMap() throws Exception { - final Map obj = Collections.singletonMap( "foo", "bar" ); - final Map deserialized = deserialize( serialize( obj ), obj.getClass() ); - assertDeepEquals( deserialized, obj ); - } - - @Test( enabled = true ) - public void testCopySingletonMap() throws Exception { - final Map obj = Collections.singletonMap( "foo", "bar" ); - final Map copy = _kryo.copy( obj ); - assertDeepEquals( copy, obj ); - } - - @Test( enabled = true ) - public void testEnumSet() throws Exception { - final EnumSet set = EnumSet.allOf( Gender.class ); - final EnumSet deserialized = deserialize( serialize( set ), set.getClass() ); - assertDeepEquals( deserialized, set ); - } - - @Test - public void testCopyEnumSet() throws Exception { - final EnumSet set = EnumSet.allOf( Gender.class ); - final EnumSet copy = _kryo.copy(set); - assertDeepEquals( copy, set ); - } - - @Test( enabled = true ) - public void testEnumMap() throws Exception { - final EnumMap map = new EnumMap( Gender.class ); - final String value = "foo"; - map.put( Gender.FEMALE, value ); - // Another entry with the same value - to check reference handling - map.put( Gender.MALE, value ); - @SuppressWarnings( "unchecked" ) - final EnumMap deserialized = deserialize( serialize( map ), map.getClass() ); - assertDeepEquals( deserialized, map ); - } - - @Test - public void testCopyEnumMap() throws Exception { - final EnumMap map = new EnumMap( Gender.class ); - final String value = "foo"; - map.put( Gender.FEMALE, value ); - final EnumMap copy = _kryo.copy(map); - assertDeepEquals( copy, map ); - } - - /** - * Test that linked hash map is serialized correctly with the {@link CopyForIterateMapSerializer}: - * test that insertion order is retained. - * @throws Exception - */ - @Test( enabled = true ) - public void testCopyForIterateMapSerializer() throws Exception { - final Map map = new LinkedHashMap(); - // use doubles as e.g. integers hash to the value... - for( int i = 0; i < 10; i++ ) { - map.put( Double.valueOf( String.valueOf( i ) + "." + Math.abs( i ) ), "value: " + i ); - } - @SuppressWarnings( "unchecked" ) - final Map deserialized = deserialize( serialize( map ), map.getClass() ); - assertDeepEquals( deserialized, map ); - } - - @Test( enabled = true ) - public void testGregorianCalendar() throws Exception { - final Holder cal = new Holder( Calendar.getInstance( Locale.ENGLISH ) ); - @SuppressWarnings( "unchecked" ) - final Holder deserialized = deserialize( serialize( cal ), Holder.class ); - assertDeepEquals( deserialized, cal ); - - assertEquals( deserialized.item.getTimeInMillis(), cal.item.getTimeInMillis() ); - assertEquals( deserialized.item.getTimeZone(), cal.item.getTimeZone() ); - assertEquals( deserialized.item.getMinimalDaysInFirstWeek(), cal.item.getMinimalDaysInFirstWeek() ); - assertEquals( deserialized.item.getFirstDayOfWeek(), cal.item.getFirstDayOfWeek() ); - assertEquals( deserialized.item.isLenient(), cal.item.isLenient() ); - } - - @Test( enabled = true ) - public void testCopyGregorianCalendar() throws Exception { - final Holder cal = new Holder( Calendar.getInstance( Locale.ENGLISH ) ); - final Holder copy = _kryo.copy( cal ); - assertDeepEquals( copy, cal ); - - assertEquals( copy.item.getTimeInMillis(), cal.item.getTimeInMillis() ); - assertEquals( copy.item.getTimeZone(), cal.item.getTimeZone() ); - assertEquals( copy.item.getMinimalDaysInFirstWeek(), cal.item.getMinimalDaysInFirstWeek() ); - assertEquals( copy.item.getFirstDayOfWeek(), cal.item.getFirstDayOfWeek() ); - assertEquals( copy.item.isLenient(), cal.item.isLenient() ); - } - - @Test( enabled = true ) - public void testJavaUtilDate() throws Exception { - final Holder cal = new Holder( new Date(System.currentTimeMillis()) ); - @SuppressWarnings( "unchecked" ) - final Holder deserialized = deserialize( serialize( cal ), Holder.class ); - assertDeepEquals( deserialized, cal ); - assertEquals(deserialized.item.getTime(), cal.item.getTime()); - } - - @Test( enabled = true ) - public void testCopyJavaUtilDate() throws Exception { - final Holder cal = new Holder( new Date(System.currentTimeMillis()) ); - final Holder copy = _kryo.copy( cal ); - assertDeepEquals( copy, cal ); - assertEquals(copy.item.getTime(), cal.item.getTime()); - } - - @Test( enabled = true ) - public void testJavaSqlTimestamp() throws Exception { - final Holder cal = new Holder( new Timestamp(System.currentTimeMillis()) ); - @SuppressWarnings( "unchecked" ) - final Holder deserialized = deserialize( serialize( cal ), Holder.class ); - assertDeepEquals( deserialized, cal ); - assertEquals( deserialized.item.getTime(), cal.item.getTime() ); - } - - @Test( enabled = true ) - public void testCopyJavaSqlTimestamp() throws Exception { - final Holder cal = new Holder( new Timestamp(System.currentTimeMillis()) ); - final Holder copy = _kryo.copy( cal ); - assertDeepEquals( copy, cal ); - assertEquals( copy.item.getTime(), cal.item.getTime() ); - } - - @Test(enabled = true) - public void testJavaSqlDate() throws Exception { - final Holder date = new Holder(new java.sql.Date(System.currentTimeMillis())); - @SuppressWarnings("unchecked") - final Holder deserialized = deserialize(serialize(date), Holder.class); - assertDeepEquals(deserialized, date); - assertEquals(deserialized.item.getTime(), date.item.getTime()); - } - - @Test(enabled = true) - public void testCopyJavaSqlDate() throws Exception { - final Holder date = new Holder(new java.sql.Date(System.currentTimeMillis())); - final Holder copy = _kryo.copy(date); - assertDeepEquals(copy, date); - assertEquals(copy.item.getTime(), date.item.getTime()); - } - - @Test(enabled = true) - public void testJavaSqlTime() throws Exception { - final Holder time = new Holder(new java.sql.Time(System.currentTimeMillis())); - @SuppressWarnings("unchecked") - final Holder deserialized = deserialize(serialize(time), Holder.class); - assertDeepEquals(deserialized, time); - assertEquals(deserialized.item.getTime(), time.item.getTime()); - } - - @Test(enabled = true) - public void testCopyJavaSqlTime() throws Exception { - final Holder time = new Holder(new java.sql.Time(System.currentTimeMillis())); - final Holder copy = _kryo.copy(time); - assertDeepEquals(copy, time); - assertEquals(copy.item.getTime(), time.item.getTime()); - } - - @Test(enabled = true) - public void testBitSet() throws Exception { - final BitSet bitSet = new BitSet(10); - bitSet.flip(2); - bitSet.flip(4); - final Holder holder = new Holder(bitSet); - @SuppressWarnings("unchecked") - final Holder deserialized = deserialize(serialize(holder), Holder.class); - assertDeepEquals(deserialized, holder); - } - - @Test(enabled = true) - public void testCopyBitSet() throws Exception { - final BitSet bitSet = new BitSet(10); - bitSet.flip(2); - bitSet.flip(4); - final BitSet copy = _kryo.copy(bitSet); - assertDeepEquals(copy, bitSet); - } - - @Test( enabled = true ) - public void testURI() throws Exception { - final Holder uri = new Holder( new URI("http://www.google.com") ); - @SuppressWarnings( "unchecked" ) - final Holder deserialized = deserialize( serialize( uri ), Holder.class ); - assertDeepEquals(deserialized, uri); - } - - @Test( enabled = true ) - public void testCopyURI() throws Exception { - final Holder uri = new Holder( new URI("http://www.google.com") ); - final Holder copy = _kryo.copy( uri ); - assertDeepEquals(copy, uri); - } - - @Test( enabled = true ) - public void testUUID() throws Exception { - final Holder uuid = new Holder( UUID.randomUUID() ); - @SuppressWarnings( "unchecked" ) - final Holder deserialized = deserialize( serialize( uuid ), Holder.class ); - assertDeepEquals( deserialized, uuid ); - } - - @Test( enabled = true ) - public void testCopyUUID() throws Exception { - final Holder uuid = new Holder( UUID.randomUUID() ); - final Holder copy = _kryo.copy( uuid ); - assertDeepEquals( copy, uuid ); - } - - @Test( enabled = true ) - public void testRegex() throws Exception { - final Holder pattern = new Holder( Pattern.compile("regex") ); - @SuppressWarnings( "unchecked" ) - final Holder deserialized = deserialize( serialize( pattern ), Holder.class ); - assertDeepEquals( deserialized, pattern ); - - final Holder patternWithFlags = new Holder( Pattern.compile("\n", Pattern.MULTILINE | Pattern.CASE_INSENSITIVE) ); - @SuppressWarnings( "unchecked" ) - final Holder deserializedWithFlags = deserialize( serialize( patternWithFlags ), Holder.class ); - assertDeepEquals( deserializedWithFlags, patternWithFlags ); - } - - @Test( enabled = true ) - public void testCopyRegex() throws Exception { - final Holder pattern = new Holder( Pattern.compile("regex") ); - final Holder copy = _kryo.copy( pattern ); - assertDeepEquals( copy, pattern ); - - final Holder patternWithFlags = new Holder( Pattern.compile("\n", Pattern.MULTILINE | Pattern.CASE_INSENSITIVE) ); - final Holder copyWithFlags = _kryo.copy( patternWithFlags ); - assertDeepEquals( copyWithFlags, patternWithFlags ); - } - - @Test( enabled = true ) - public void testStringBuffer() throws Exception { - final StringBuffer stringBuffer = new StringBuffer( "with some content \n& some lines..." ); - final StringBuffer deserialized = deserialize( serialize( stringBuffer ), StringBuffer.class ); - assertDeepEquals( deserialized, stringBuffer ); - } - - @Test( enabled = true ) - public void testStringBuilder() throws Exception { - final StringBuilder stringBuilder = new StringBuilder( "with some content \n& some lines..." ); - final StringBuilder deserialized = deserialize( serialize( stringBuilder ), StringBuilder.class ); - assertDeepEquals( deserialized, stringBuilder ); - } - - @Test( enabled = true ) - public void testMapWithIntConstructorOnly() throws Exception { - final HashMapWithIntConstructorOnly map = new HashMapWithIntConstructorOnly( 5 ); - final HashMapWithIntConstructorOnly deserialized = - deserialize( serialize( map ), HashMapWithIntConstructorOnly.class ); - assertDeepEquals( deserialized, map ); - - } - - @Test( enabled = true ) - public void testCurrency() throws Exception { - final Currency currency = Currency.getInstance( "EUR" ); - final Currency deserialized = - deserialize( serialize( currency ), Currency.class ); - assertDeepEquals( deserialized, currency ); - - // Check that the transient field defaultFractionDigits is initialized correctly - Assert.assertEquals( deserialized.getCurrencyCode(), currency.getCurrencyCode() ); - Assert.assertEquals( deserialized.getDefaultFractionDigits(), currency.getDefaultFractionDigits() ); - } - - @DataProvider - public Object[][] unmodifiableCollections() { - final HashMap m = new HashMap(); - m.put( "foo", "bar" ); - return new Object[][] { - { Collections.unmodifiableList( new ArrayList( Arrays.asList( "foo", "bar" ) ) ) }, - { Collections.unmodifiableSet( new HashSet( Arrays.asList( "foo", "bar" ) ) ) }, - { Collections.unmodifiableMap( m ) }, - }; - } - - @SuppressWarnings( "unchecked" ) - @Test( enabled = true, dataProvider = "unmodifiableCollections" ) - public void testUnmodifiableCollections( final Object collection ) throws Exception { - final Holder holder = new Holder( collection ); - final Holder deserialized = deserialize( serialize( holder ), Holder.class ); - assertDeepEquals( deserialized, holder ); - } - - @Test( enabled = true, dataProvider = "unmodifiableCollections" ) - public void testCopyUnmodifiableCollections( final Object collection ) throws Exception { - final Holder unmodifiableCollection = new Holder( collection ); - final Holder copy = _kryo.copy( unmodifiableCollection ); - assertDeepEquals( copy, unmodifiableCollection ); - } - - @DataProvider - public Object[][] synchronizedCollections() { - final HashMap m = new HashMap(); - m.put( "foo", "bar" ); - return new Object[][] { - { Collections.synchronizedList( new ArrayList( Arrays.asList( "foo", "bar" ) ) ) }, - { Collections.synchronizedSet( new HashSet( Arrays.asList( "foo", "bar" ) ) ) }, - { Collections.synchronizedMap( m ) }, - }; - } - - @SuppressWarnings( "unchecked" ) - @Test( enabled = true, dataProvider = "synchronizedCollections" ) - public void testSynchronizedCollections( final Object collection ) throws Exception { - final Holder holder = new Holder( collection ); - final Holder deserialized = deserialize( serialize( holder ), Holder.class ); - assertDeepEquals( deserialized, holder ); - } - - @Test( enabled = true, dataProvider = "synchronizedCollections" ) - public void testCopySynchronizedCollections( final Object collection ) throws Exception { - final Holder synchronizedCollection = new Holder( collection ); - final Holder copy = _kryo.copy( synchronizedCollection ); - assertDeepEquals( copy, synchronizedCollection ); - } - - @SuppressWarnings( "unchecked" ) - @Test( enabled = true ) - public void testJavaUtilCollectionsEmptyList() throws Exception { - final Holder> emptyList = new Holder>( Collections.emptyList() ); - final Holder> deserialized = deserialize( serialize( emptyList ), Holder.class ); - assertDeepEquals( deserialized, emptyList ); - } - - @Test( enabled = true ) - public void testCopyJavaUtilCollectionsEmptyList() throws Exception { - final Holder> emptyList = new Holder>( Collections.emptyList() ); - final Holder> copy = _kryo.copy( emptyList ); - assertDeepEquals( copy, emptyList ); - } - - @SuppressWarnings( "unchecked" ) - @Test( enabled = true ) - public void testJavaUtilCollectionsEmptySet() throws Exception { - final Holder> emptyList = new Holder>( Collections.emptySet() ); - final Holder> deserialized = deserialize( serialize( emptyList ), Holder.class ); - assertDeepEquals( deserialized, emptyList ); - } - - @Test( enabled = true ) - public void testCopyJavaUtilCollectionsEmptySet() throws Exception { - final Holder> emptyList = new Holder>( Collections.emptySet() ); - final Holder> copy = _kryo.copy( emptyList ); - assertDeepEquals( copy, emptyList ); - } - - @SuppressWarnings( "unchecked" ) - @Test( enabled = true ) - public void testJavaUtilCollectionsEmptyMap() throws Exception { - final Holder> emptyMap = new Holder>( Collections.emptyMap() ); - final Holder> deserialized = deserialize( serialize( emptyMap ), Holder.class ); - assertDeepEquals( deserialized, emptyMap ); - } - - @Test( enabled = true ) - public void testCopyJavaUtilCollectionsEmptyMap() throws Exception { - final Holder> emptyMap = new Holder>( Collections.emptyMap() ); - final Holder> copy = _kryo.copy( emptyMap ); - assertDeepEquals( copy, emptyMap ); - } - - @SuppressWarnings( "unchecked" ) - @Test( enabled = true ) - public void testJavaUtilArraysAsListEmpty() throws Exception { - final Holder> asListHolder = new Holder>( Arrays. asList() ); - final Holder> deserialized = deserialize( serialize( asListHolder ), Holder.class ); - assertDeepEquals( deserialized, asListHolder ); - } - - @SuppressWarnings( "unchecked" ) - @Test( enabled = true ) - public void testJavaUtilArraysAsListPrimitiveArrayElement() throws Exception { - final int[] values = { 1, 2 }; - @SuppressWarnings("rawtypes") - final Holder> asListHolder = new Holder( Arrays.asList( values ) ); - final Holder> deserialized = deserialize( serialize( asListHolder ), Holder.class ); - assertDeepEquals( deserialized, asListHolder ); - } - - @SuppressWarnings( "unchecked" ) - @Test( enabled = true ) - public void testJavaUtilArraysAsListBoxedPrimitives() throws Exception { - final Integer[] values = { 1, 2 }; - final List list = Arrays.asList(values); - @SuppressWarnings("rawtypes") - final Holder> asListHolder = new Holder(list); - final Holder> deserialized = deserialize( serialize( asListHolder ), Holder.class ); - assertDeepEquals( deserialized, asListHolder ); - } - - @SuppressWarnings( "unchecked" ) - @Test( enabled = true ) - public void testJavaUtilArraysAsListString() throws Exception { - final Holder> asListHolder = new Holder>( Arrays. asList( "foo", "bar" ) ); - final Holder> deserialized = deserialize( serialize( asListHolder ), Holder.class ); - assertDeepEquals( deserialized, asListHolder ); - } - - @SuppressWarnings( "unchecked" ) - @Test( enabled = true ) - public void testJavaUtilArraysAsListEmail() throws Exception { - final Holder> asListHolder = new Holder>( Arrays.asList( new Email( "foo", "foo@example.org" ) ) ); - final Holder> deserialized = deserialize( serialize( asListHolder ), Holder.class ); - assertDeepEquals( deserialized, asListHolder ); - } - - @Test( enabled = true ) - public void testCopyJavaUtilArraysAsList() throws Exception { - final List list = Arrays. asList("foo", "bar"); - final List copy = _kryo.copy(list); - assertDeepEquals( copy, list ); - } - - @Test( enabled = true ) - public void testJdkProxy() throws Exception { - final Holder bean = new Holder( TestClasses.createProxy() ); - @SuppressWarnings( "unchecked" ) - final Holder deserialized = deserialize( serialize( bean ), Holder.class ); - assertDeepEquals( deserialized, bean ); - } - - @Test( enabled = true ) - public void testCopyJdkProxy() throws Exception { - final Holder bean = new Holder( TestClasses.createProxy() ); - final Holder copy = _kryo.copy( bean ); - assertDeepEquals( copy, bean ); - } - - @Test( enabled = true ) - public void testClassSerializer() throws Exception { - final Holder> clazz = new Holder>( String.class ); - @SuppressWarnings( "unchecked" ) - final Holder> deserialized = deserialize( serialize( clazz ), Holder.class ); - assertDeepEquals( deserialized, clazz ); - } - - @Test( enabled = true ) - public void testInnerClass() throws Exception { - // seems to be related to #15 - final Container container = TestClasses.createContainer(); - final Container deserialized = deserialize( serialize( container ), Container.class ); - assertDeepEquals( deserialized, container ); - } - - @Test( enabled = true ) - public void testSharedObjectIdentity_CounterHolder() throws Exception { - - final AtomicInteger sharedObject = new AtomicInteger( 42 ); - final CounterHolder holder1 = new CounterHolder( sharedObject ); - final CounterHolder holder2 = new CounterHolder( sharedObject ); - final CounterHolderArray holderHolder = new CounterHolderArray( holder1, holder2 ); - - final CounterHolderArray deserialized = deserialize( serialize( holderHolder ), CounterHolderArray.class ); - assertDeepEquals( deserialized, holderHolder ); - Assert.assertTrue( deserialized.holders[0].item == deserialized.holders[1].item ); - - } - - @DataProvider( name = "sharedObjectIdentityProvider" ) - protected Object[][] createSharedObjectIdentityProviderData() { - return new Object[][] { - { AtomicInteger.class.getSimpleName(), new AtomicInteger( 42 ) }, - { Email.class.getSimpleName(), new Email( "foo bar", "foo.bar@example.com" ) } }; - } - - @SuppressWarnings( "unchecked" ) - @Test( enabled = true, dataProvider = "sharedObjectIdentityProvider" ) - public void testSharedObjectIdentityWithArray( final String name, final T sharedObject ) throws Exception { - final Holder holder1 = new Holder( sharedObject ); - final Holder holder2 = new Holder( sharedObject ); - final HolderArray holderHolder = new HolderArray( holder1, holder2 ); - - final HolderArray deserialized = deserialize( serialize( holderHolder ), HolderArray.class ); - assertDeepEquals( deserialized, holderHolder ); - Assert.assertTrue( deserialized.holders[0].item == deserialized.holders[1].item ); - } - - @SuppressWarnings( "unchecked" ) - @Test( enabled = true, dataProvider = "sharedObjectIdentityProvider" ) - public void testSharedObjectIdentity( final String name, final T sharedObject ) throws Exception { - final Holder holder1 = new Holder( sharedObject ); - final Holder holder2 = new Holder( sharedObject ); - final HolderList holderHolder = new HolderList( new ArrayList>( Arrays.asList( holder1, holder2 ) ) ); - - final HolderList deserialized = deserialize( serialize( holderHolder ), HolderList.class ); - assertDeepEquals( deserialized, holderHolder ); - Assert.assertTrue( deserialized.holders.get( 0 ).item == deserialized.holders.get( 1 ).item ); - } - - @DataProvider( name = "typesAsSessionAttributesProvider" ) - protected Object[][] createTypesAsSessionAttributesData() { - return new Object[][] { - { Boolean.class, Boolean.TRUE }, - { String.class, "42" }, - { StringBuilder.class, new StringBuilder( "42" ) }, - { StringBuffer.class, new StringBuffer( "42" ) }, - { Class.class, String.class }, - { Long.class, new Long( 42 ) }, - { Integer.class, new Integer( 42 ) }, - { Character.class, new Character( 'c' ) }, - { Byte.class, new Byte( "b".getBytes()[0] ) }, - { Double.class, new Double( 42d ) }, - { Float.class, new Float( 42f ) }, - { Short.class, new Short( (short) 42 ) }, - { BigDecimal.class, new BigDecimal( 42 ) }, - { AtomicInteger.class, new AtomicInteger( 42 ) }, - { AtomicLong.class, new AtomicLong( 42 ) }, - { MutableInt.class, new MutableInt( 42 ) }, - { Integer[].class, new Integer[] { 42 } }, - { Date.class, new Date( System.currentTimeMillis() - 10000 ) }, - { Calendar.class, Calendar.getInstance() }, - { Currency.class, Currency.getInstance( "EUR" ) }, - { ArrayList.class, new ArrayList( Arrays.asList( "foo" ) ) }, - { int[].class, new int[] { 1, 2 } }, - { long[].class, new long[] { 1, 2 } }, - { short[].class, new short[] { 1, 2 } }, - { float[].class, new float[] { 1, 2 } }, - { double[].class, new double[] { 1, 2 } }, - { int[].class, new int[] { 1, 2 } }, - { byte[].class, "42".getBytes() }, - { char[].class, "42".toCharArray() }, - { String[].class, new String[] { "23", "42" } }, - { Person[].class, new Person[] { createPerson( "foo bar", Gender.MALE, 42 ) } } }; - } - - @Test( enabled = true, dataProvider = "typesAsSessionAttributesProvider" ) - public void testTypesAsSessionAttributes( final Class type, final T instance ) throws Exception { - @SuppressWarnings( "unchecked" ) - final T deserialized = (T) deserialize( serialize( instance ), instance.getClass() ); - assertDeepEquals( deserialized, instance ); - } - - @Test( enabled = true ) - public void testTypesInContainerClass() throws Exception { - final MyContainer myContainer = new MyContainer(); - final MyContainer deserialized = deserialize( serialize( myContainer ), MyContainer.class ); - assertDeepEquals( deserialized, myContainer ); - } - - @Test( enabled = true ) - public void testClassWithoutDefaultConstructor() throws Exception { - final ClassWithoutDefaultConstructor obj = TestClasses.createClassWithoutDefaultConstructor( "foo" ); - final ClassWithoutDefaultConstructor deserialized = deserialize( serialize( obj ), ClassWithoutDefaultConstructor.class ); - assertDeepEquals( deserialized, obj ); - } - - @Test( enabled = true ) - public void testPrivateClass() throws Exception { - final Holder holder = new Holder( TestClasses.createPrivateClass( "foo" ) ); - final Holder deserialized = deserialize( serialize( holder ), Holder.class ); - assertDeepEquals( deserialized, holder ); - } - - @Test( enabled = true ) - public void testCollections() throws Exception { - final EntityWithCollections obj = new EntityWithCollections(); - final EntityWithCollections deserialized = deserialize( serialize( obj ), EntityWithCollections.class ); - assertDeepEquals( deserialized, obj ); - } - - @Test( enabled = true ) - public void testCyclicDependencies() throws Exception { - final Person p1 = createPerson( "foo bar", Gender.MALE, 42, "foo.bar@example.org", "foo.bar@example.com" ); - final Person p2 = createPerson( "bar baz", Gender.FEMALE, 42, "bar.baz@example.org", "bar.baz@example.com" ); - p1.addFriend( p2 ); - p2.addFriend( p1 ); - - final Person deserialized = deserialize( serialize( p1 ), Person.class ); - assertDeepEquals( deserialized, p1 ); - } - - public static class EntityWithCollections { - private final String[] _bars; - private final List _foos; - private final Map _bazens; - - public EntityWithCollections() { - _bars = new String[] { "foo", "bar" }; - _foos = new ArrayList( Arrays.asList( "foo", "bar" ) ); - _bazens = new HashMap(); - _bazens.put( "foo", 1 ); - _bazens.put( "bar", 2 ); - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + Arrays.hashCode( _bars ); - result = prime * result + ( ( _bazens == null ) - ? 0 - : _bazens.hashCode() ); - result = prime * result + ( ( _foos == null ) - ? 0 - : _foos.hashCode() ); - return result; - } - - @Override - public boolean equals( final Object obj ) { - if ( this == obj ) { - return true; - } - if ( obj == null ) { - return false; - } - if ( getClass() != obj.getClass() ) { - return false; - } - final EntityWithCollections other = (EntityWithCollections) obj; - if ( !Arrays.equals( _bars, other._bars ) ) { - return false; - } - if ( _bazens == null ) { - if ( other._bazens != null ) { - return false; - } - } else if ( !_bazens.equals( other._bazens ) ) { - return false; - } - if ( _foos == null ) { - if ( other._foos != null ) { - return false; - } - } else if ( !_foos.equals( other._foos ) ) { - return false; - } - return true; - } - } - - public static void assertDeepEquals( final Object one, final Object another ) throws Exception { - assertDeepEquals( one, another, new IdentityHashMap() ); - } - - private static void assertDeepEquals( final Object one, final Object another, final Map alreadyChecked ) - throws Exception { - if ( one == another ) { - return; - } - if ( one == null && another != null || one != null && another == null ) { - Assert.fail( "One of both is null: " + one + ", " + another ); - } - if ( alreadyChecked.containsKey( one ) ) { - return; - } - alreadyChecked.put( one, another ); - - Assert.assertEquals( one.getClass(), another.getClass() ); - if ( one.getClass().isPrimitive() || one instanceof String || one instanceof Character || one instanceof Boolean - || one instanceof Class ) { - Assert.assertEquals( one, another ); - return; - } - - if ( Map.class.isAssignableFrom( one.getClass() ) ) { - final Map m1 = (Map) one; - final Map m2 = (Map) another; - Assert.assertEquals( m1.size(), m2.size() ); - final Iterator> iter1 = m1.entrySet().iterator(); - final Iterator> iter2 = m2.entrySet().iterator(); - while( iter1.hasNext() ) { - Assert.assertTrue( iter2.hasNext() ); - assertDeepEquals( iter1.next(), iter2.next(), alreadyChecked ); - } - return; - } - - if ( Number.class.isAssignableFrom( one.getClass() ) ) { - Assert.assertEquals( ( (Number) one ).longValue(), ( (Number) another ).longValue() ); - return; - } - - if ( one instanceof Currency ) { - // Check that the transient field defaultFractionDigits is initialized correctly (that was issue #34) - final Currency currency1 = ( Currency) one; - final Currency currency2 = ( Currency) another; - Assert.assertEquals( currency1.getCurrencyCode(), currency2.getCurrencyCode() ); - Assert.assertEquals( currency1.getDefaultFractionDigits(), currency2.getDefaultFractionDigits() ); - } - - Class clazz = one.getClass(); - while ( clazz != null ) { - assertEqualDeclaredFields( clazz, one, another, alreadyChecked ); - clazz = clazz.getSuperclass(); - } - - } - - private static void assertEqualDeclaredFields( final Class clazz, final Object one, final Object another, - final Map alreadyChecked ) throws Exception, IllegalAccessException { - for ( final Field field : clazz.getDeclaredFields() ) { - field.setAccessible( true ); - if ( !Modifier.isTransient( field.getModifiers() ) ) { - assertDeepEquals( field.get( one ), field.get( another ), alreadyChecked ); - } - } - } - - protected byte[] serialize( final Object o ) { - return serialize(_kryo, o); - } - - public static byte[] serialize(final Kryo kryo, final Object o) { - if ( o == null ) { - throw new NullPointerException( "Can't serialize null" ); - } - - final Output output = new Output(4096); - kryo.writeObject(output, o); - output.flush(); - return output.getBuffer(); - } - - protected T deserialize( final byte[] in, final Class clazz ) { - return deserialize(_kryo, in, clazz); - } - - public static T deserialize(final Kryo kryo, final byte[] in, final Class clazz) { - final Input input = new Input(in); - return kryo.readObject(input, clazz); - } + + private Kryo _kryo; + + public static void assertDeepEquals(final Object one, final Object another) throws Exception { + assertDeepEquals(one, another, new IdentityHashMap()); + } + + private static void assertDeepEquals(final Object one, final Object another, + final Map alreadyChecked) throws Exception { + if (one == another) { + return; + } + if (one == null && another != null || one != null && another == null) { + Assert.fail("One of both is null: " + one + ", " + another); + } + if (alreadyChecked.containsKey(one)) { + return; + } + alreadyChecked.put(one, another); + + Assert.assertEquals(one.getClass(), another.getClass()); + if (one.getClass().isPrimitive() || one instanceof String || one instanceof Character || one instanceof Boolean + || one instanceof Class) { + Assert.assertEquals(one, another); + return; + } + + if (Map.class.isAssignableFrom(one.getClass())) { + final Map m1 = (Map) one; + final Map m2 = (Map) another; + Assert.assertEquals(m1.size(), m2.size()); + final Iterator> iter1 = m1.entrySet().iterator(); + final Iterator> iter2 = m2.entrySet().iterator(); + while (iter1.hasNext()) { + Assert.assertTrue(iter2.hasNext()); + assertDeepEquals(iter1.next(), iter2.next(), alreadyChecked); + } + return; + } + + if (Number.class.isAssignableFrom(one.getClass())) { + Assert.assertEquals(((Number) one).longValue(), ((Number) another).longValue()); + return; + } + + if (one instanceof Currency) { + // Check that the transient field defaultFractionDigits is initialized correctly (that was issue #34) + final Currency currency1 = (Currency) one; + final Currency currency2 = (Currency) another; + Assert.assertEquals(currency1.getCurrencyCode(), currency2.getCurrencyCode()); + Assert.assertEquals(currency1.getDefaultFractionDigits(), currency2.getDefaultFractionDigits()); + } + + Class clazz = one.getClass(); + while (clazz != null) { + assertEqualDeclaredFields(clazz, one, another, alreadyChecked); + clazz = clazz.getSuperclass(); + } + + } + + private static void assertEqualDeclaredFields(final Class clazz, final Object one, + final Object another, final Map alreadyChecked) throws Exception, IllegalAccessException { + for (final Field field : clazz.getDeclaredFields()) { + field.setAccessible(true); + if (!Modifier.isTransient(field.getModifiers())) { + assertDeepEquals(field.get(one), field.get(another), alreadyChecked); + } + } + } + + public static byte[] serialize(final Kryo kryo, final Object o) { + if (o == null) { + throw new NullPointerException("Can't serialize null"); + } + + final Output output = new Output(4096); + kryo.writeObject(output, o); + output.flush(); + return output.getBuffer(); + } + + public static T deserialize(final Kryo kryo, final byte[] in, final Class clazz) { + final Input input = new Input(in); + return kryo.readObject(input, clazz); + } + + @BeforeTest + protected void beforeTest() { + _kryo = new KryoReflectionFactorySupport() { + + @Override + @SuppressWarnings({"rawtypes", "unchecked"}) + public Serializer getDefaultSerializer(final Class type) { + if (EnumSet.class.isAssignableFrom(type)) { + return new EnumSetSerializer(); + } + if (EnumMap.class.isAssignableFrom(type)) { + return new EnumMapSerializer(); + } + if (Collection.class.isAssignableFrom(type)) { + return new CopyForIterateCollectionSerializer(); + } + if (Map.class.isAssignableFrom(type)) { + return new CopyForIterateMapSerializer(); + } + if (Date.class.isAssignableFrom(type)) { + return new DateSerializer(type); + } + return super.getDefaultSerializer(type); + } + }; + _kryo.setRegistrationRequired(false); + _kryo.register(Arrays.asList("").getClass(), new ArraysAsListSerializer()); + _kryo.register(Collections.EMPTY_LIST.getClass(), new CollectionsEmptyListSerializer()); + _kryo.register(Collections.EMPTY_MAP.getClass(), new CollectionsEmptyMapSerializer()); + _kryo.register(Collections.EMPTY_SET.getClass(), new CollectionsEmptySetSerializer()); + _kryo.register(Collections.singletonList("").getClass(), new CollectionsSingletonListSerializer()); + _kryo.register(Collections.singleton("").getClass(), new CollectionsSingletonSetSerializer()); + _kryo.register(Collections.singletonMap("", "").getClass(), new CollectionsSingletonMapSerializer()); + _kryo.register(BigDecimal.class, new BigDecimalSerializer()); + _kryo.register(BigInteger.class, new BigIntegerSerializer()); + _kryo.register(Pattern.class, new RegexSerializer()); + _kryo.register(BitSet.class, new BitSetSerializer()); + _kryo.register(URI.class, new URISerializer()); + _kryo.register(UUID.class, new UUIDSerializer()); + _kryo.register(GregorianCalendar.class, new GregorianCalendarSerializer()); + _kryo.register(InvocationHandler.class, new JdkProxySerializer()); + UnmodifiableCollectionsSerializer.registerSerializers(_kryo); + SynchronizedCollectionsSerializer.registerSerializers(_kryo); + } + + @Test(enabled = true) + public void testSingletonList() throws Exception { + final List obj = Collections.singletonList("foo"); + final List deserialized = deserialize(serialize(obj), obj.getClass()); + assertDeepEquals(deserialized, obj); + } + + @Test(enabled = true) + public void testCopySingletonList() throws Exception { + final List obj = Collections.singletonList("foo"); + final List copy = _kryo.copy(obj); + assertDeepEquals(copy, obj); + } + + @Test(enabled = true) + public void testSingletonSet() throws Exception { + final Set obj = Collections.singleton("foo"); + final Set deserialized = deserialize(serialize(obj), obj.getClass()); + assertDeepEquals(deserialized, obj); + } + + @Test(enabled = true) + public void testCopySingletonSet() throws Exception { + final Set obj = Collections.singleton("foo"); + final Set copy = _kryo.copy(obj); + assertDeepEquals(copy, obj); + } + + @Test(enabled = true) + public void testSingletonMap() throws Exception { + final Map obj = Collections.singletonMap("foo", "bar"); + final Map deserialized = deserialize(serialize(obj), obj.getClass()); + assertDeepEquals(deserialized, obj); + } + + @Test(enabled = true) + public void testCopySingletonMap() throws Exception { + final Map obj = Collections.singletonMap("foo", "bar"); + final Map copy = _kryo.copy(obj); + assertDeepEquals(copy, obj); + } + + @Test(enabled = true) + public void testEnumSet() throws Exception { + final EnumSet set = EnumSet.allOf(Gender.class); + final EnumSet deserialized = deserialize(serialize(set), set.getClass()); + assertDeepEquals(deserialized, set); + } + + @Test + public void testCopyEnumSet() throws Exception { + final EnumSet set = EnumSet.allOf(Gender.class); + final EnumSet copy = _kryo.copy(set); + assertDeepEquals(copy, set); + } + + @Test(enabled = true) + public void testEnumMap() throws Exception { + final EnumMap map = new EnumMap(Gender.class); + final String value = "foo"; + map.put(Gender.FEMALE, value); + // Another entry with the same value - to check reference handling + map.put(Gender.MALE, value); + @SuppressWarnings("unchecked") + final EnumMap deserialized = deserialize(serialize(map), map.getClass()); + assertDeepEquals(deserialized, map); + } + + @Test + public void testCopyEnumMap() throws Exception { + final EnumMap map = new EnumMap(Gender.class); + final String value = "foo"; + map.put(Gender.FEMALE, value); + final EnumMap copy = _kryo.copy(map); + assertDeepEquals(copy, map); + } + + /** + * Test that linked hash map is serialized correctly with the {@link CopyForIterateMapSerializer}: + * test that insertion order is retained. + * + * @throws Exception + */ + @Test(enabled = true) + public void testCopyForIterateMapSerializer() throws Exception { + final Map map = new LinkedHashMap(); + // use doubles as e.g. integers hash to the value... + for (int i = 0; i < 10; i++) { + map.put(Double.valueOf(String.valueOf(i) + "." + Math.abs(i)), "value: " + i); + } + @SuppressWarnings("unchecked") + final Map deserialized = deserialize(serialize(map), map.getClass()); + assertDeepEquals(deserialized, map); + } + + @Test(enabled = true) + public void testGregorianCalendar() throws Exception { + final Holder cal = new Holder(Calendar.getInstance(Locale.ENGLISH)); + @SuppressWarnings("unchecked") + final Holder deserialized = deserialize(serialize(cal), Holder.class); + assertDeepEquals(deserialized, cal); + + assertEquals(deserialized.item.getTimeInMillis(), cal.item.getTimeInMillis()); + assertEquals(deserialized.item.getTimeZone(), cal.item.getTimeZone()); + assertEquals(deserialized.item.getMinimalDaysInFirstWeek(), cal.item.getMinimalDaysInFirstWeek()); + assertEquals(deserialized.item.getFirstDayOfWeek(), cal.item.getFirstDayOfWeek()); + assertEquals(deserialized.item.isLenient(), cal.item.isLenient()); + } + + @Test(enabled = true) + public void testCopyGregorianCalendar() throws Exception { + final Holder cal = new Holder(Calendar.getInstance(Locale.ENGLISH)); + final Holder copy = _kryo.copy(cal); + assertDeepEquals(copy, cal); + + assertEquals(copy.item.getTimeInMillis(), cal.item.getTimeInMillis()); + assertEquals(copy.item.getTimeZone(), cal.item.getTimeZone()); + assertEquals(copy.item.getMinimalDaysInFirstWeek(), cal.item.getMinimalDaysInFirstWeek()); + assertEquals(copy.item.getFirstDayOfWeek(), cal.item.getFirstDayOfWeek()); + assertEquals(copy.item.isLenient(), cal.item.isLenient()); + } + + @Test(enabled = true) + public void testJavaUtilDate() throws Exception { + final Holder cal = new Holder(new Date(System.currentTimeMillis())); + @SuppressWarnings("unchecked") + final Holder deserialized = deserialize(serialize(cal), Holder.class); + assertDeepEquals(deserialized, cal); + assertEquals(deserialized.item.getTime(), cal.item.getTime()); + } + + @Test(enabled = true) + public void testCopyJavaUtilDate() throws Exception { + final Holder cal = new Holder(new Date(System.currentTimeMillis())); + final Holder copy = _kryo.copy(cal); + assertDeepEquals(copy, cal); + assertEquals(copy.item.getTime(), cal.item.getTime()); + } + + @Test(enabled = true) + public void testJavaSqlTimestamp() throws Exception { + final Holder cal = new Holder(new Timestamp(System.currentTimeMillis())); + @SuppressWarnings("unchecked") + final Holder deserialized = deserialize(serialize(cal), Holder.class); + assertDeepEquals(deserialized, cal); + assertEquals(deserialized.item.getTime(), cal.item.getTime()); + } + + @Test(enabled = true) + public void testCopyJavaSqlTimestamp() throws Exception { + final Holder cal = new Holder(new Timestamp(System.currentTimeMillis())); + final Holder copy = _kryo.copy(cal); + assertDeepEquals(copy, cal); + assertEquals(copy.item.getTime(), cal.item.getTime()); + } + + @Test(enabled = true) + public void testJavaSqlDate() throws Exception { + final Holder date = new Holder(new java.sql.Date(System.currentTimeMillis())); + @SuppressWarnings("unchecked") + final Holder deserialized = deserialize(serialize(date), Holder.class); + assertDeepEquals(deserialized, date); + assertEquals(deserialized.item.getTime(), date.item.getTime()); + } + + @Test(enabled = true) + public void testCopyJavaSqlDate() throws Exception { + final Holder date = new Holder(new java.sql.Date(System.currentTimeMillis())); + final Holder copy = _kryo.copy(date); + assertDeepEquals(copy, date); + assertEquals(copy.item.getTime(), date.item.getTime()); + } + + @Test(enabled = true) + public void testJavaSqlTime() throws Exception { + final Holder time = new Holder(new java.sql.Time(System.currentTimeMillis())); + @SuppressWarnings("unchecked") + final Holder deserialized = deserialize(serialize(time), Holder.class); + assertDeepEquals(deserialized, time); + assertEquals(deserialized.item.getTime(), time.item.getTime()); + } + + @Test(enabled = true) + public void testCopyJavaSqlTime() throws Exception { + final Holder time = new Holder(new java.sql.Time(System.currentTimeMillis())); + final Holder copy = _kryo.copy(time); + assertDeepEquals(copy, time); + assertEquals(copy.item.getTime(), time.item.getTime()); + } + + @Test(enabled = true) + public void testBitSet() throws Exception { + final BitSet bitSet = new BitSet(10); + bitSet.flip(2); + bitSet.flip(4); + final Holder holder = new Holder(bitSet); + @SuppressWarnings("unchecked") + final Holder deserialized = deserialize(serialize(holder), Holder.class); + assertDeepEquals(deserialized, holder); + } + + @Test(enabled = true) + public void testCopyBitSet() throws Exception { + final BitSet bitSet = new BitSet(10); + bitSet.flip(2); + bitSet.flip(4); + final BitSet copy = _kryo.copy(bitSet); + assertDeepEquals(copy, bitSet); + } + + @Test(enabled = true) + public void testURI() throws Exception { + final Holder uri = new Holder(new URI("http://www.google.com")); + @SuppressWarnings("unchecked") + final Holder deserialized = deserialize(serialize(uri), Holder.class); + assertDeepEquals(deserialized, uri); + } + + @Test(enabled = true) + public void testCopyURI() throws Exception { + final Holder uri = new Holder(new URI("http://www.google.com")); + final Holder copy = _kryo.copy(uri); + assertDeepEquals(copy, uri); + } + + @Test(enabled = true) + public void testUUID() throws Exception { + final Holder uuid = new Holder(UUID.randomUUID()); + @SuppressWarnings("unchecked") + final Holder deserialized = deserialize(serialize(uuid), Holder.class); + assertDeepEquals(deserialized, uuid); + } + + @Test(enabled = true) + public void testCopyUUID() throws Exception { + final Holder uuid = new Holder(UUID.randomUUID()); + final Holder copy = _kryo.copy(uuid); + assertDeepEquals(copy, uuid); + } + + @Test(enabled = true) + public void testRegex() throws Exception { + final Holder pattern = new Holder(Pattern.compile("regex")); + @SuppressWarnings("unchecked") + final Holder deserialized = deserialize(serialize(pattern), Holder.class); + assertDeepEquals(deserialized, pattern); + + final Holder patternWithFlags = new Holder( + Pattern.compile("\n", Pattern.MULTILINE | Pattern.CASE_INSENSITIVE)); + @SuppressWarnings("unchecked") + final Holder deserializedWithFlags = deserialize(serialize(patternWithFlags), Holder.class); + assertDeepEquals(deserializedWithFlags, patternWithFlags); + } + + @Test(enabled = true) + public void testCopyRegex() throws Exception { + final Holder pattern = new Holder(Pattern.compile("regex")); + final Holder copy = _kryo.copy(pattern); + assertDeepEquals(copy, pattern); + + final Holder patternWithFlags = new Holder( + Pattern.compile("\n", Pattern.MULTILINE | Pattern.CASE_INSENSITIVE)); + final Holder copyWithFlags = _kryo.copy(patternWithFlags); + assertDeepEquals(copyWithFlags, patternWithFlags); + } + + @Test(enabled = true) + public void testStringBuffer() throws Exception { + final StringBuffer stringBuffer = new StringBuffer( + "with some content \n& some lines..."); + final StringBuffer deserialized = deserialize(serialize(stringBuffer), StringBuffer.class); + assertDeepEquals(deserialized, stringBuffer); + } + + @Test(enabled = true) + public void testStringBuilder() throws Exception { + final StringBuilder stringBuilder = new StringBuilder( + "with some content \n& some lines..."); + final StringBuilder deserialized = deserialize(serialize(stringBuilder), StringBuilder.class); + assertDeepEquals(deserialized, stringBuilder); + } + + @Test(enabled = true) + public void testMapWithIntConstructorOnly() throws Exception { + final HashMapWithIntConstructorOnly map = new HashMapWithIntConstructorOnly(5); + final HashMapWithIntConstructorOnly deserialized = deserialize(serialize(map), + HashMapWithIntConstructorOnly.class); + assertDeepEquals(deserialized, map); + + } + + @Test(enabled = true) + public void testCurrency() throws Exception { + final Currency currency = Currency.getInstance("EUR"); + final Currency deserialized = deserialize(serialize(currency), Currency.class); + assertDeepEquals(deserialized, currency); + + // Check that the transient field defaultFractionDigits is initialized correctly + Assert.assertEquals(deserialized.getCurrencyCode(), currency.getCurrencyCode()); + Assert.assertEquals(deserialized.getDefaultFractionDigits(), currency.getDefaultFractionDigits()); + } + + @DataProvider + public Object[][] unmodifiableCollections() { + final HashMap m = new HashMap(); + m.put("foo", "bar"); + return new Object[][]{{Collections.unmodifiableList(new ArrayList(Arrays.asList("foo", "bar")))}, + {Collections.unmodifiableSet(new HashSet(Arrays.asList("foo", "bar")))}, + {Collections.unmodifiableMap(m)},}; + } + + @SuppressWarnings("unchecked") + @Test(enabled = true, dataProvider = "unmodifiableCollections") + public void testUnmodifiableCollections(final Object collection) throws Exception { + final Holder holder = new Holder(collection); + final Holder deserialized = deserialize(serialize(holder), Holder.class); + assertDeepEquals(deserialized, holder); + } + + @Test(enabled = true, dataProvider = "unmodifiableCollections") + public void testCopyUnmodifiableCollections(final Object collection) throws Exception { + final Holder unmodifiableCollection = new Holder(collection); + final Holder copy = _kryo.copy(unmodifiableCollection); + assertDeepEquals(copy, unmodifiableCollection); + } + + @DataProvider + public Object[][] synchronizedCollections() { + final HashMap m = new HashMap(); + m.put("foo", "bar"); + return new Object[][]{{Collections.synchronizedList(new ArrayList(Arrays.asList("foo", "bar")))}, + {Collections.synchronizedSet(new HashSet(Arrays.asList("foo", "bar")))}, + {Collections.synchronizedMap(m)},}; + } + + @SuppressWarnings("unchecked") + @Test(enabled = true, dataProvider = "synchronizedCollections") + public void testSynchronizedCollections(final Object collection) throws Exception { + final Holder holder = new Holder(collection); + final Holder deserialized = deserialize(serialize(holder), Holder.class); + assertDeepEquals(deserialized, holder); + } + + @Test(enabled = true, dataProvider = "synchronizedCollections") + public void testCopySynchronizedCollections(final Object collection) throws Exception { + final Holder synchronizedCollection = new Holder(collection); + final Holder copy = _kryo.copy(synchronizedCollection); + assertDeepEquals(copy, synchronizedCollection); + } + + @SuppressWarnings("unchecked") + @Test(enabled = true) + public void testJavaUtilCollectionsEmptyList() throws Exception { + final Holder> emptyList = new Holder>(Collections. emptyList()); + final Holder> deserialized = deserialize(serialize(emptyList), Holder.class); + assertDeepEquals(deserialized, emptyList); + } + + @Test(enabled = true) + public void testCopyJavaUtilCollectionsEmptyList() throws Exception { + final Holder> emptyList = new Holder>(Collections. emptyList()); + final Holder> copy = _kryo.copy(emptyList); + assertDeepEquals(copy, emptyList); + } + + @SuppressWarnings("unchecked") + @Test(enabled = true) + public void testJavaUtilCollectionsEmptySet() throws Exception { + final Holder> emptyList = new Holder>(Collections. emptySet()); + final Holder> deserialized = deserialize(serialize(emptyList), Holder.class); + assertDeepEquals(deserialized, emptyList); + } + + @Test(enabled = true) + public void testCopyJavaUtilCollectionsEmptySet() throws Exception { + final Holder> emptyList = new Holder>(Collections. emptySet()); + final Holder> copy = _kryo.copy(emptyList); + assertDeepEquals(copy, emptyList); + } + + @SuppressWarnings("unchecked") + @Test(enabled = true) + public void testJavaUtilCollectionsEmptyMap() throws Exception { + final Holder> emptyMap = new Holder>( + Collections. emptyMap()); + final Holder> deserialized = deserialize(serialize(emptyMap), Holder.class); + assertDeepEquals(deserialized, emptyMap); + } + + @Test(enabled = true) + public void testCopyJavaUtilCollectionsEmptyMap() throws Exception { + final Holder> emptyMap = new Holder>( + Collections. emptyMap()); + final Holder> copy = _kryo.copy(emptyMap); + assertDeepEquals(copy, emptyMap); + } + + @SuppressWarnings("unchecked") + @Test(enabled = true) + public void testJavaUtilArraysAsListEmpty() throws Exception { + final Holder> asListHolder = new Holder>(Arrays. asList()); + final Holder> deserialized = deserialize(serialize(asListHolder), Holder.class); + assertDeepEquals(deserialized, asListHolder); + } + + @SuppressWarnings("unchecked") + @Test(enabled = true) + public void testJavaUtilArraysAsListPrimitiveArrayElement() throws Exception { + final int[] values = {1, 2}; + @SuppressWarnings("rawtypes") + final Holder> asListHolder = new Holder(Arrays.asList(values)); + final Holder> deserialized = deserialize(serialize(asListHolder), Holder.class); + assertDeepEquals(deserialized, asListHolder); + } + + @SuppressWarnings("unchecked") + @Test(enabled = true) + public void testJavaUtilArraysAsListBoxedPrimitives() throws Exception { + final Integer[] values = {1, 2}; + final List list = Arrays.asList(values); + @SuppressWarnings("rawtypes") + final Holder> asListHolder = new Holder(list); + final Holder> deserialized = deserialize(serialize(asListHolder), Holder.class); + assertDeepEquals(deserialized, asListHolder); + } + + @SuppressWarnings("unchecked") + @Test(enabled = true) + public void testJavaUtilArraysAsListString() throws Exception { + final Holder> asListHolder = new Holder>(Arrays. asList("foo", "bar")); + final Holder> deserialized = deserialize(serialize(asListHolder), Holder.class); + assertDeepEquals(deserialized, asListHolder); + } + + @SuppressWarnings("unchecked") + @Test(enabled = true) + public void testJavaUtilArraysAsListEmail() throws Exception { + final Holder> asListHolder = new Holder>( + Arrays.asList(new Email("foo", "foo@example.org"))); + final Holder> deserialized = deserialize(serialize(asListHolder), Holder.class); + assertDeepEquals(deserialized, asListHolder); + } + + @Test(enabled = true) + public void testCopyJavaUtilArraysAsList() throws Exception { + final List list = Arrays. asList("foo", "bar"); + final List copy = _kryo.copy(list); + assertDeepEquals(copy, list); + } + + @Test(enabled = true) + public void testJdkProxy() throws Exception { + final Holder bean = new Holder(TestClasses.createProxy()); + @SuppressWarnings("unchecked") + final Holder deserialized = deserialize(serialize(bean), Holder.class); + assertDeepEquals(deserialized, bean); + } + + @Test(enabled = true) + public void testCopyJdkProxy() throws Exception { + final Holder bean = new Holder(TestClasses.createProxy()); + final Holder copy = _kryo.copy(bean); + assertDeepEquals(copy, bean); + } + + @Test(enabled = true) + public void testClassSerializer() throws Exception { + final Holder> clazz = new Holder>(String.class); + @SuppressWarnings("unchecked") + final Holder> deserialized = deserialize(serialize(clazz), Holder.class); + assertDeepEquals(deserialized, clazz); + } + + @Test(enabled = true) + public void testInnerClass() throws Exception { + // seems to be related to #15 + final Container container = TestClasses.createContainer(); + final Container deserialized = deserialize(serialize(container), Container.class); + assertDeepEquals(deserialized, container); + } + + @Test(enabled = true) + public void testSharedObjectIdentity_CounterHolder() throws Exception { + + final AtomicInteger sharedObject = new AtomicInteger(42); + final CounterHolder holder1 = new CounterHolder(sharedObject); + final CounterHolder holder2 = new CounterHolder(sharedObject); + final CounterHolderArray holderHolder = new CounterHolderArray(holder1, holder2); + + final CounterHolderArray deserialized = deserialize(serialize(holderHolder), CounterHolderArray.class); + assertDeepEquals(deserialized, holderHolder); + Assert.assertTrue(deserialized.holders[0].item == deserialized.holders[1].item); + + } + + @DataProvider(name = "sharedObjectIdentityProvider") + protected Object[][] createSharedObjectIdentityProviderData() { + return new Object[][]{{AtomicInteger.class.getSimpleName(), new AtomicInteger(42)}, + {Email.class.getSimpleName(), new Email("foo bar", "foo.bar@example.com")}}; + } + + @SuppressWarnings("unchecked") + @Test(enabled = true, dataProvider = "sharedObjectIdentityProvider") + public void testSharedObjectIdentityWithArray(final String name, final T sharedObject) throws Exception { + final Holder holder1 = new Holder(sharedObject); + final Holder holder2 = new Holder(sharedObject); + final HolderArray holderHolder = new HolderArray(holder1, holder2); + + final HolderArray deserialized = deserialize(serialize(holderHolder), HolderArray.class); + assertDeepEquals(deserialized, holderHolder); + Assert.assertTrue(deserialized.holders[0].item == deserialized.holders[1].item); + } + + @SuppressWarnings("unchecked") + @Test(enabled = true, dataProvider = "sharedObjectIdentityProvider") + public void testSharedObjectIdentity(final String name, final T sharedObject) throws Exception { + final Holder holder1 = new Holder(sharedObject); + final Holder holder2 = new Holder(sharedObject); + final HolderList holderHolder = new HolderList(new ArrayList>(Arrays.asList(holder1, holder2))); + + final HolderList deserialized = deserialize(serialize(holderHolder), HolderList.class); + assertDeepEquals(deserialized, holderHolder); + Assert.assertTrue(deserialized.holders.get(0).item == deserialized.holders.get(1).item); + } + + @DataProvider(name = "typesAsSessionAttributesProvider") + protected Object[][] createTypesAsSessionAttributesData() { + return new Object[][]{{Boolean.class, Boolean.TRUE}, {String.class, "42"}, + {StringBuilder.class, new StringBuilder("42")}, {StringBuffer.class, new StringBuffer("42")}, + {Class.class, String.class}, {Long.class, new Long(42)}, {Integer.class, new Integer(42)}, + {Character.class, new Character('c')}, {Byte.class, new Byte("b".getBytes()[0])}, + {Double.class, new Double(42d)}, {Float.class, new Float(42f)}, + {Short.class, new Short((short) 42)}, {BigDecimal.class, new BigDecimal(42)}, + {AtomicInteger.class, new AtomicInteger(42)}, {AtomicLong.class, new AtomicLong(42)}, + {MutableInt.class, new MutableInt(42)}, {Integer[].class, new Integer[]{42}}, + {Date.class, new Date(System.currentTimeMillis() - 10000)}, + {Calendar.class, Calendar.getInstance()}, {Currency.class, Currency.getInstance("EUR")}, + {ArrayList.class, new ArrayList(Arrays.asList("foo"))}, {int[].class, new int[]{1, 2}}, + {long[].class, new long[]{1, 2}}, {short[].class, new short[]{1, 2}}, + {float[].class, new float[]{1, 2}}, {double[].class, new double[]{1, 2}}, + {int[].class, new int[]{1, 2}}, {byte[].class, "42".getBytes()}, + {char[].class, "42".toCharArray()}, {String[].class, new String[]{"23", "42"}}, + {Person[].class, new Person[]{createPerson("foo bar", Gender.MALE, 42)}}}; + } + + @Test(enabled = true, dataProvider = "typesAsSessionAttributesProvider") + public void testTypesAsSessionAttributes(final Class type, final T instance) throws Exception { + @SuppressWarnings("unchecked") + final T deserialized = (T) deserialize(serialize(instance), instance.getClass()); + assertDeepEquals(deserialized, instance); + } + + @Test(enabled = true) + public void testTypesInContainerClass() throws Exception { + final MyContainer myContainer = new MyContainer(); + final MyContainer deserialized = deserialize(serialize(myContainer), MyContainer.class); + assertDeepEquals(deserialized, myContainer); + } + + @Test(enabled = true) + public void testClassWithoutDefaultConstructor() throws Exception { + final ClassWithoutDefaultConstructor obj = TestClasses.createClassWithoutDefaultConstructor("foo"); + final ClassWithoutDefaultConstructor deserialized = deserialize(serialize(obj), + ClassWithoutDefaultConstructor.class); + assertDeepEquals(deserialized, obj); + } + + @Test(enabled = true) + public void testPrivateClass() throws Exception { + final Holder holder = new Holder(TestClasses.createPrivateClass("foo")); + final Holder deserialized = deserialize(serialize(holder), Holder.class); + assertDeepEquals(deserialized, holder); + } + + @Test(enabled = true) + public void testCollections() throws Exception { + final EntityWithCollections obj = new EntityWithCollections(); + final EntityWithCollections deserialized = deserialize(serialize(obj), EntityWithCollections.class); + assertDeepEquals(deserialized, obj); + } + + @Test(enabled = true) + public void testCyclicDependencies() throws Exception { + final Person p1 = createPerson("foo bar", Gender.MALE, 42, "foo.bar@example.org", "foo.bar@example.com"); + final Person p2 = createPerson("bar baz", Gender.FEMALE, 42, "bar.baz@example.org", "bar.baz@example.com"); + p1.addFriend(p2); + p2.addFriend(p1); + + final Person deserialized = deserialize(serialize(p1), Person.class); + assertDeepEquals(deserialized, p1); + } + + protected byte[] serialize(final Object o) { + return serialize(_kryo, o); + } + + protected T deserialize(final byte[] in, final Class clazz) { + return deserialize(_kryo, in, clazz); + } + + public static class EntityWithCollections { + private final String[] _bars; + private final List _foos; + private final Map _bazens; + + public EntityWithCollections() { + _bars = new String[]{"foo", "bar"}; + _foos = new ArrayList(Arrays.asList("foo", "bar")); + _bazens = new HashMap(); + _bazens.put("foo", 1); + _bazens.put("bar", 2); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + Arrays.hashCode(_bars); + result = prime * result + ((_bazens == null) ? 0 : _bazens.hashCode()); + result = prime * result + ((_foos == null) ? 0 : _foos.hashCode()); + return result; + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final EntityWithCollections other = (EntityWithCollections) obj; + if (!Arrays.equals(_bars, other._bars)) { + return false; + } + if (_bazens == null) { + if (other._bazens != null) { + return false; + } + } else if (!_bazens.equals(other._bazens)) { + return false; + } + if (_foos == null) { + if (other._foos != null) { + return false; + } + } else if (!_foos.equals(other._foos)) { + return false; + } + return true; + } + } } diff --git a/src/test/java/de/javakaffee/kryoserializers/SubListSerializersTest.java b/src/test/java/de/javakaffee/kryoserializers/SubListSerializersTest.java index 2dd9be07..5957b6ef 100644 --- a/src/test/java/de/javakaffee/kryoserializers/SubListSerializersTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/SubListSerializersTest.java @@ -37,147 +37,149 @@ * @author Martin Grotzke */ public class SubListSerializersTest { - - private Kryo _kryo; - - @BeforeClass - public void beforeClass() { - _kryo = new KryoReflectionFactorySupport() { - - @Override - @SuppressWarnings("rawtypes") - public Serializer getDefaultSerializer(final Class type) { - final Serializer> subListSerializer = SubListSerializers.createFor(type); - if ( subListSerializer != null ) { - return subListSerializer; - } - return super.getDefaultSerializer(type); - } - - }; - } - - private void doTest(final List subList) { - final byte[] serialized = serialize( _kryo, subList ); - @SuppressWarnings( "unchecked" ) - final List deserialized = deserialize( _kryo, serialized, subList.getClass() ); - - assertEquals( deserialized, subList ); - assertEquals( deserialized.remove( 0 ), subList.remove( 0 ) ); - } - - private void doTestCopy(final List subList) { - final List copy = _kryo.copy( subList ); - - assertEquals( copy, subList ); - assertEquals( copy.remove( 0 ), subList.remove( 0 ) ); - } - - @Test( enabled = true ) - public void testSubList () throws Exception { - final List subList = new LinkedList( Arrays.asList( TestEnum.values() ) ).subList( 1, 2 ); - doTest(subList); - } - - @Test( enabled = true ) - public void testCopySubList () throws Exception { - final List subList = new LinkedList( Arrays.asList( TestEnum.values() ) ).subList( 1, 2 ); - doTestCopy(subList); - } - - @Test( enabled = true ) - public void testSubListSubList () throws Exception { - final List subList = new LinkedList( Arrays.asList( TestEnum.values() ) ).subList( 1, 3 ).subList(1, 2); - doTest(subList); - } - - @Test( enabled = true ) - public void testCopySubListSubList () throws Exception { - final List subList = new LinkedList( Arrays.asList( TestEnum.values() ) ).subList( 1, 3 ).subList(1, 2); - doTestCopy(subList); - } - - @Test( enabled = true ) - public void testArrayListSubList () throws Exception { - final List subList = new ArrayList( Arrays.asList( TestEnum.values() ) ).subList( 1, 2 ); - doTest(subList); - } - - @Test( enabled = true ) - public void testCopyArrayListSubList () throws Exception { - final List subList = new ArrayList( Arrays.asList( TestEnum.values() ) ).subList( 1, 2 ); - doTestCopy(subList); - } - - @Test( enabled = true ) - public void testArrayListSubListSubList () throws Exception { - final List subList = new ArrayList( Arrays.asList( TestEnum.values() ) ).subList( 1, 3 ).subList(1, 2); - doTest(subList); - } - - @Test( enabled = true ) - public void testCopyArrayListSubListSubList () throws Exception { - final List subList = new ArrayList( Arrays.asList( TestEnum.values() ) ).subList( 1, 3 ).subList(1, 2); - doTestCopy(subList); - } - - @Test( enabled = true ) - public void testArrayListSubListWithSharedItems () throws Exception { - final List mylist = arrayList("1", "1", "2", "1", "1"); - final List subList = mylist.subList(0, 5); - - final byte[] serialized = serialize( _kryo, subList ); - @SuppressWarnings( "unchecked" ) - final List deserialized = deserialize( _kryo, serialized, subList.getClass() ); - - assertEquals( deserialized, subList ); - assertEquals( deserialized, mylist ); - } - - @Test( enabled = true ) - @SuppressWarnings( "unchecked" ) - public void testNestedArrayListSubListWithSharedItems_1() throws Exception { - final List l1 = arrayList("1", "1", "2"); - final List l1s1 = l1.subList(0, 3); - - final List l1s2 = l1.subList(1, 3); - - final List l2 = arrayList("1", "2", "3"); - final List l2s1 = l2.subList(0, 3); - - final List> lists = new ArrayList>(Arrays.asList(l1s1, l1s2, l2s1, l1, l2)); - - final byte[] serialized = serialize( _kryo, lists ); - final List> deserialized = deserialize( _kryo, serialized, lists.getClass() ); - - assertEquals( deserialized, lists ); - } - - @Test( enabled = true ) - @SuppressWarnings( "unchecked" ) - public void testNestedArrayListSubListWithSharedItems_2() throws Exception { - final List l1 = arrayList("1", "1", "2"); - final List l1s1 = l1.subList(0, 3); - - final List l1s2 = l1.subList(1, 3); - - final List l2 = arrayList("1", "2", "3"); - final List l2s1 = l2.subList(0, 3); - - final List> lists = new ArrayList>(Arrays.asList(l1, l2, l1s1, l1s2, l2s1)); - - final byte[] serialized = serialize( _kryo, lists ); - final List> deserialized = deserialize( _kryo, serialized, lists.getClass() ); - - assertEquals( deserialized, lists ); - } - - static enum TestEnum { - ITEM1, ITEM2, ITEM3; - } - - private static ArrayList arrayList(final T ... items) { - return new ArrayList(Arrays.asList(items)); - } - -} \ No newline at end of file + + private Kryo _kryo; + + @BeforeClass + public void beforeClass() { + _kryo = new KryoReflectionFactorySupport() { + + @Override + @SuppressWarnings("rawtypes") + public Serializer getDefaultSerializer(final Class type) { + final Serializer> subListSerializer = SubListSerializers.createFor(type); + if (subListSerializer != null) { + return subListSerializer; + } + return super.getDefaultSerializer(type); + } + + }; + } + + private void doTest(final List subList) { + final byte[] serialized = serialize(_kryo, subList); + @SuppressWarnings("unchecked") + final List deserialized = deserialize(_kryo, serialized, subList.getClass()); + + assertEquals(deserialized, subList); + assertEquals(deserialized.remove(0), subList.remove(0)); + } + + private void doTestCopy(final List subList) { + final List copy = _kryo.copy(subList); + + assertEquals(copy, subList); + assertEquals(copy.remove(0), subList.remove(0)); + } + + @Test(enabled = true) + public void testSubList() throws Exception { + final List subList = new LinkedList(Arrays.asList(TestEnum.values())).subList(1, 2); + doTest(subList); + } + + @Test(enabled = true) + public void testCopySubList() throws Exception { + final List subList = new LinkedList(Arrays.asList(TestEnum.values())).subList(1, 2); + doTestCopy(subList); + } + + @Test(enabled = true) + public void testSubListSubList() throws Exception { + final List subList = new LinkedList(Arrays.asList(TestEnum.values())).subList(1, 3).subList(1, 2); + doTest(subList); + } + + @Test(enabled = true) + public void testCopySubListSubList() throws Exception { + final List subList = new LinkedList(Arrays.asList(TestEnum.values())).subList(1, 3).subList(1, 2); + doTestCopy(subList); + } + + @Test(enabled = true) + public void testArrayListSubList() throws Exception { + final List subList = new ArrayList(Arrays.asList(TestEnum.values())).subList(1, 2); + doTest(subList); + } + + @Test(enabled = true) + public void testCopyArrayListSubList() throws Exception { + final List subList = new ArrayList(Arrays.asList(TestEnum.values())).subList(1, 2); + doTestCopy(subList); + } + + @Test(enabled = true) + public void testArrayListSubListSubList() throws Exception { + final List subList = new ArrayList(Arrays.asList(TestEnum.values())).subList(1, 3).subList(1, 2); + doTest(subList); + } + + @Test(enabled = true) + public void testCopyArrayListSubListSubList() throws Exception { + final List subList = new ArrayList(Arrays.asList(TestEnum.values())).subList(1, 3).subList(1, 2); + doTestCopy(subList); + } + + @Test(enabled = true) + public void testArrayListSubListWithSharedItems() throws Exception { + final List mylist = arrayList("1", "1", "2", "1", "1"); + final List subList = mylist.subList(0, 5); + + final byte[] serialized = serialize(_kryo, subList); + @SuppressWarnings("unchecked") + final List deserialized = deserialize(_kryo, serialized, subList.getClass()); + + assertEquals(deserialized, subList); + assertEquals(deserialized, mylist); + } + + @Test(enabled = true) + @SuppressWarnings("unchecked") + public void testNestedArrayListSubListWithSharedItems_1() throws Exception { + final List l1 = arrayList("1", "1", "2"); + final List l1s1 = l1.subList(0, 3); + + final List l1s2 = l1.subList(1, 3); + + final List l2 = arrayList("1", "2", "3"); + final List l2s1 = l2.subList(0, 3); + + final List> lists = new ArrayList>(Arrays.asList(l1s1, l1s2, l2s1, l1, l2)); + + final byte[] serialized = serialize(_kryo, lists); + final List> deserialized = deserialize(_kryo, serialized, lists.getClass()); + + assertEquals(deserialized, lists); + } + + @Test(enabled = true) + @SuppressWarnings("unchecked") + public void testNestedArrayListSubListWithSharedItems_2() throws Exception { + final List l1 = arrayList("1", "1", "2"); + final List l1s1 = l1.subList(0, 3); + + final List l1s2 = l1.subList(1, 3); + + final List l2 = arrayList("1", "2", "3"); + final List l2s1 = l2.subList(0, 3); + + final List> lists = new ArrayList>(Arrays.asList(l1, l2, l1s1, l1s2, l2s1)); + + final byte[] serialized = serialize(_kryo, lists); + final List> deserialized = deserialize(_kryo, serialized, lists.getClass()); + + assertEquals(deserialized, lists); + } + + static enum TestEnum { + ITEM1, + ITEM2, + ITEM3; + } + + private static ArrayList arrayList(final T... items) { + return new ArrayList(Arrays.asList(items)); + } + +} diff --git a/src/test/java/de/javakaffee/kryoserializers/TestClasses.java b/src/test/java/de/javakaffee/kryoserializers/TestClasses.java index 136450a9..0835dc99 100644 --- a/src/test/java/de/javakaffee/kryoserializers/TestClasses.java +++ b/src/test/java/de/javakaffee/kryoserializers/TestClasses.java @@ -16,8 +16,6 @@ */ package de.javakaffee.kryoserializers; -import org.apache.commons.lang3.mutable.MutableInt; - import java.io.Serializable; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; @@ -37,8 +35,9 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; -import de.javakaffee.kryoserializers.TestClasses.Person.Gender; +import org.apache.commons.lang3.mutable.MutableInt; +import de.javakaffee.kryoserializers.TestClasses.Person.Gender; /** * Test for {@link JavolutionTranscoder} @@ -47,818 +46,813 @@ */ public class TestClasses { - static Person createPerson( final String name, final Gender gender, final String... emailAddresses ) { - final Person person = new Person(); - person.setName( name ); - person.setGender( gender ); - if ( emailAddresses != null ) { - final HashMap props = new HashMap(); - for ( int i = 0; i < emailAddresses.length; i++ ) { - final String emailAddress = emailAddresses[i]; - props.put( "email" + i, new Email( name, emailAddress ) ); - } - person.setProps( props ); - } - return person; - } - - static Person createPerson( final String name, final Gender gender, final Integer age, final String... emailAddresses ) { - final Person person = new Person(); - person.setName( name ); - person.setGender( gender ); - person.setAge( age ); - final HashMap props = new HashMap(); - for ( int i = 0; i < emailAddresses.length; i++ ) { - final String emailAddress = emailAddresses[i]; - props.put( "email" + i, new Email( name, emailAddress ) ); - } - person.setProps( props ); - return person; - } - - static ClassWithoutDefaultConstructor createClassWithoutDefaultConstructor( final String string ) { - return new ClassWithoutDefaultConstructor( string ); - } - - static PrivateClass createPrivateClass( final String string ) { - final PrivateClass result = new PrivateClass(); - result.foo = string; - return result; - } - - static Container createContainer() { - return new Container(); - } - - static SomeInterface createProxy() { - return (SomeInterface) Proxy.newProxyInstance( Thread.currentThread().getContextClassLoader(), - new Class[] { SomeInterface.class, Serializable.class }, - new MyInvocationHandler( SomeInterfaceImpl.class ) ); - } - - static class MyInvocationHandler implements InvocationHandler { - - private final Class _targetClazz; - private transient Object _target; - - public MyInvocationHandler( final Class targetClazz ) { - _targetClazz = targetClazz; - } - - public Object invoke( final Object proxy, final Method method, final Object[] args ) throws Throwable { - if ( _target == null ) { - _target = _targetClazz.newInstance(); - } - return method.invoke( _target, args ); - } - } - - static interface SomeInterface { - String hello(); - } - - static class SomeInterfaceImpl implements SomeInterface { - - /** - * {@inheritDoc} - */ - public String hello() { - return "hi"; - } - - } - - public static class Container { - - @SuppressWarnings( "unused" ) - private final Body _body; - - public Container() { - _body = new Body(); - } - - class Body { - } - - } - - public static class Person implements Serializable { - - private static final long serialVersionUID = 1L; - - static enum Gender { - MALE, - FEMALE - } - - private String _name; - private Gender _gender; - private Integer _age; - private Map _props; - private final Collection _friends = new ArrayList(); - - public String getName() { - return _name; - } - - public void addFriend( final Person p ) { - _friends.add( p ); - } - - public void setName( final String name ) { - _name = name; - } - - public Map getProps() { - return _props; - } - - public void setProps( final Map props ) { - _props = props; - } - - public Gender getGender() { - return _gender; - } - - public void setGender( final Gender gender ) { - _gender = gender; - } - - public Integer getAge() { - return _age; - } - - public void setAge( final Integer age ) { - _age = age; - } - - public Collection getFriends() { - return _friends; - } - - /** - * @param friends - * @param friends2 - * @return - */ - private boolean flatEquals( final Collection c1, final Collection c2 ) { - return c1 == c2 || c1 != null && c2 != null && c1.size() == c2.size(); - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ( ( _age == null ) - ? 0 - : _age.hashCode() ); - result = prime * result + ( ( _friends == null ) - ? 0 - : _friends.size() ); - result = prime * result + ( ( _gender == null ) - ? 0 - : _gender.hashCode() ); - result = prime * result + ( ( _name == null ) - ? 0 - : _name.hashCode() ); - result = prime * result + ( ( _props == null ) - ? 0 - : _props.hashCode() ); - return result; - } - - @Override - public boolean equals( final Object obj ) { - if ( this == obj ) { - return true; - } - if ( obj == null ) { - return false; - } - if ( getClass() != obj.getClass() ) { - return false; - } - final Person other = (Person) obj; - if ( _age == null ) { - if ( other._age != null ) { - return false; - } - } else if ( !_age.equals( other._age ) ) { - return false; - } - if ( _friends == null ) { - if ( other._friends != null ) { - return false; - } - } else if ( !flatEquals( _friends, other._friends ) ) { - return false; - } - if ( _gender == null ) { - if ( other._gender != null ) { - return false; - } - } else if ( !_gender.equals( other._gender ) ) { - return false; - } - if ( _name == null ) { - if ( other._name != null ) { - return false; - } - } else if ( !_name.equals( other._name ) ) { - return false; - } - if ( _props == null ) { - if ( other._props != null ) { - return false; - } - } else if ( !_props.equals( other._props ) ) { - return false; - } - return true; - } - - @Override - public String toString() { - return "Person [_age=" + _age + ", _friends.size=" + _friends.size() + ", _gender=" + _gender + ", _name=" + _name - + ", _props=" + _props + "]"; - } - - } - - public static class Email implements Serializable { - - private static final long serialVersionUID = 1L; - - private String _name; - private String _email; - - public Email() { - } - - public Email( final String name, final String email ) { - super(); - _name = name; - _email = email; - } - - public String getName() { - return _name; - } - - public void setName( final String name ) { - _name = name; - } - - public String getEmail() { - return _email; - } - - public void setEmail( final String email ) { - _email = email; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ( ( _email == null ) - ? 0 - : _email.hashCode() ); - result = prime * result + ( ( _name == null ) - ? 0 - : _name.hashCode() ); - return result; - } - - @Override - public boolean equals( final Object obj ) { - if ( this == obj ) { - return true; - } - if ( obj == null ) { - return false; - } - if ( getClass() != obj.getClass() ) { - return false; - } - final Email other = (Email) obj; - if ( _email == null ) { - if ( other._email != null ) { - return false; - } - } else if ( !_email.equals( other._email ) ) { - return false; - } - if ( _name == null ) { - if ( other._name != null ) { - return false; - } - } else if ( !_name.equals( other._name ) ) { - return false; - } - return true; - } - - @Override - public String toString() { - return "Email [_email=" + _email + ", _name=" + _name + "]"; - } - - } - - public static class PublicClass { - PrivateClass privateClass; - - public PublicClass() { - } - - public PublicClass( final PrivateClass protectedClass ) { - this.privateClass = protectedClass; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ( ( privateClass == null ) - ? 0 - : privateClass.hashCode() ); - return result; - } - - @Override - public boolean equals( final Object obj ) { - if ( this == obj ) { - return true; - } - if ( obj == null ) { - return false; - } - if ( getClass() != obj.getClass() ) { - return false; - } - final PublicClass other = (PublicClass) obj; - if ( privateClass == null ) { - if ( other.privateClass != null ) { - return false; - } - } else if ( !privateClass.equals( other.privateClass ) ) { - return false; - } - return true; - } - } - - private static class PrivateClass { - String foo; - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ( ( foo == null ) - ? 0 - : foo.hashCode() ); - return result; - } - - @Override - public boolean equals( final Object obj ) { - if ( this == obj ) { - return true; - } - if ( obj == null ) { - return false; - } - if ( getClass() != obj.getClass() ) { - return false; - } - final PrivateClass other = (PrivateClass) obj; - if ( foo == null ) { - if ( other.foo != null ) { - return false; - } - } else if ( !foo.equals( other.foo ) ) { - return false; - } - return true; - } - } - - public static class ClassWithoutDefaultConstructor { - final String value; - - public ClassWithoutDefaultConstructor( final String value ) { - this.value = value; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ( ( value == null ) - ? 0 - : value.hashCode() ); - return result; - } - - @Override - public boolean equals( final Object obj ) { - if ( this == obj ) { - return true; - } - if ( obj == null ) { - return false; - } - if ( getClass() != obj.getClass() ) { - return false; - } - final ClassWithoutDefaultConstructor other = (ClassWithoutDefaultConstructor) obj; - if ( value == null ) { - if ( other.value != null ) { - return false; - } - } else if ( !value.equals( other.value ) ) { - return false; - } - return true; - } - - @Override - public String toString() { - return "ClassWithoutDefaultConstructor [value=" + value + "]"; - } - } - - @SuppressWarnings( "unused" ) - public static class MyContainer { - - private int _int; - private long _long; - private final boolean _boolean; - private final Boolean _Boolean; - private final Class _Class; - private String _String; - private final StringBuilder _StringBuilder; - private final StringBuffer _StringBuffer; - private Long _Long; - private Integer _Integer; - private Character _Character; - private Byte _Byte; - private Double _Double; - private Float _Float; - private Short _Short; - private BigDecimal _BigDecimal; - private AtomicInteger _AtomicInteger; - private AtomicLong _AtomicLong; - private MutableInt _MutableInt; - private Integer[] _IntegerArray; - private Date _Date; - private Calendar _Calendar; - private final Currency _Currency; - private List _ArrayList; - private final Set _HashSet; - private final Map _HashMap; - private int[] _intArray; - private long[] _longArray; - private short[] _shortArray; - private float[] _floatArray; - private double[] _doubleArray; - private byte[] _byteArray; - private char[] _charArray; - private String[] _StringArray; - private Person[] _PersonArray; - - public MyContainer() { - - _int = 1; - _long = 2; - _boolean = true; - _Boolean = Boolean.TRUE; - _Class = String.class; - _String = "3"; - _StringBuffer = new StringBuffer( "foo" ); - _StringBuilder = new StringBuilder( "foo" ); - _Long = new Long( 4 ); - _Integer = new Integer( 5 ); - _Character = new Character( 'c' ); - _Byte = new Byte( "b".getBytes()[0] ); - _Double = new Double( 6d ); - _Float = new Float( 7f ); - _Short = new Short( (short) 8 ); - _BigDecimal = new BigDecimal( 9 ); - _AtomicInteger = new AtomicInteger( 10 ); - _AtomicLong = new AtomicLong( 11 ); - _MutableInt = new MutableInt( 12 ); - _IntegerArray = new Integer[] { 13 }; - _Date = new Date( System.currentTimeMillis() - 10000 ); - _Calendar = Calendar.getInstance(); - _Currency = Currency.getInstance( "EUR" ); - _ArrayList = new ArrayList( Arrays.asList( "foo" ) ); - _HashSet = new HashSet(); - _HashSet.add( "14" ); - - _HashMap = new HashMap(); - _HashMap.put( "foo", 23 ); - _HashMap.put( "bar", 42 ); - - _intArray = new int[] { 1, 2 }; - _longArray = new long[] { 1, 2 }; - _shortArray = new short[] { 1, 2 }; - _floatArray = new float[] { 1, 2 }; - _doubleArray = new double[] { 1, 2 }; - _byteArray = "42".getBytes(); - _charArray = "42".toCharArray(); - _StringArray = new String[] { "23", "42" }; - _PersonArray = new Person[] { createPerson( "foo bar", Gender.MALE, 42 ) }; - - } - - public int getInt() { - return _int; - } - - public void setInt( final int i ) { - _int = i; - } - - public long getLong() { - return _long; - } - - public void setLong( final long l ) { - _long = l; - } - - public String getString() { - return _String; - } - - public void setString( final String string ) { - _String = string; - } - - public Long getLongWrapper() { - return _Long; - } - - public void setLongWrapper( final Long l ) { - _Long = l; - } - - public Integer getInteger() { - return _Integer; - } - - public void setInteger( final Integer integer ) { - _Integer = integer; - } - - public Character getCharacter() { - return _Character; - } - - public void setCharacter( final Character character ) { - _Character = character; - } - - public Byte getByte() { - return _Byte; - } - - public void setByte( final Byte b ) { - _Byte = b; - } - - public Double getDouble() { - return _Double; - } - - public void setDouble( final Double d ) { - _Double = d; - } - - public Float getFloat() { - return _Float; - } - - public void setFloat( final Float f ) { - _Float = f; - } - - public Short getShort() { - return _Short; - } - - public void setShort( final Short s ) { - _Short = s; - } - - public BigDecimal getBigDecimal() { - return _BigDecimal; - } + static Person createPerson(final String name, final Gender gender, final String... emailAddresses) { + final Person person = new Person(); + person.setName(name); + person.setGender(gender); + if (emailAddresses != null) { + final HashMap props = new HashMap(); + for (int i = 0; i < emailAddresses.length; i++) { + final String emailAddress = emailAddresses[i]; + props.put("email" + i, new Email(name, emailAddress)); + } + person.setProps(props); + } + return person; + } + + static Person createPerson(final String name, final Gender gender, final Integer age, final String... emailAddresses) { + final Person person = new Person(); + person.setName(name); + person.setGender(gender); + person.setAge(age); + final HashMap props = new HashMap(); + for (int i = 0; i < emailAddresses.length; i++) { + final String emailAddress = emailAddresses[i]; + props.put("email" + i, new Email(name, emailAddress)); + } + person.setProps(props); + return person; + } + + static ClassWithoutDefaultConstructor createClassWithoutDefaultConstructor(final String string) { + return new ClassWithoutDefaultConstructor(string); + } + + static PrivateClass createPrivateClass(final String string) { + final PrivateClass result = new PrivateClass(); + result.foo = string; + return result; + } + + static Container createContainer() { + return new Container(); + } + + static SomeInterface createProxy() { + return (SomeInterface) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), + new Class[]{SomeInterface.class, Serializable.class}, + new MyInvocationHandler(SomeInterfaceImpl.class)); + } + + static class MyInvocationHandler implements InvocationHandler { + + private final Class _targetClazz; + private transient Object _target; + + public MyInvocationHandler(final Class targetClazz) { + _targetClazz = targetClazz; + } + + public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable { + if (_target == null) { + _target = _targetClazz.newInstance(); + } + return method.invoke(_target, args); + } + } + + static interface SomeInterface { + String hello(); + } + + static class SomeInterfaceImpl implements SomeInterface { + + /** + * {@inheritDoc} + */ + public String hello() { + return "hi"; + } + + } + + public static class Container { + + @SuppressWarnings("unused") + private final Body _body; + + public Container() { + _body = new Body(); + } + + class Body {} + + } + + public static class Person implements Serializable { + + private static final long serialVersionUID = 1L; + + static enum Gender { + MALE, + FEMALE + } + + private String _name; + private Gender _gender; + private Integer _age; + private Map _props; + private final Collection _friends = new ArrayList(); + + public String getName() { + return _name; + } + + public void addFriend(final Person p) { + _friends.add(p); + } + + public void setName(final String name) { + _name = name; + } + + public Map getProps() { + return _props; + } + + public void setProps(final Map props) { + _props = props; + } + + public Gender getGender() { + return _gender; + } + + public void setGender(final Gender gender) { + _gender = gender; + } + + public Integer getAge() { + return _age; + } + + public void setAge(final Integer age) { + _age = age; + } + + public Collection getFriends() { + return _friends; + } + + /** + * @param friends + * @param friends2 + * @return + */ + private boolean flatEquals(final Collection c1, final Collection c2) { + return c1 == c2 || c1 != null && c2 != null && c1.size() == c2.size(); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((_age == null) + ? 0 + : _age.hashCode()); + result = prime * result + ((_friends == null) + ? 0 + : _friends.size()); + result = prime * result + ((_gender == null) + ? 0 + : _gender.hashCode()); + result = prime * result + ((_name == null) + ? 0 + : _name.hashCode()); + result = prime * result + ((_props == null) + ? 0 + : _props.hashCode()); + return result; + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final Person other = (Person) obj; + if (_age == null) { + if (other._age != null) { + return false; + } + } else if (!_age.equals(other._age)) { + return false; + } + if (_friends == null) { + if (other._friends != null) { + return false; + } + } else if (!flatEquals(_friends, other._friends)) { + return false; + } + if (_gender == null) { + if (other._gender != null) { + return false; + } + } else if (!_gender.equals(other._gender)) { + return false; + } + if (_name == null) { + if (other._name != null) { + return false; + } + } else if (!_name.equals(other._name)) { + return false; + } + if (_props == null) { + if (other._props != null) { + return false; + } + } else if (!_props.equals(other._props)) { + return false; + } + return true; + } + + @Override + public String toString() { + return "Person [_age=" + _age + ", _friends.size=" + _friends.size() + ", _gender=" + _gender + ", _name=" + _name + + ", _props=" + _props + "]"; + } + + } + + public static class Email implements Serializable { + + private static final long serialVersionUID = 1L; + + private String _name; + private String _email; + + public Email() {} + + public Email(final String name, final String email) { + super(); + _name = name; + _email = email; + } + + public String getName() { + return _name; + } + + public void setName(final String name) { + _name = name; + } + + public String getEmail() { + return _email; + } + + public void setEmail(final String email) { + _email = email; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((_email == null) + ? 0 + : _email.hashCode()); + result = prime * result + ((_name == null) + ? 0 + : _name.hashCode()); + return result; + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final Email other = (Email) obj; + if (_email == null) { + if (other._email != null) { + return false; + } + } else if (!_email.equals(other._email)) { + return false; + } + if (_name == null) { + if (other._name != null) { + return false; + } + } else if (!_name.equals(other._name)) { + return false; + } + return true; + } + + @Override + public String toString() { + return "Email [_email=" + _email + ", _name=" + _name + "]"; + } + + } + + public static class PublicClass { + PrivateClass privateClass; + + public PublicClass() {} + + public PublicClass(final PrivateClass protectedClass) { + this.privateClass = protectedClass; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((privateClass == null) + ? 0 + : privateClass.hashCode()); + return result; + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final PublicClass other = (PublicClass) obj; + if (privateClass == null) { + if (other.privateClass != null) { + return false; + } + } else if (!privateClass.equals(other.privateClass)) { + return false; + } + return true; + } + } + + private static class PrivateClass { + String foo; + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((foo == null) + ? 0 + : foo.hashCode()); + return result; + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final PrivateClass other = (PrivateClass) obj; + if (foo == null) { + if (other.foo != null) { + return false; + } + } else if (!foo.equals(other.foo)) { + return false; + } + return true; + } + } + + public static class ClassWithoutDefaultConstructor { + final String value; + + public ClassWithoutDefaultConstructor(final String value) { + this.value = value; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((value == null) + ? 0 + : value.hashCode()); + return result; + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final ClassWithoutDefaultConstructor other = (ClassWithoutDefaultConstructor) obj; + if (value == null) { + if (other.value != null) { + return false; + } + } else if (!value.equals(other.value)) { + return false; + } + return true; + } + + @Override + public String toString() { + return "ClassWithoutDefaultConstructor [value=" + value + "]"; + } + } + + @SuppressWarnings("unused") + public static class MyContainer { + + private int _int; + private long _long; + private final boolean _boolean; + private final Boolean _Boolean; + private final Class _Class; + private String _String; + private final StringBuilder _StringBuilder; + private final StringBuffer _StringBuffer; + private Long _Long; + private Integer _Integer; + private Character _Character; + private Byte _Byte; + private Double _Double; + private Float _Float; + private Short _Short; + private BigDecimal _BigDecimal; + private AtomicInteger _AtomicInteger; + private AtomicLong _AtomicLong; + private MutableInt _MutableInt; + private Integer[] _IntegerArray; + private Date _Date; + private Calendar _Calendar; + private final Currency _Currency; + private List _ArrayList; + private final Set _HashSet; + private final Map _HashMap; + private int[] _intArray; + private long[] _longArray; + private short[] _shortArray; + private float[] _floatArray; + private double[] _doubleArray; + private byte[] _byteArray; + private char[] _charArray; + private String[] _StringArray; + private Person[] _PersonArray; + + public MyContainer() { + + _int = 1; + _long = 2; + _boolean = true; + _Boolean = Boolean.TRUE; + _Class = String.class; + _String = "3"; + _StringBuffer = new StringBuffer("foo"); + _StringBuilder = new StringBuilder("foo"); + _Long = new Long(4); + _Integer = new Integer(5); + _Character = new Character('c'); + _Byte = new Byte("b".getBytes()[0]); + _Double = new Double(6d); + _Float = new Float(7f); + _Short = new Short((short) 8); + _BigDecimal = new BigDecimal(9); + _AtomicInteger = new AtomicInteger(10); + _AtomicLong = new AtomicLong(11); + _MutableInt = new MutableInt(12); + _IntegerArray = new Integer[]{13}; + _Date = new Date(System.currentTimeMillis() - 10000); + _Calendar = Calendar.getInstance(); + _Currency = Currency.getInstance("EUR"); + _ArrayList = new ArrayList(Arrays.asList("foo")); + _HashSet = new HashSet(); + _HashSet.add("14"); + + _HashMap = new HashMap(); + _HashMap.put("foo", 23); + _HashMap.put("bar", 42); + + _intArray = new int[]{1, 2}; + _longArray = new long[]{1, 2}; + _shortArray = new short[]{1, 2}; + _floatArray = new float[]{1, 2}; + _doubleArray = new double[]{1, 2}; + _byteArray = "42".getBytes(); + _charArray = "42".toCharArray(); + _StringArray = new String[]{"23", "42"}; + _PersonArray = new Person[]{createPerson("foo bar", Gender.MALE, 42)}; + + } + + public int getInt() { + return _int; + } + + public void setInt(final int i) { + _int = i; + } + + public long getLong() { + return _long; + } + + public void setLong(final long l) { + _long = l; + } + + public String getString() { + return _String; + } + + public void setString(final String string) { + _String = string; + } + + public Long getLongWrapper() { + return _Long; + } + + public void setLongWrapper(final Long l) { + _Long = l; + } + + public Integer getInteger() { + return _Integer; + } + + public void setInteger(final Integer integer) { + _Integer = integer; + } + + public Character getCharacter() { + return _Character; + } + + public void setCharacter(final Character character) { + _Character = character; + } + + public Byte getByte() { + return _Byte; + } + + public void setByte(final Byte b) { + _Byte = b; + } + + public Double getDouble() { + return _Double; + } + + public void setDouble(final Double d) { + _Double = d; + } + + public Float getFloat() { + return _Float; + } + + public void setFloat(final Float f) { + _Float = f; + } + + public Short getShort() { + return _Short; + } + + public void setShort(final Short s) { + _Short = s; + } + + public BigDecimal getBigDecimal() { + return _BigDecimal; + } + + public void setBigDecimal(final BigDecimal bigDecimal) { + _BigDecimal = bigDecimal; + } - public void setBigDecimal( final BigDecimal bigDecimal ) { - _BigDecimal = bigDecimal; - } + public AtomicInteger getAtomicInteger() { + return _AtomicInteger; + } - public AtomicInteger getAtomicInteger() { - return _AtomicInteger; - } + public void setAtomicInteger(final AtomicInteger atomicInteger) { + _AtomicInteger = atomicInteger; + } - public void setAtomicInteger( final AtomicInteger atomicInteger ) { - _AtomicInteger = atomicInteger; - } + public AtomicLong getAtomicLong() { + return _AtomicLong; + } - public AtomicLong getAtomicLong() { - return _AtomicLong; - } + public void setAtomicLong(final AtomicLong atomicLong) { + _AtomicLong = atomicLong; + } - public void setAtomicLong( final AtomicLong atomicLong ) { - _AtomicLong = atomicLong; - } + public MutableInt getMutableInt() { + return _MutableInt; + } - public MutableInt getMutableInt() { - return _MutableInt; - } + public void setMutableInt(final MutableInt mutableInt) { + _MutableInt = mutableInt; + } - public void setMutableInt( final MutableInt mutableInt ) { - _MutableInt = mutableInt; - } + public Integer[] getIntegerArray() { + return _IntegerArray; + } - public Integer[] getIntegerArray() { - return _IntegerArray; - } + public void setIntegerArray(final Integer[] integerArray) { + _IntegerArray = integerArray; + } - public void setIntegerArray( final Integer[] integerArray ) { - _IntegerArray = integerArray; - } + public Date getDate() { + return _Date; + } - public Date getDate() { - return _Date; - } + public void setDate(final Date date) { + _Date = date; + } - public void setDate( final Date date ) { - _Date = date; - } + public Calendar getCalendar() { + return _Calendar; + } - public Calendar getCalendar() { - return _Calendar; - } + public void setCalendar(final Calendar calendar) { + _Calendar = calendar; + } - public void setCalendar( final Calendar calendar ) { - _Calendar = calendar; - } + public List getArrayList() { + return _ArrayList; + } - public List getArrayList() { - return _ArrayList; - } + public void setArrayList(final List arrayList) { + _ArrayList = arrayList; + } - public void setArrayList( final List arrayList ) { - _ArrayList = arrayList; - } + public int[] getIntArray() { + return _intArray; + } - public int[] getIntArray() { - return _intArray; - } + public void setIntArray(final int[] intArray) { + _intArray = intArray; + } - public void setIntArray( final int[] intArray ) { - _intArray = intArray; - } + public long[] getLongArray() { + return _longArray; + } - public long[] getLongArray() { - return _longArray; - } + public void setLongArray(final long[] longArray) { + _longArray = longArray; + } - public void setLongArray( final long[] longArray ) { - _longArray = longArray; - } + public short[] getShortArray() { + return _shortArray; + } - public short[] getShortArray() { - return _shortArray; - } + public void setShortArray(final short[] shortArray) { + _shortArray = shortArray; + } - public void setShortArray( final short[] shortArray ) { - _shortArray = shortArray; - } + public float[] getFloatArray() { + return _floatArray; + } - public float[] getFloatArray() { - return _floatArray; - } + public void setFloatArray(final float[] floatArray) { + _floatArray = floatArray; + } - public void setFloatArray( final float[] floatArray ) { - _floatArray = floatArray; - } + public double[] getDoubleArray() { + return _doubleArray; + } - public double[] getDoubleArray() { - return _doubleArray; - } + public void setDoubleArray(final double[] doubleArray) { + _doubleArray = doubleArray; + } - public void setDoubleArray( final double[] doubleArray ) { - _doubleArray = doubleArray; - } + public byte[] getByteArray() { + return _byteArray; + } - public byte[] getByteArray() { - return _byteArray; - } + public void setByteArray(final byte[] byteArray) { + _byteArray = byteArray; + } - public void setByteArray( final byte[] byteArray ) { - _byteArray = byteArray; - } + public char[] getCharArray() { + return _charArray; + } - public char[] getCharArray() { - return _charArray; - } + public void setCharArray(final char[] charArray) { + _charArray = charArray; + } - public void setCharArray( final char[] charArray ) { - _charArray = charArray; - } + public String[] getStringArray() { + return _StringArray; + } - public String[] getStringArray() { - return _StringArray; - } + public void setStringArray(final String[] stringArray) { + _StringArray = stringArray; + } - public void setStringArray( final String[] stringArray ) { - _StringArray = stringArray; - } + public Person[] getPersonArray() { + return _PersonArray; + } - public Person[] getPersonArray() { - return _PersonArray; - } + public void setPersonArray(final Person[] personArray) { + _PersonArray = personArray; + } - public void setPersonArray( final Person[] personArray ) { - _PersonArray = personArray; - } + public Set getHashSet() { + return _HashSet; + } - public Set getHashSet() { - return _HashSet; - } + public Map getHashMap() { + return _HashMap; + } - public Map getHashMap() { - return _HashMap; - } + } - } + static class Holder { + T item; - static class Holder { - T item; - - /** - * Default constructor, added for kryo... - */ - public Holder() { - } + /** + * Default constructor, added for kryo... + */ + public Holder() {} - public Holder( final T item ) { - this.item = item; - } - } + public Holder(final T item) { + this.item = item; + } + } - static class HolderList { - List> holders; + static class HolderList { + List> holders; - public HolderList( final List> holders ) { - this.holders = holders; - } - } + public HolderList(final List> holders) { + this.holders = holders; + } + } - static class CounterHolder { - AtomicInteger item; + static class CounterHolder { + AtomicInteger item; - public CounterHolder( final AtomicInteger item ) { - this.item = item; - } - } + public CounterHolder(final AtomicInteger item) { + this.item = item; + } + } - static class CounterHolderArray { - CounterHolder[] holders; + static class CounterHolderArray { + CounterHolder[] holders; - public CounterHolderArray( final CounterHolder... holders ) { - this.holders = holders; - } - } + public CounterHolderArray(final CounterHolder... holders) { + this.holders = holders; + } + } - static class HolderArray { - Holder[] holders; + static class HolderArray { + Holder[] holders; - public HolderArray( final Holder... holders ) { - this.holders = holders; - } - } + public HolderArray(final Holder... holders) { + this.holders = holders; + } + } - public static class HashMapWithIntConstructorOnly extends HashMap { + public static class HashMapWithIntConstructorOnly extends HashMap { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - @SuppressWarnings( "unused" ) - private HashMapWithIntConstructorOnly() { - } + @SuppressWarnings("unused") + private HashMapWithIntConstructorOnly() {} - public HashMapWithIntConstructorOnly( final int size ) { - super( size ); - } + public HashMapWithIntConstructorOnly(final int size) { + super(size); + } - } + } } diff --git a/src/test/java/de/javakaffee/kryoserializers/UnicodeBlockSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/UnicodeBlockSerializerTest.java index cdafd4b6..97887199 100644 --- a/src/test/java/de/javakaffee/kryoserializers/UnicodeBlockSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/UnicodeBlockSerializerTest.java @@ -1,3 +1,19 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers; import static de.javakaffee.kryoserializers.KryoTest.deserialize; @@ -5,15 +21,15 @@ import static org.testng.Assert.assertNull; import static org.testng.Assert.assertSame; -import com.esotericsoftware.kryo.Kryo; -import com.esotericsoftware.kryo.Kryo.DefaultInstantiatorStrategy; +import java.lang.Character.UnicodeBlock; import org.objenesis.ObjenesisStd; import org.objenesis.strategy.StdInstantiatorStrategy; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; -import java.lang.Character.UnicodeBlock; +import com.esotericsoftware.kryo.Kryo; +import com.esotericsoftware.kryo.Kryo.DefaultInstantiatorStrategy; /** * Test for {@link UnicodeBlockSerializer}. @@ -22,42 +38,42 @@ */ public class UnicodeBlockSerializerTest { - private static final String NONEXISTENT_BLOCK_NAME = "RURITANIAN"; - private Kryo kryo; - - private static class ThingWithUnicodeBlock { - final UnicodeBlock unicodeBlock; - - private ThingWithUnicodeBlock(UnicodeBlock unicodeBlock) { - this.unicodeBlock = unicodeBlock; - } - } - - @BeforeTest - protected void beforeTest() { - kryo = new Kryo(); - final DefaultInstantiatorStrategy instantiatorStrategy = new DefaultInstantiatorStrategy(); - instantiatorStrategy.setFallbackInstantiatorStrategy(new StdInstantiatorStrategy()); - kryo.setInstantiatorStrategy(instantiatorStrategy); - kryo.register(UnicodeBlock.class, new UnicodeBlockSerializer()); - } - - @Test - public void testBasicRoundTrip() { - byte[] serialized = serialize(kryo, UnicodeBlock.UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS); - assertSame(deserialize(kryo, serialized, UnicodeBlock.class), - UnicodeBlock.UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS); - } - - @Test - public void testDeserializingUnknownInstanceReturnsNull() { - byte[] serialized = serialize(kryo, new ObjenesisStd().newInstance(UnicodeBlock.class)); - assertNull(deserialize(kryo, serialized, UnicodeBlock.class)); - } - - @Test - public void testCopyContainingObject() { - ThingWithUnicodeBlock original = new ThingWithUnicodeBlock(UnicodeBlock.GREEK); - assertSame(kryo.copy(original).unicodeBlock, UnicodeBlock.GREEK); - } + private static final String NONEXISTENT_BLOCK_NAME = "RURITANIAN"; + private Kryo kryo; + + private static class ThingWithUnicodeBlock { + final UnicodeBlock unicodeBlock; + + private ThingWithUnicodeBlock(UnicodeBlock unicodeBlock) { + this.unicodeBlock = unicodeBlock; + } + } + + @BeforeTest + protected void beforeTest() { + kryo = new Kryo(); + final DefaultInstantiatorStrategy instantiatorStrategy = new DefaultInstantiatorStrategy(); + instantiatorStrategy.setFallbackInstantiatorStrategy(new StdInstantiatorStrategy()); + kryo.setInstantiatorStrategy(instantiatorStrategy); + kryo.register(UnicodeBlock.class, new UnicodeBlockSerializer()); + } + + @Test + public void testBasicRoundTrip() { + byte[] serialized = serialize(kryo, UnicodeBlock.UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS); + assertSame(deserialize(kryo, serialized, UnicodeBlock.class), + UnicodeBlock.UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS); + } + + @Test + public void testDeserializingUnknownInstanceReturnsNull() { + byte[] serialized = serialize(kryo, new ObjenesisStd().newInstance(UnicodeBlock.class)); + assertNull(deserialize(kryo, serialized, UnicodeBlock.class)); + } + + @Test + public void testCopyContainingObject() { + ThingWithUnicodeBlock original = new ThingWithUnicodeBlock(UnicodeBlock.GREEK); + assertSame(kryo.copy(original).unicodeBlock, UnicodeBlock.GREEK); + } } diff --git a/src/test/java/de/javakaffee/kryoserializers/cglib/CGLibProxySerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/cglib/CGLibProxySerializerTest.java index 6294263f..accb96a9 100644 --- a/src/test/java/de/javakaffee/kryoserializers/cglib/CGLibProxySerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/cglib/CGLibProxySerializerTest.java @@ -32,13 +32,7 @@ import java.util.List; import java.util.Map; -import net.sf.cglib.core.DefaultNamingPolicy; -import net.sf.cglib.core.Predicate; -import net.sf.cglib.proxy.Enhancer; -import net.sf.cglib.proxy.InvocationHandler; - import org.objenesis.strategy.StdInstantiatorStrategy; - import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; @@ -53,236 +47,241 @@ import de.javakaffee.kryoserializers.ArraysAsListSerializer; +import net.sf.cglib.core.DefaultNamingPolicy; +import net.sf.cglib.core.Predicate; +import net.sf.cglib.proxy.Enhancer; +import net.sf.cglib.proxy.InvocationHandler; + /** * Test for {@link CGLibProxyFormat}. - * + * * @author Martin Grotzke */ public class CGLibProxySerializerTest { - - private Kryo _kryo; - - @BeforeTest - protected void beforeTest() { - _kryo = createKryo(); - } - - private Kryo createKryo() { - final DefaultClassResolver classResolver = new DefaultClassResolver() { - @Override - protected Class getTypeByName(final String className) { - if (className.indexOf(CGLibProxySerializer.DEFAULT_NAMING_MARKER) > 0) { - return CGLibProxySerializer.CGLibProxyMarker.class; - } - return super.getTypeByName(className); - } - }; - final Kryo kryo = new Kryo(classResolver, new MapReferenceResolver()) { - - @Override - @SuppressWarnings("rawtypes") - public Serializer getDefaultSerializer(final Class type) { - if ( CGLibProxySerializer.canSerialize( type ) ) { - return getSerializer(CGLibProxySerializer.CGLibProxyMarker.class); - } - return super.getDefaultSerializer(type); - } - - }; - // The default strategy is needed so that HashMap is created via the constructor, - // the StdInstantiatorStrategy (fallback) is needed for classes without default - // constructor (e.g. DelegatingHandler). - final DefaultInstantiatorStrategy instantiatorStrategy = new DefaultInstantiatorStrategy(); - instantiatorStrategy.setFallbackInstantiatorStrategy(new StdInstantiatorStrategy()); - kryo.setInstantiatorStrategy(instantiatorStrategy); - kryo.register( CGLibProxySerializer.CGLibProxyMarker.class, new CGLibProxySerializer() ); - kryo.register( Arrays.asList( "" ).getClass(), new ArraysAsListSerializer() ); - return kryo; - } - - @Test( enabled = false ) - public void testProxiesFromFileWrite() throws Exception { - Log.TRACE = true; - final ClassToProxy obj = new ClassToProxy(); - obj._value = "foo"; - final ClassToProxy proxy1 = createProxy( obj ); - final ClassToProxy proxy2 = createProxy( obj ); - final List proxies = Arrays.asList( proxy1, proxy2 ); - final OutputStream out = new FileOutputStream( new File( "/tmp/cglib-data-1.ser" ) ); - final Output output = new Output(out); - _kryo.writeClassAndObject(output, proxies); - output.close(); - } - - /** - * Uses data serialized by {@link #testProxiesFromFileWrite()} that got moved to src/main/resources. - * That serialized data is read from a file verifies that there's no hot class loader - * that might cache some proxy class. - */ - @SuppressWarnings("unchecked") - @Test( enabled = true ) - public void testProxiesFromFileRead() throws Exception { - Log.TRACE = true; - final InputStream in = new FileInputStream( new File( getClass().getResource("/cglib-data-1.ser").toURI() ) ); - final Input input = new Input(in); - final List proxies = (List) _kryo.readClassAndObject(input); - in.close(); - System.out.println(proxies); - assertEquals(2, proxies.size()); - final ClassToProxy proxy1 = proxies.get(0); - assertEquals( "foo", proxy1.getValue() ); - final ClassToProxy proxy2 = proxies.get(1); - assertEquals( "foo", proxy2.getValue() ); - // test that the proxied object is referenced by both proxies - proxy1.setValue("bar"); - assertEquals( "bar", proxy1.getValue() ); - assertEquals( "bar", proxy2.getValue() ); - } - - @Test( enabled = true ) - public void testContainerWithCGLibProxy() throws Exception { - - final CustomClassLoader loader = new CustomClassLoader( getClass().getClassLoader() ); - // _kryo.setClassLoader(loader); - - final Class myServiceClass = loader.loadClass( MyServiceImpl.class.getName() ); - final Object proxy = createProxy( myServiceClass.newInstance() ); - - final Class myContainerClass = loader.loadClass( MyContainer.class.getName() ); - final Object myContainer = myContainerClass.getConstructors()[0].newInstance( proxy ); - - System.out.println("---------------- test ------------------"); - System.out.println(proxy.getClass()); - System.out.println(Arrays.asList(proxy.getClass().getInterfaces())); - System.out.println(proxy.getClass().getSuperclass()); - System.out.println(Arrays.asList(proxy.getClass().getSuperclass().getInterfaces())); - System.out.println("---------------- END test ------------------"); - - final byte[] serialized = serialize(_kryo, myContainer); - - deserialize(_kryo, serialized, MyContainer.class); - // If we reached this kryo was able to deserialize the proxy, so we're fine - } - - @Test( enabled = true ) - public void testCGLibProxy() { - final ClassToProxy proxy = createProxy( new ClassToProxy() ); - proxy.setValue( "foo" ); - - final byte[] serialized = serialize(_kryo, proxy); - final ClassToProxy deserialized = deserialize(_kryo, serialized, proxy.getClass() ); - assertEquals( deserialized.getValue(), proxy.getValue() ); - } - - /** - * Test that a cglib proxy is handled correctly. - */ - @Test( enabled = true ) - public void testCGLibProxyForExistingFormat() { - final Map proxy = createProxy( new HashMap() ); - proxy.put( "foo", "bar" ); - assertEquals( proxy.get( "foo" ), "bar" ); - - final byte[] serialized = serialize(_kryo, proxy); - @SuppressWarnings( "unchecked" ) - final Map deserialized = deserialize(_kryo, serialized, proxy.getClass() ); - assertEquals( deserialized.get( "foo" ), proxy.get( "foo" ) ); - } - - @SuppressWarnings( "unchecked" ) - private T createProxy( final T obj ) { - - final Enhancer e = new Enhancer(); - e.setInterfaces( new Class[] { Serializable.class } ); - final Class class1 = obj.getClass(); - e.setSuperclass( class1 ); - e.setCallback( new DelegatingHandler( obj ) ); - e.setNamingPolicy( new DefaultNamingPolicy() { - @Override - public String getClassName(final String prefix, final String source, - final Object key, final Predicate names) { - return super.getClassName( "MSM_" + prefix, source, key, names ); - } - } ); - - return (T) e.create(); - } - - public static class DelegatingHandler implements InvocationHandler, Serializable { - - private static final long serialVersionUID = 1L; - - private final Object _delegate; - - public DelegatingHandler( final Object delegate ) { - _delegate = delegate; - } - - public Object invoke( final Object obj, final Method method, final Object[] args ) throws Throwable { - return method.invoke( _delegate, args ); - } - } - - public static class ClassToProxy { - private String _value; - - /** - * @param value the value to set - */ - public void setValue( final String value ) { - _value = value; - } - - /** - * @return the value - */ - public String getValue() { - return _value; - } + + private Kryo _kryo; + + @BeforeTest + protected void beforeTest() { + _kryo = createKryo(); + } + + private Kryo createKryo() { + final DefaultClassResolver classResolver = new DefaultClassResolver() { + @Override + protected Class getTypeByName(final String className) { + if (className.indexOf(CGLibProxySerializer.DEFAULT_NAMING_MARKER) > 0) { + return CGLibProxySerializer.CGLibProxyMarker.class; + } + return super.getTypeByName(className); + } + }; + final Kryo kryo = new Kryo(classResolver, new MapReferenceResolver()) { + + @Override + @SuppressWarnings("rawtypes") + public Serializer getDefaultSerializer(final Class type) { + if (CGLibProxySerializer.canSerialize(type)) { + return getSerializer(CGLibProxySerializer.CGLibProxyMarker.class); + } + return super.getDefaultSerializer(type); + } + + }; + // The default strategy is needed so that HashMap is created via the constructor, + // the StdInstantiatorStrategy (fallback) is needed for classes without default + // constructor (e.g. DelegatingHandler). + final DefaultInstantiatorStrategy instantiatorStrategy = new DefaultInstantiatorStrategy(); + instantiatorStrategy.setFallbackInstantiatorStrategy(new StdInstantiatorStrategy()); + kryo.setInstantiatorStrategy(instantiatorStrategy); + kryo.register(CGLibProxySerializer.CGLibProxyMarker.class, new CGLibProxySerializer()); + kryo.register(Arrays.asList("").getClass(), new ArraysAsListSerializer()); + return kryo; + } + + @Test(enabled = false) + public void testProxiesFromFileWrite() throws Exception { + Log.TRACE = true; + final ClassToProxy obj = new ClassToProxy(); + obj._value = "foo"; + final ClassToProxy proxy1 = createProxy(obj); + final ClassToProxy proxy2 = createProxy(obj); + final List proxies = Arrays.asList(proxy1, proxy2); + final OutputStream out = new FileOutputStream(new File("/tmp/cglib-data-1.ser")); + final Output output = new Output(out); + _kryo.writeClassAndObject(output, proxies); + output.close(); + } + + /** + * Uses data serialized by {@link #testProxiesFromFileWrite()} that got moved to src/main/resources. + * That serialized data is read from a file verifies that there's no hot class loader + * that might cache some proxy class. + */ + @SuppressWarnings("unchecked") + @Test(enabled = true) + public void testProxiesFromFileRead() throws Exception { + Log.TRACE = true; + final InputStream in = new FileInputStream(new File(getClass().getResource("/cglib-data-1.ser").toURI())); + final Input input = new Input(in); + final List proxies = (List) _kryo.readClassAndObject(input); + in.close(); + System.out.println(proxies); + assertEquals(2, proxies.size()); + final ClassToProxy proxy1 = proxies.get(0); + assertEquals("foo", proxy1.getValue()); + final ClassToProxy proxy2 = proxies.get(1); + assertEquals("foo", proxy2.getValue()); + // test that the proxied object is referenced by both proxies + proxy1.setValue("bar"); + assertEquals("bar", proxy1.getValue()); + assertEquals("bar", proxy2.getValue()); + } + + @Test(enabled = true) + public void testContainerWithCGLibProxy() throws Exception { + + final CustomClassLoader loader = new CustomClassLoader(getClass().getClassLoader()); + // _kryo.setClassLoader(loader); + + final Class myServiceClass = loader.loadClass(MyServiceImpl.class.getName()); + final Object proxy = createProxy(myServiceClass.newInstance()); + + final Class myContainerClass = loader.loadClass(MyContainer.class.getName()); + final Object myContainer = myContainerClass.getConstructors()[0].newInstance(proxy); + + System.out.println("---------------- test ------------------"); + System.out.println(proxy.getClass()); + System.out.println(Arrays.asList(proxy.getClass().getInterfaces())); + System.out.println(proxy.getClass().getSuperclass()); + System.out.println(Arrays.asList(proxy.getClass().getSuperclass().getInterfaces())); + System.out.println("---------------- END test ------------------"); + + final byte[] serialized = serialize(_kryo, myContainer); + + deserialize(_kryo, serialized, MyContainer.class); + // If we reached this kryo was able to deserialize the proxy, so we're fine + } + + @Test(enabled = true) + public void testCGLibProxy() { + final ClassToProxy proxy = createProxy(new ClassToProxy()); + proxy.setValue("foo"); + + final byte[] serialized = serialize(_kryo, proxy); + final ClassToProxy deserialized = deserialize(_kryo, serialized, proxy.getClass()); + assertEquals(deserialized.getValue(), proxy.getValue()); + } + + /** + * Test that a cglib proxy is handled correctly. + */ + @Test(enabled = true) + public void testCGLibProxyForExistingFormat() { + final Map proxy = createProxy(new HashMap()); + proxy.put("foo", "bar"); + assertEquals(proxy.get("foo"), "bar"); + + final byte[] serialized = serialize(_kryo, proxy); + @SuppressWarnings("unchecked") + final Map deserialized = deserialize(_kryo, serialized, proxy.getClass()); + assertEquals(deserialized.get("foo"), proxy.get("foo")); + } + + @SuppressWarnings("unchecked") + private T createProxy(final T obj) { + + final Enhancer e = new Enhancer(); + e.setInterfaces(new Class[]{Serializable.class}); + final Class class1 = obj.getClass(); + e.setSuperclass(class1); + e.setCallback(new DelegatingHandler(obj)); + e.setNamingPolicy(new DefaultNamingPolicy() { + @Override + public String getClassName(final String prefix, final String source, + final Object key, final Predicate names) { + return super.getClassName("MSM_" + prefix, source, key, names); + } + }); + + return (T) e.create(); + } + + public static class DelegatingHandler implements InvocationHandler, Serializable { + + private static final long serialVersionUID = 1L; + + private final Object _delegate; + + public DelegatingHandler(final Object delegate) { + _delegate = delegate; + } + + public Object invoke(final Object obj, final Method method, final Object[] args) throws Throwable { + return method.invoke(_delegate, args); + } + } + + public static class ClassToProxy { + private String _value; + + /** + * @param value the value to set + */ + public void setValue(final String value) { + _value = value; + } + + /** + * @return the value + */ + public String getValue() { + return _value; + } @Override public String toString() { return "ClassToProxy [_value=" + _value + "]"; } - } - - public static class MySpecialContainer extends MyContainer { - - public MySpecialContainer( final MyService myService ) { - super( myService ); - } - - } - - public static class MyContainer { - - private MyService _myService; - - public MyContainer( final MyService myService ) { - _myService = myService; - } - - public MyService getMyService() { - return _myService; - } - - public void setMyService( final MyService myService ) { - _myService = myService; - } - - } - - public static interface MyService { - String sayHello(); - } - - public static class MyServiceImpl implements MyService { - - @Override - public String sayHello() { - return "hi"; - } - - } + } + + public static class MySpecialContainer extends MyContainer { + + public MySpecialContainer(final MyService myService) { + super(myService); + } + + } + + public static class MyContainer { + + private MyService _myService; + + public MyContainer(final MyService myService) { + _myService = myService; + } + + public MyService getMyService() { + return _myService; + } + + public void setMyService(final MyService myService) { + _myService = myService; + } + + } + + public static interface MyService { + String sayHello(); + } + + public static class MyServiceImpl implements MyService { + + @Override + public String sayHello() { + return "hi"; + } + + } } diff --git a/src/test/java/de/javakaffee/kryoserializers/cglib/CustomClassLoader.java b/src/test/java/de/javakaffee/kryoserializers/cglib/CustomClassLoader.java index 180ab653..2a9aec69 100644 --- a/src/test/java/de/javakaffee/kryoserializers/cglib/CustomClassLoader.java +++ b/src/test/java/de/javakaffee/kryoserializers/cglib/CustomClassLoader.java @@ -31,106 +31,106 @@ * other class it will use the super.loadClass() method * from ClassLoader, which will eventually pass the * request to the parent. - * + * * @see Java ClassLoader (2) – Write your own ClassLoader * */ public class CustomClassLoader extends ClassLoader { - /** - * Parent ClassLoader passed to this constructor - * will be used if this ClassLoader can not resolve a - * particular class. - * - * @param parent Parent ClassLoader - * (may be from getClass().getClassLoader()) - */ - public CustomClassLoader(final ClassLoader parent) { - super(parent); - } + /** + * Parent ClassLoader passed to this constructor + * will be used if this ClassLoader can not resolve a + * particular class. + * + * @param parent Parent ClassLoader + * (may be from getClass().getClassLoader()) + */ + public CustomClassLoader(final ClassLoader parent) { + super(parent); + } + + /** + * Loads a given class from .class file just like + * the default ClassLoader. This method could be + * changed to load the class over network from some + * other server or from the database. + * + * @param name Full class name + */ + private Class getClass(final String name) + throws ClassNotFoundException { + // We are getting a name that looks like + // javablogging.package.ClassToLoad + // and we have to convert it into the .class file name + // like javablogging/package/ClassToLoad.class + final String file = name.replace('.', File.separatorChar) + + ".class"; + byte[] b = null; + try { + // This loads the byte code data from the file + b = loadClassData(file); + // defineClass is inherited from the ClassLoader class + // and converts the byte array into a Class + final Class c = defineClass(name, b, 0, b.length); + resolveClass(c); + return c; + } catch (final IOException e) { + e.printStackTrace(); + return null; + } + } - /** - * Loads a given class from .class file just like - * the default ClassLoader. This method could be - * changed to load the class over network from some - * other server or from the database. - * - * @param name Full class name - */ - private Class getClass(final String name) - throws ClassNotFoundException { - // We are getting a name that looks like - // javablogging.package.ClassToLoad - // and we have to convert it into the .class file name - // like javablogging/package/ClassToLoad.class - final String file = name.replace('.', File.separatorChar) - + ".class"; - byte[] b = null; - try { - // This loads the byte code data from the file - b = loadClassData(file); - // defineClass is inherited from the ClassLoader class - // and converts the byte array into a Class - final Class c = defineClass(name, b, 0, b.length); - resolveClass(c); - return c; - } catch (final IOException e) { - e.printStackTrace(); - return null; - } - } + /** + * Every request for a class passes through this method. + * If the requested class is in "javablogging" package, + * it will load it using the + * {@link CustomClassLoader#getClass()} method. + * If not, it will use the super.loadClass() method + * which in turn will pass the request to the parent. + * + * @param name + * Full class name + */ + @Override + public Class loadClass(final String name) + throws ClassNotFoundException { + System.out.println("loading class '" + name + "'"); + if (name.startsWith(getClass().getPackage().getName()) && !_definedClasses.contains(name)) { + System.out.println("-> custom loading class '" + name + "'"); + _definedClasses.add(name); + return getClass(name); + } + return super.loadClass(name); + } - /** - * Every request for a class passes through this method. - * If the requested class is in "javablogging" package, - * it will load it using the - * {@link CustomClassLoader#getClass()} method. - * If not, it will use the super.loadClass() method - * which in turn will pass the request to the parent. - * - * @param name - * Full class name - */ - @Override - public Class loadClass(final String name) - throws ClassNotFoundException { - System.out.println("loading class '" + name + "'"); - if (name.startsWith( getClass().getPackage().getName() ) && !_definedClasses.contains( name ) ) { - System.out.println("-> custom loading class '" + name + "'"); - _definedClasses.add( name ); - return getClass(name); - } - return super.loadClass(name); - } + private final Set _definedClasses = new HashSet(); - private final Set _definedClasses = new HashSet(); + /** + * Loads a given file (presumably .class) into a byte array. + * The file should be accessible as a resource, for example + * it could be located on the classpath. + * + * @param name File name to load + * @return Byte array read from the file + * @throws IOException Is thrown when there + * was some problem reading the file + */ + private byte[] loadClassData(final String name) throws IOException { + // Opening the file + final InputStream stream = getClass().getClassLoader() + .getResourceAsStream(name); + final int size = stream.available(); + final byte buff[] = new byte[size]; + final DataInputStream in = new DataInputStream(stream); + // Reading the binary data + in.readFully(buff); + in.close(); + return buff; + } - /** - * Loads a given file (presumably .class) into a byte array. - * The file should be accessible as a resource, for example - * it could be located on the classpath. - * - * @param name File name to load - * @return Byte array read from the file - * @throws IOException Is thrown when there - * was some problem reading the file - */ - private byte[] loadClassData(final String name) throws IOException { - // Opening the file - final InputStream stream = getClass().getClassLoader() - .getResourceAsStream(name); - final int size = stream.available(); - final byte buff[] = new byte[size]; - final DataInputStream in = new DataInputStream(stream); - // Reading the binary data - in.readFully(buff); - in.close(); - return buff; - } - - @Override - protected void finalize() throws Throwable { - System.out.println( getClass().getSimpleName() + ".finalize() is being called." ); - super.finalize(); - } + @Override + protected void finalize() throws Throwable { + System.out.println(getClass().getSimpleName() + ".finalize() is being called."); + super.finalize(); + } } diff --git a/src/test/java/de/javakaffee/kryoserializers/dexx/ListSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/dexx/ListSerializerTest.java index 021022cb..2034fcc4 100644 --- a/src/test/java/de/javakaffee/kryoserializers/dexx/ListSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/dexx/ListSerializerTest.java @@ -1,84 +1,98 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers.dexx; import static de.javakaffee.kryoserializers.KryoTest.deserialize; import static de.javakaffee.kryoserializers.KryoTest.serialize; - import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertSame; import static org.testng.Assert.assertTrue; -import com.esotericsoftware.kryo.Kryo; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; +import com.esotericsoftware.kryo.Kryo; import com.github.andrewoma.dexx.collection.ArrayList; import com.github.andrewoma.dexx.collection.IndexedLists; import com.github.andrewoma.dexx.collection.List; -import org.testng.annotations.BeforeTest; -import org.testng.annotations.Test; - /** * Test for {@link ListSerializer} */ public class ListSerializerTest { - private Kryo _kryo; - - @BeforeTest - public void setUp() throws Exception { - _kryo = new Kryo(); - - ListSerializer.registerSerializers(_kryo); - } - - @Test(enabled = true) - public void testEmpty() { - final List obj = IndexedLists.of(); - final byte[] serialized = serialize(_kryo, obj); - final List deserialized = deserialize(_kryo, serialized, List.class); - assertTrue(deserialized.isEmpty()); - assertEquals(deserialized.size(), obj.size()); - } - - @Test(enabled = true) - public void testRegular() { - final List obj = IndexedLists.of(3,4,5,6,7); - final byte[] serialized = serialize(_kryo, obj); - final List deserialized = deserialize(_kryo, serialized, List.class); - assertEquals(deserialized, obj); - } - - @Test(enabled = true) - public void testCopyOfIterable() { - final ArrayList iterable = new ArrayList(); - iterable.append(new Object()); - final List obj = IndexedLists.copyOf(iterable.asList()); - final byte[] serialized = serialize(_kryo, obj); - final List deserialized = deserialize(_kryo, serialized, List.class); - assertEquals(deserialized, obj); - } - - // Kryo#copy tests - - @Test(enabled = true) - public void testCopyEmpty() { - final List obj = IndexedLists.of(); - final List copied = _kryo.copy(obj); - assertSame(copied, obj); - } - - @Test(enabled = true) - public void testCopyRegular() { - final List obj = IndexedLists.of(2,3,4,5); - final List copied = _kryo.copy(obj); - assertSame(copied, obj); - } - - @Test(enabled = true) - public void testCopyCopyOfIterable() { - final ArrayList iterable = new ArrayList(); - iterable.append(new Object()); - final List obj = IndexedLists.copyOf(iterable.asList()); - List copied = _kryo.copy(obj); - assertSame(copied, obj); - } + private Kryo _kryo; + + @BeforeTest + public void setUp() throws Exception { + _kryo = new Kryo(); + + ListSerializer.registerSerializers(_kryo); + } + + @Test(enabled = true) + public void testEmpty() { + final List obj = IndexedLists.of(); + final byte[] serialized = serialize(_kryo, obj); + final List deserialized = deserialize(_kryo, serialized, List.class); + assertTrue(deserialized.isEmpty()); + assertEquals(deserialized.size(), obj.size()); + } + + @Test(enabled = true) + public void testRegular() { + final List obj = IndexedLists.of(3, 4, 5, 6, 7); + final byte[] serialized = serialize(_kryo, obj); + final List deserialized = deserialize(_kryo, serialized, List.class); + assertEquals(deserialized, obj); + } + + @Test(enabled = true) + public void testCopyOfIterable() { + final ArrayList iterable = new ArrayList(); + iterable.append(new Object()); + final List obj = IndexedLists.copyOf(iterable.asList()); + final byte[] serialized = serialize(_kryo, obj); + final List deserialized = deserialize(_kryo, serialized, List.class); + assertEquals(deserialized, obj); + } + + // Kryo#copy tests + + @Test(enabled = true) + public void testCopyEmpty() { + final List obj = IndexedLists.of(); + final List copied = _kryo.copy(obj); + assertSame(copied, obj); + } + + @Test(enabled = true) + public void testCopyRegular() { + final List obj = IndexedLists.of(2, 3, 4, 5); + final List copied = _kryo.copy(obj); + assertSame(copied, obj); + } + + @Test(enabled = true) + public void testCopyCopyOfIterable() { + final ArrayList iterable = new ArrayList(); + iterable.append(new Object()); + final List obj = IndexedLists.copyOf(iterable.asList()); + List copied = _kryo.copy(obj); + assertSame(copied, obj); + } } diff --git a/src/test/java/de/javakaffee/kryoserializers/dexx/MapSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/dexx/MapSerializerTest.java index 72608128..c34ba928 100644 --- a/src/test/java/de/javakaffee/kryoserializers/dexx/MapSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/dexx/MapSerializerTest.java @@ -1,61 +1,76 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers.dexx; -import com.esotericsoftware.kryo.Kryo; +import static de.javakaffee.kryoserializers.KryoTest.deserialize; +import static de.javakaffee.kryoserializers.KryoTest.serialize; +import static org.testng.Assert.*; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; +import com.esotericsoftware.kryo.Kryo; import com.github.andrewoma.dexx.collection.Map; import com.github.andrewoma.dexx.collection.Maps; -import static de.javakaffee.kryoserializers.KryoTest.deserialize; -import static de.javakaffee.kryoserializers.KryoTest.serialize; -import static org.testng.Assert.*; - /** * Test for {@link MapSerializer} */ public class MapSerializerTest { - private Kryo _kryo; - - @BeforeTest - public void setUp() throws Exception { - _kryo = new Kryo(); - - MapSerializer.registerSerializers(_kryo); - } - - @Test(enabled = true) - public void testEmpty() { - final Map obj = Maps.of(); - final byte[] serialized = serialize(_kryo, obj); - final Map deserialized = deserialize(_kryo, serialized, Map.class); - assertTrue(deserialized.isEmpty()); - assertEquals(deserialized.size(), obj.size()); - } - - @Test(enabled = true) - public void testRegular() { - final Map obj = Maps.of(3, "k", 5, "r", 6, "y"); - final byte[] serialized = serialize(_kryo, obj); - final Map deserialized = deserialize(_kryo, serialized, Map.class); - assertEquals(deserialized, obj); - } - - // Kryo#copy tests - - @Test(enabled = true) - public void testCopyEmpty() { - final Map obj = Maps.of(); - final Map copied = _kryo.copy(obj); - assertSame(copied, obj); - } - - @Test(enabled = true) - public void testCopyRegular() { - final Map obj = Maps.of(1, 2, 3, 4); - final Map copied = _kryo.copy(obj); - assertSame(copied, obj); - } + private Kryo _kryo; + + @BeforeTest + public void setUp() throws Exception { + _kryo = new Kryo(); + + MapSerializer.registerSerializers(_kryo); + } + + @Test(enabled = true) + public void testEmpty() { + final Map obj = Maps.of(); + final byte[] serialized = serialize(_kryo, obj); + final Map deserialized = deserialize(_kryo, serialized, Map.class); + assertTrue(deserialized.isEmpty()); + assertEquals(deserialized.size(), obj.size()); + } + + @Test(enabled = true) + public void testRegular() { + final Map obj = Maps.of(3, "k", 5, "r", 6, "y"); + final byte[] serialized = serialize(_kryo, obj); + final Map deserialized = deserialize(_kryo, serialized, Map.class); + assertEquals(deserialized, obj); + } + + // Kryo#copy tests + + @Test(enabled = true) + public void testCopyEmpty() { + final Map obj = Maps.of(); + final Map copied = _kryo.copy(obj); + assertSame(copied, obj); + } + + @Test(enabled = true) + public void testCopyRegular() { + final Map obj = Maps.of(1, 2, 3, 4); + final Map copied = _kryo.copy(obj); + assertSame(copied, obj); + } } diff --git a/src/test/java/de/javakaffee/kryoserializers/dexx/SetSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/dexx/SetSerializerTest.java index 7c47d79b..8d2f4be5 100644 --- a/src/test/java/de/javakaffee/kryoserializers/dexx/SetSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/dexx/SetSerializerTest.java @@ -1,14 +1,29 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers.dexx; -import com.esotericsoftware.kryo.Kryo; +import static de.javakaffee.kryoserializers.KryoTest.deserialize; +import static de.javakaffee.kryoserializers.KryoTest.serialize; import static org.testng.Assert.*; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; -import static de.javakaffee.kryoserializers.KryoTest.deserialize; -import static de.javakaffee.kryoserializers.KryoTest.serialize; - +import com.esotericsoftware.kryo.Kryo; import com.github.andrewoma.dexx.collection.Set; import com.github.andrewoma.dexx.collection.Sets; @@ -17,45 +32,45 @@ */ public class SetSerializerTest { - private Kryo _kryo; - - @BeforeTest - public void setUp() throws Exception { - _kryo = new Kryo(); - - SetSerializer.registerSerializers(_kryo); - } - - @Test(enabled = true) - public void testEmpty() { - final Set obj = Sets.of(); - final byte[] serialized = serialize( _kryo, obj ); - final Set deserialized = deserialize(_kryo, serialized, Set.class); - assertTrue(deserialized.isEmpty()); - assertEquals(deserialized.size(), obj.size()); - } - - @Test(enabled = true) - public void testRegular() { - final Set obj = Sets.of(3, 4, 5, 6); - final byte[] serialized = serialize( _kryo, obj ); - final Set deserialized = deserialize(_kryo, serialized, Set.class); - assertEquals(deserialized, obj); - } - - // Kryo#copy tests - - @Test(enabled = true) - public void testCopyEmpty() { - final Set obj = Sets.of(); - final Set copied = _kryo.copy(obj); - assertSame(copied, obj); - } - - @Test(enabled = true) - public void testCopyRegular() { - final Set obj = Sets.of(1, 2, 3); - final Set copied = _kryo.copy(obj); - assertSame(copied, obj); - } + private Kryo _kryo; + + @BeforeTest + public void setUp() throws Exception { + _kryo = new Kryo(); + + SetSerializer.registerSerializers(_kryo); + } + + @Test(enabled = true) + public void testEmpty() { + final Set obj = Sets.of(); + final byte[] serialized = serialize(_kryo, obj); + final Set deserialized = deserialize(_kryo, serialized, Set.class); + assertTrue(deserialized.isEmpty()); + assertEquals(deserialized.size(), obj.size()); + } + + @Test(enabled = true) + public void testRegular() { + final Set obj = Sets.of(3, 4, 5, 6); + final byte[] serialized = serialize(_kryo, obj); + final Set deserialized = deserialize(_kryo, serialized, Set.class); + assertEquals(deserialized, obj); + } + + // Kryo#copy tests + + @Test(enabled = true) + public void testCopyEmpty() { + final Set obj = Sets.of(); + final Set copied = _kryo.copy(obj); + assertSame(copied, obj); + } + + @Test(enabled = true) + public void testCopyRegular() { + final Set obj = Sets.of(1, 2, 3); + final Set copied = _kryo.copy(obj); + assertSame(copied, obj); + } } diff --git a/src/test/java/de/javakaffee/kryoserializers/guava/ArrayListMultimapSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/guava/ArrayListMultimapSerializerTest.java index c8a2a597..87aa3ec8 100644 --- a/src/test/java/de/javakaffee/kryoserializers/guava/ArrayListMultimapSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/guava/ArrayListMultimapSerializerTest.java @@ -1,30 +1,45 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers.guava; -import de.javakaffee.kryoserializers.KryoTest; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; import com.esotericsoftware.kryo.Kryo; - import com.google.common.collect.ArrayListMultimap; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.Test; +import de.javakaffee.kryoserializers.KryoTest; public class ArrayListMultimapSerializerTest extends MultimapSerializerTestBase { - private Kryo _kryo; - - @BeforeClass - public void initializeKyroWithSerializer() { - _kryo = new Kryo(); - ArrayListMultimapSerializer.registerSerializers(_kryo); - } - - @Test(dataProvider = "Google Guava multimaps") - public void testMultimap(Object[] contents) { - final ArrayListMultimap multimap = ArrayListMultimap.create(); - populateMultimap(multimap, contents); - final byte[] serialized = KryoTest.serialize(_kryo, multimap); - final ArrayListMultimap deserialized = KryoTest.deserialize(_kryo, serialized, ArrayListMultimap.class); - assertEqualMultimaps(false, true, deserialized, multimap); - } + private Kryo _kryo; + + @BeforeClass + public void initializeKyroWithSerializer() { + _kryo = new Kryo(); + ArrayListMultimapSerializer.registerSerializers(_kryo); + } + + @Test(dataProvider = "Google Guava multimaps") + public void testMultimap(Object[] contents) { + final ArrayListMultimap multimap = ArrayListMultimap.create(); + populateMultimap(multimap, contents); + final byte[] serialized = KryoTest.serialize(_kryo, multimap); + final ArrayListMultimap deserialized = KryoTest.deserialize(_kryo, serialized, ArrayListMultimap.class); + assertEqualMultimaps(false, true, deserialized, multimap); + } } diff --git a/src/test/java/de/javakaffee/kryoserializers/guava/HashMultimapSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/guava/HashMultimapSerializerTest.java index 215d3977..01e7051e 100644 --- a/src/test/java/de/javakaffee/kryoserializers/guava/HashMultimapSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/guava/HashMultimapSerializerTest.java @@ -1,30 +1,45 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers.guava; -import de.javakaffee.kryoserializers.KryoTest; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; import com.esotericsoftware.kryo.Kryo; - import com.google.common.collect.HashMultimap; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.Test; +import de.javakaffee.kryoserializers.KryoTest; public class HashMultimapSerializerTest extends MultimapSerializerTestBase { - private Kryo _kryo; - - @BeforeClass - public void initializeKyroWithSerializer() { - _kryo = new Kryo(); - HashMultimapSerializer.registerSerializers(_kryo); - } - - @Test(dataProvider = "Google Guava multimaps") - public void testMultimap(Object[] contents) { - final HashMultimap multimap = HashMultimap.create(); - populateMultimap(multimap, contents); - final byte[] serialized = KryoTest.serialize(_kryo, multimap); - final HashMultimap deserialized = KryoTest.deserialize(_kryo, serialized, HashMultimap.class); - assertEqualMultimaps(false, false, deserialized, multimap); - } + private Kryo _kryo; + + @BeforeClass + public void initializeKyroWithSerializer() { + _kryo = new Kryo(); + HashMultimapSerializer.registerSerializers(_kryo); + } + + @Test(dataProvider = "Google Guava multimaps") + public void testMultimap(Object[] contents) { + final HashMultimap multimap = HashMultimap.create(); + populateMultimap(multimap, contents); + final byte[] serialized = KryoTest.serialize(_kryo, multimap); + final HashMultimap deserialized = KryoTest.deserialize(_kryo, serialized, HashMultimap.class); + assertEqualMultimaps(false, false, deserialized, multimap); + } } diff --git a/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableListSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableListSerializerTest.java index fceb3801..b6c89b45 100644 --- a/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableListSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableListSerializerTest.java @@ -1,3 +1,19 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers.guava; import static de.javakaffee.kryoserializers.KryoTest.deserialize; @@ -14,134 +30,133 @@ import com.google.common.collect.Lists; import com.google.common.collect.Table; - /** * Test for {@link ImmutableListSerializer}. */ public class ImmutableListSerializerTest { - private Kryo _kryo; - - @BeforeTest - public void setUp() throws Exception { - _kryo = new Kryo(); - - ImmutableListSerializer.registerSerializers(_kryo); - } - - @Test( enabled = true ) - public void testEmpty() { - final ImmutableList obj = ImmutableList.of(); - final byte[] serialized = serialize( _kryo, obj ); - final ImmutableList deserialized = deserialize(_kryo, serialized, ImmutableList.class); - assertTrue(deserialized.isEmpty()); - assertEquals(deserialized.size(), obj.size()); - } - - @Test( enabled = true ) - public void testSingleton() { - final ImmutableList obj = ImmutableList.of(3); - final byte[] serialized = serialize( _kryo, obj ); - final ImmutableList deserialized = deserialize(_kryo, serialized, ImmutableList.class); - assertEquals(deserialized, obj); - } - - @Test( enabled = true ) - public void testRegular() { - final ImmutableList obj = ImmutableList.of(3, 4, 5, 6); - final byte[] serialized = serialize( _kryo, obj ); - final ImmutableList deserialized = deserialize(_kryo, serialized, ImmutableList.class); - assertEquals(deserialized, obj); - } - - @Test( enabled = true ) - public void testSubList() { - final ImmutableList obj = ImmutableList.of(3, 4, 5, 6).subList(1, 3); - final byte[] serialized = serialize( _kryo, obj ); - final ImmutableList deserialized = deserialize(_kryo, serialized, ImmutableList.class); - assertEquals(deserialized, obj); - } - - @Test( enabled = true ) - public void testReverse() { - final ImmutableList obj = ImmutableList.of(3,4,5).reverse(); - final byte[] serialized = serialize( _kryo, obj ); - final ImmutableList deserialized = deserialize(_kryo, serialized, ImmutableList.class); - assertEquals(deserialized, obj); - } - - @Test( enabled = true ) - public void testStringAsImmutableList() { - final ImmutableList obj = Lists.charactersOf("KryoRocks"); - final byte[] serialized = serialize( _kryo, obj ); - final ImmutableList deserialized = deserialize(_kryo, serialized, ImmutableList.class); - assertEquals(deserialized, obj); - } - - @Test( enabled = true ) - public void testValues() { - Table baseTable = HashBasedTable.create(); - baseTable.put(1, 2, 3); - baseTable.put(4, 5, 6); - Table table = ImmutableTable.copyOf(baseTable); - final ImmutableList obj = (ImmutableList) table.values(); - final byte[] serialized = serialize( _kryo, obj ); - final ImmutableList deserialized = deserialize(_kryo, serialized, ImmutableList.class); - assertEquals(deserialized, obj); - } - - // Kryo#copy tests - - @Test( enabled = true ) - public void testCopyEmpty() { - final ImmutableList obj = ImmutableList.of(); - final ImmutableList copied = _kryo.copy(obj); - assertSame(copied, obj); - } - - @Test( enabled = true ) - public void testCopySingleton() { - final ImmutableList obj = ImmutableList.of(1); - final ImmutableList copied = _kryo.copy(obj); - assertSame(copied, obj); - } - - @Test( enabled = true ) - public void testCopyRegular() { - final ImmutableList obj = ImmutableList.of(1, 2, 3); - final ImmutableList copied = _kryo.copy(obj); - assertSame(copied, obj); - } - - @Test( enabled = true ) - public void testCopySubList() { - final ImmutableList obj = ImmutableList.of(1, 2, 3, 4).subList(1, 3); - final ImmutableList copied = _kryo.copy(obj); - assertSame(copied, obj); - } - - @Test( enabled = true ) - public void testCopyReverse() { - final ImmutableList obj = ImmutableList.of(1,2,3).reverse(); - final ImmutableList copied = _kryo.copy(obj); - assertSame(copied, obj); - } - - @Test( enabled = true ) - public void testCopyStringAsImmutableList() { - final ImmutableList obj = Lists.charactersOf("KryoRocks"); - final ImmutableList copied = _kryo.copy(obj); - assertSame(copied, obj); - } - - @Test( enabled = true ) - public void testCopyValues() { - Table baseTable = HashBasedTable.create(); - baseTable.put(1, 2, 3); - baseTable.put(4, 5, 6); - Table table = ImmutableTable.copyOf(baseTable); - final ImmutableList obj = (ImmutableList) table.values(); - final ImmutableList copied = _kryo.copy(obj); - assertSame(copied, obj); - } + private Kryo _kryo; + + @BeforeTest + public void setUp() throws Exception { + _kryo = new Kryo(); + + ImmutableListSerializer.registerSerializers(_kryo); + } + + @Test(enabled = true) + public void testEmpty() { + final ImmutableList obj = ImmutableList.of(); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableList deserialized = deserialize(_kryo, serialized, ImmutableList.class); + assertTrue(deserialized.isEmpty()); + assertEquals(deserialized.size(), obj.size()); + } + + @Test(enabled = true) + public void testSingleton() { + final ImmutableList obj = ImmutableList.of(3); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableList deserialized = deserialize(_kryo, serialized, ImmutableList.class); + assertEquals(deserialized, obj); + } + + @Test(enabled = true) + public void testRegular() { + final ImmutableList obj = ImmutableList.of(3, 4, 5, 6); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableList deserialized = deserialize(_kryo, serialized, ImmutableList.class); + assertEquals(deserialized, obj); + } + + @Test(enabled = true) + public void testSubList() { + final ImmutableList obj = ImmutableList.of(3, 4, 5, 6).subList(1, 3); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableList deserialized = deserialize(_kryo, serialized, ImmutableList.class); + assertEquals(deserialized, obj); + } + + @Test(enabled = true) + public void testReverse() { + final ImmutableList obj = ImmutableList.of(3, 4, 5).reverse(); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableList deserialized = deserialize(_kryo, serialized, ImmutableList.class); + assertEquals(deserialized, obj); + } + + @Test(enabled = true) + public void testStringAsImmutableList() { + final ImmutableList obj = Lists.charactersOf("KryoRocks"); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableList deserialized = deserialize(_kryo, serialized, ImmutableList.class); + assertEquals(deserialized, obj); + } + + @Test(enabled = true) + public void testValues() { + Table baseTable = HashBasedTable.create(); + baseTable.put(1, 2, 3); + baseTable.put(4, 5, 6); + Table table = ImmutableTable.copyOf(baseTable); + final ImmutableList obj = (ImmutableList) table.values(); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableList deserialized = deserialize(_kryo, serialized, ImmutableList.class); + assertEquals(deserialized, obj); + } + + // Kryo#copy tests + + @Test(enabled = true) + public void testCopyEmpty() { + final ImmutableList obj = ImmutableList.of(); + final ImmutableList copied = _kryo.copy(obj); + assertSame(copied, obj); + } + + @Test(enabled = true) + public void testCopySingleton() { + final ImmutableList obj = ImmutableList.of(1); + final ImmutableList copied = _kryo.copy(obj); + assertSame(copied, obj); + } + + @Test(enabled = true) + public void testCopyRegular() { + final ImmutableList obj = ImmutableList.of(1, 2, 3); + final ImmutableList copied = _kryo.copy(obj); + assertSame(copied, obj); + } + + @Test(enabled = true) + public void testCopySubList() { + final ImmutableList obj = ImmutableList.of(1, 2, 3, 4).subList(1, 3); + final ImmutableList copied = _kryo.copy(obj); + assertSame(copied, obj); + } + + @Test(enabled = true) + public void testCopyReverse() { + final ImmutableList obj = ImmutableList.of(1, 2, 3).reverse(); + final ImmutableList copied = _kryo.copy(obj); + assertSame(copied, obj); + } + + @Test(enabled = true) + public void testCopyStringAsImmutableList() { + final ImmutableList obj = Lists.charactersOf("KryoRocks"); + final ImmutableList copied = _kryo.copy(obj); + assertSame(copied, obj); + } + + @Test(enabled = true) + public void testCopyValues() { + Table baseTable = HashBasedTable.create(); + baseTable.put(1, 2, 3); + baseTable.put(4, 5, 6); + Table table = ImmutableTable.copyOf(baseTable); + final ImmutableList obj = (ImmutableList) table.values(); + final ImmutableList copied = _kryo.copy(obj); + assertSame(copied, obj); + } } diff --git a/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableMapSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableMapSerializerTest.java index 282d3d78..c37b019c 100644 --- a/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableMapSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableMapSerializerTest.java @@ -1,94 +1,113 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers.guava; -import com.esotericsoftware.kryo.Kryo; -import com.google.common.collect.ImmutableMap; +import static de.javakaffee.kryoserializers.KryoTest.deserialize; +import static de.javakaffee.kryoserializers.KryoTest.serialize; import static org.testng.Assert.*; +import java.util.EnumMap; + import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; -import java.util.EnumMap; - -import static de.javakaffee.kryoserializers.KryoTest.deserialize; -import static de.javakaffee.kryoserializers.KryoTest.serialize; +import com.esotericsoftware.kryo.Kryo; +import com.google.common.collect.ImmutableMap; /** * Created by pmarcos on 29/06/15. */ public class ImmutableMapSerializerTest { - private enum Planet { - MERCURY, VENUS, EARTH, MARS; - } - - private Kryo _kryo; - - @BeforeTest - public void setUp() throws Exception { - _kryo = new Kryo(); - - ImmutableMapSerializer.registerSerializers(_kryo); - } - - @Test - public void testEmpty() { - final ImmutableMap obj = ImmutableMap.of(); - final byte[] serialized = serialize(_kryo, obj); - final ImmutableMap deserialized = deserialize(_kryo, serialized, ImmutableMap.class); - assertTrue(deserialized.isEmpty()); - assertEquals(deserialized.size(), obj.size()); - } - - @Test - public void testSingleton() { - final ImmutableMap obj = ImmutableMap.of(3, "k"); - final byte[] serialized = serialize(_kryo, obj); - final ImmutableMap deserialized = deserialize(_kryo, serialized, ImmutableMap.class); - assertEquals(deserialized, obj); - } - - @Test - public void testRegular() { - final ImmutableMap obj = ImmutableMap.of(3, "k", 5, "r", 6, "y"); - final byte[] serialized = serialize(_kryo, obj); - final ImmutableMap deserialized = deserialize(_kryo, serialized, ImmutableMap.class); - assertEquals(deserialized, obj); - } - - @Test - public void testEnum() { - final EnumMap obj = new EnumMap(Planet.class); - for (Planet p : Planet.values()) { - obj.put(p, p.name()); - } - - final ImmutableMap immutableObj = ImmutableMap.copyOf(obj); - final byte[] serialized = serialize(_kryo, immutableObj); - final ImmutableMap deserialized = deserialize(_kryo, serialized, ImmutableMap.class); - assertEquals(deserialized, immutableObj); - } - - // Kryo#copy tests - - @Test - public void testCopyEmpty() { - final ImmutableMap obj = ImmutableMap.of(); - final ImmutableMap copied = _kryo.copy(obj); - assertSame(copied, obj); - } - - @Test - public void testCopySingleton() { - final ImmutableMap obj = ImmutableMap.of(1, 1); - final ImmutableMap copied = _kryo.copy(obj); - assertSame(copied, obj); - } - - @Test - public void testCopyRegular() { - final ImmutableMap obj = ImmutableMap.of(1, 2, 3, 4); - final ImmutableMap copied = _kryo.copy(obj); - assertSame(copied, obj); - } - -} \ No newline at end of file + private enum Planet { + MERCURY, + VENUS, + EARTH, + MARS; + } + + private Kryo _kryo; + + @BeforeTest + public void setUp() throws Exception { + _kryo = new Kryo(); + + ImmutableMapSerializer.registerSerializers(_kryo); + } + + @Test + public void testEmpty() { + final ImmutableMap obj = ImmutableMap.of(); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableMap deserialized = deserialize(_kryo, serialized, ImmutableMap.class); + assertTrue(deserialized.isEmpty()); + assertEquals(deserialized.size(), obj.size()); + } + + @Test + public void testSingleton() { + final ImmutableMap obj = ImmutableMap.of(3, "k"); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableMap deserialized = deserialize(_kryo, serialized, ImmutableMap.class); + assertEquals(deserialized, obj); + } + + @Test + public void testRegular() { + final ImmutableMap obj = ImmutableMap.of(3, "k", 5, "r", 6, "y"); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableMap deserialized = deserialize(_kryo, serialized, ImmutableMap.class); + assertEquals(deserialized, obj); + } + + @Test + public void testEnum() { + final EnumMap obj = new EnumMap(Planet.class); + for (Planet p : Planet.values()) { + obj.put(p, p.name()); + } + + final ImmutableMap immutableObj = ImmutableMap.copyOf(obj); + final byte[] serialized = serialize(_kryo, immutableObj); + final ImmutableMap deserialized = deserialize(_kryo, serialized, ImmutableMap.class); + assertEquals(deserialized, immutableObj); + } + + // Kryo#copy tests + + @Test + public void testCopyEmpty() { + final ImmutableMap obj = ImmutableMap.of(); + final ImmutableMap copied = _kryo.copy(obj); + assertSame(copied, obj); + } + + @Test + public void testCopySingleton() { + final ImmutableMap obj = ImmutableMap.of(1, 1); + final ImmutableMap copied = _kryo.copy(obj); + assertSame(copied, obj); + } + + @Test + public void testCopyRegular() { + final ImmutableMap obj = ImmutableMap.of(1, 2, 3, 4); + final ImmutableMap copied = _kryo.copy(obj); + assertSame(copied, obj); + } + +} diff --git a/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableMultimapSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableMultimapSerializerTest.java index 2612e94f..e0432e8e 100644 --- a/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableMultimapSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableMultimapSerializerTest.java @@ -1,208 +1,223 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers.guava; -import com.esotericsoftware.kryo.Kryo; -import com.google.common.collect.ImmutableListMultimap; -import com.google.common.collect.ImmutableMultimap; - +import static de.javakaffee.kryoserializers.KryoTest.deserialize; +import static de.javakaffee.kryoserializers.KryoTest.serialize; import static org.testng.Assert.*; -import com.google.common.collect.ImmutableSetMultimap; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; -import static de.javakaffee.kryoserializers.KryoTest.deserialize; -import static de.javakaffee.kryoserializers.KryoTest.serialize; +import com.esotericsoftware.kryo.Kryo; +import com.google.common.collect.ImmutableListMultimap; +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.ImmutableSetMultimap; public class ImmutableMultimapSerializerTest { - private Kryo _kryo; - - @BeforeTest - public void setUp() throws Exception { - _kryo = new Kryo(); - - ImmutableMultimapSerializer.registerSerializers(_kryo); - } - - @Test - public void testRegularEmpty() { - final ImmutableMultimap obj = ImmutableMultimap.of(); - final byte[] serialized = serialize(_kryo, obj); - final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableMultimap.class); - assertTrue(deserialized.isEmpty()); - assertEquals(deserialized, obj); - } - - @Test - public void testImmutableListMultimapEmpty() { - final ImmutableMultimap obj = ImmutableListMultimap.of(); - final byte[] serialized = serialize(_kryo, obj); - final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableListMultimap.class); - assertTrue(deserialized.isEmpty()); - assertEquals(deserialized, obj); - } - - @Test - public void testImmutableSetMultimapEmpty() { - final ImmutableMultimap obj = ImmutableSetMultimap.of(); - final byte[] serialized = serialize(_kryo, obj); - final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableSetMultimap.class); - assertTrue(deserialized.isEmpty()); - assertEquals(deserialized, obj); - } - - @Test - public void testRegularSingleton() { - final ImmutableMultimap obj = ImmutableMultimap.of(3, "k"); - final byte[] serialized = serialize(_kryo, obj); - final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableMultimap.class); - assertEquals(deserialized, obj); - } - - @Test - public void testImmutableListMultimapSingleton() { - final ImmutableMultimap obj = ImmutableListMultimap.of(3, "k"); - final byte[] serialized = serialize(_kryo, obj); - final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableListMultimap.class); - assertEquals(deserialized, obj); - } - - @Test - public void testImmutableSetMultimapSingleton() { - final ImmutableMultimap obj = ImmutableSetMultimap.of(3, "k"); - final byte[] serialized = serialize(_kryo, obj); - final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableSetMultimap.class); - assertEquals(deserialized.getClass(), obj.getClass()); - assertEquals(deserialized, obj); - } - - @Test - public void testRegular() { - final ImmutableMultimap obj = ImmutableMultimap.of(3, "k", 5, "r", 6, "y"); - final byte[] serialized = serialize(_kryo, obj); - final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableMultimap.class); - assertEquals(deserialized, obj); - } - - @Test - public void testImmutableListMultimap() { - final ImmutableMultimap obj = ImmutableListMultimap.of(3, "k", 5, "r", 6, "y"); - final byte[] serialized = serialize(_kryo, obj); - final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableListMultimap.class); - assertEquals(deserialized, obj); - } - - @Test - public void testImmutableSetMultimap() { - final ImmutableMultimap obj = ImmutableSetMultimap.of(3, "k", 5, "r", 6, "y"); - final byte[] serialized = serialize(_kryo, obj); - final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableSetMultimap.class); - assertEquals(deserialized.getClass(), obj.getClass()); - assertEquals(deserialized, obj); - } - - @Test - public void testRegularMultipleElementsPerKey() { - final ImmutableMultimap obj = ImmutableMultimap.of(3, "k", 3, "r", 4, "y", 4, "o"); - final byte[] serialized = serialize(_kryo, obj); - final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableMultimap.class); - assertEquals(deserialized, obj); - } - - @Test - public void testImmutableListMultimapMultipleElementsPerKey() { - final ImmutableMultimap obj = ImmutableListMultimap.of(3, "k", 3, "r", 4, "y", 4, "o"); - final byte[] serialized = serialize(_kryo, obj); - final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableListMultimap.class); - assertEquals(deserialized, obj); - } - - @Test - public void testImmutableSetMultimapMultipleElementsPerKey() { - final ImmutableMultimap obj = ImmutableSetMultimap.of(3, "k", 3, "r", 4, "y", 4, "o"); - final byte[] serialized = serialize(_kryo, obj); - final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableSetMultimap.class); - assertEquals(deserialized, obj); - } - - @Test - public void testImmutableMapSerializerAlreadyRegistered() { - ImmutableMapSerializer.registerSerializers(_kryo); - final ImmutableMultimap obj = ImmutableMultimap.of(); - final byte[] serialized = serialize(_kryo, obj); - final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableMultimap.class); - assertTrue(deserialized.isEmpty()); - assertEquals(deserialized, obj); - } - - @Test - public void testImmutableListSerializerAlreadyRegistered() { - ImmutableListSerializer.registerSerializers(_kryo); - final ImmutableMultimap obj = ImmutableListMultimap.of(); - final byte[] serialized = serialize(_kryo, obj); - final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableListMultimap.class); - assertTrue(deserialized.isEmpty()); - assertEquals(deserialized, obj); - } - - @Test - public void testImmutableSetSerializerAlreadyRegistered() { - ImmutableSetSerializer.registerSerializers(_kryo); - final ImmutableMultimap obj = ImmutableSetMultimap.of(); - final byte[] serialized = serialize(_kryo, obj); - final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableSetMultimap.class); - assertTrue(deserialized.isEmpty()); - assertEquals(deserialized, obj); - } - - // Kryo#copy tests - - @Test - public void testCopyEmpty() { - final ImmutableMultimap obj = ImmutableMultimap.of(); - final ImmutableMultimap copied = _kryo.copy(obj); - assertSame(copied, obj); - } - - @Test - public void testCopySingleton() { - final ImmutableMultimap obj = ImmutableMultimap.of(1, "k"); - final ImmutableMultimap copied = _kryo.copy(obj); - assertSame(copied, obj); - } - - @Test - public void testCopyRegular() { - final ImmutableMultimap obj = ImmutableMultimap.of(1, "k", 2, "r", 3, "y"); - final ImmutableMultimap copied = _kryo.copy(obj); - assertSame(copied, obj); - } - - @Test - public void testCopyImmutableListMultimap() { - final ImmutableMultimap obj = ImmutableListMultimap.of(1, "k", 2, "r", 3, "y"); - final ImmutableMultimap copied = _kryo.copy(obj); - assertSame(copied, obj); - } - - @Test - public void testCopyImmutableListMultimapEmpty() { - final ImmutableMultimap obj = ImmutableListMultimap.of(); - final ImmutableMultimap copied = _kryo.copy(obj); - assertSame(copied, obj); - } - - @Test - public void testCopyImmutableSetMultimap() { - final ImmutableMultimap obj = ImmutableSetMultimap.of(1, "k", 2, "r", 3, "y"); - final ImmutableMultimap copied = _kryo.copy(obj); - assertSame(copied, obj); - } - - @Test - public void testCopyImmutableSetMultimapEmpty() { - final ImmutableMultimap obj = ImmutableSetMultimap.of(); - final ImmutableMultimap copied = _kryo.copy(obj); - assertSame(copied, obj); - } -} \ No newline at end of file + private Kryo _kryo; + + @BeforeTest + public void setUp() throws Exception { + _kryo = new Kryo(); + + ImmutableMultimapSerializer.registerSerializers(_kryo); + } + + @Test + public void testRegularEmpty() { + final ImmutableMultimap obj = ImmutableMultimap.of(); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableMultimap.class); + assertTrue(deserialized.isEmpty()); + assertEquals(deserialized, obj); + } + + @Test + public void testImmutableListMultimapEmpty() { + final ImmutableMultimap obj = ImmutableListMultimap.of(); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableListMultimap.class); + assertTrue(deserialized.isEmpty()); + assertEquals(deserialized, obj); + } + + @Test + public void testImmutableSetMultimapEmpty() { + final ImmutableMultimap obj = ImmutableSetMultimap.of(); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableSetMultimap.class); + assertTrue(deserialized.isEmpty()); + assertEquals(deserialized, obj); + } + + @Test + public void testRegularSingleton() { + final ImmutableMultimap obj = ImmutableMultimap.of(3, "k"); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableMultimap.class); + assertEquals(deserialized, obj); + } + + @Test + public void testImmutableListMultimapSingleton() { + final ImmutableMultimap obj = ImmutableListMultimap.of(3, "k"); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableListMultimap.class); + assertEquals(deserialized, obj); + } + + @Test + public void testImmutableSetMultimapSingleton() { + final ImmutableMultimap obj = ImmutableSetMultimap.of(3, "k"); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableSetMultimap.class); + assertEquals(deserialized.getClass(), obj.getClass()); + assertEquals(deserialized, obj); + } + + @Test + public void testRegular() { + final ImmutableMultimap obj = ImmutableMultimap.of(3, "k", 5, "r", 6, "y"); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableMultimap.class); + assertEquals(deserialized, obj); + } + + @Test + public void testImmutableListMultimap() { + final ImmutableMultimap obj = ImmutableListMultimap.of(3, "k", 5, "r", 6, "y"); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableListMultimap.class); + assertEquals(deserialized, obj); + } + + @Test + public void testImmutableSetMultimap() { + final ImmutableMultimap obj = ImmutableSetMultimap.of(3, "k", 5, "r", 6, "y"); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableSetMultimap.class); + assertEquals(deserialized.getClass(), obj.getClass()); + assertEquals(deserialized, obj); + } + + @Test + public void testRegularMultipleElementsPerKey() { + final ImmutableMultimap obj = ImmutableMultimap.of(3, "k", 3, "r", 4, "y", 4, "o"); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableMultimap.class); + assertEquals(deserialized, obj); + } + + @Test + public void testImmutableListMultimapMultipleElementsPerKey() { + final ImmutableMultimap obj = ImmutableListMultimap.of(3, "k", 3, "r", 4, "y", 4, "o"); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableListMultimap.class); + assertEquals(deserialized, obj); + } + + @Test + public void testImmutableSetMultimapMultipleElementsPerKey() { + final ImmutableMultimap obj = ImmutableSetMultimap.of(3, "k", 3, "r", 4, "y", 4, "o"); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableSetMultimap.class); + assertEquals(deserialized, obj); + } + + @Test + public void testImmutableMapSerializerAlreadyRegistered() { + ImmutableMapSerializer.registerSerializers(_kryo); + final ImmutableMultimap obj = ImmutableMultimap.of(); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableMultimap.class); + assertTrue(deserialized.isEmpty()); + assertEquals(deserialized, obj); + } + + @Test + public void testImmutableListSerializerAlreadyRegistered() { + ImmutableListSerializer.registerSerializers(_kryo); + final ImmutableMultimap obj = ImmutableListMultimap.of(); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableListMultimap.class); + assertTrue(deserialized.isEmpty()); + assertEquals(deserialized, obj); + } + + @Test + public void testImmutableSetSerializerAlreadyRegistered() { + ImmutableSetSerializer.registerSerializers(_kryo); + final ImmutableMultimap obj = ImmutableSetMultimap.of(); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableSetMultimap.class); + assertTrue(deserialized.isEmpty()); + assertEquals(deserialized, obj); + } + + // Kryo#copy tests + + @Test + public void testCopyEmpty() { + final ImmutableMultimap obj = ImmutableMultimap.of(); + final ImmutableMultimap copied = _kryo.copy(obj); + assertSame(copied, obj); + } + + @Test + public void testCopySingleton() { + final ImmutableMultimap obj = ImmutableMultimap.of(1, "k"); + final ImmutableMultimap copied = _kryo.copy(obj); + assertSame(copied, obj); + } + + @Test + public void testCopyRegular() { + final ImmutableMultimap obj = ImmutableMultimap.of(1, "k", 2, "r", 3, "y"); + final ImmutableMultimap copied = _kryo.copy(obj); + assertSame(copied, obj); + } + + @Test + public void testCopyImmutableListMultimap() { + final ImmutableMultimap obj = ImmutableListMultimap.of(1, "k", 2, "r", 3, "y"); + final ImmutableMultimap copied = _kryo.copy(obj); + assertSame(copied, obj); + } + + @Test + public void testCopyImmutableListMultimapEmpty() { + final ImmutableMultimap obj = ImmutableListMultimap.of(); + final ImmutableMultimap copied = _kryo.copy(obj); + assertSame(copied, obj); + } + + @Test + public void testCopyImmutableSetMultimap() { + final ImmutableMultimap obj = ImmutableSetMultimap.of(1, "k", 2, "r", 3, "y"); + final ImmutableMultimap copied = _kryo.copy(obj); + assertSame(copied, obj); + } + + @Test + public void testCopyImmutableSetMultimapEmpty() { + final ImmutableMultimap obj = ImmutableSetMultimap.of(); + final ImmutableMultimap copied = _kryo.copy(obj); + assertSame(copied, obj); + } +} diff --git a/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableSetSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableSetSerializerTest.java index 07c23f0e..3aad9e6b 100644 --- a/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableSetSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableSetSerializerTest.java @@ -1,85 +1,99 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers.guava; -import com.esotericsoftware.kryo.Kryo; -import com.google.common.collect.*; +import static de.javakaffee.kryoserializers.KryoTest.deserialize; +import static de.javakaffee.kryoserializers.KryoTest.serialize; import static org.testng.Assert.*; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; -import static de.javakaffee.kryoserializers.KryoTest.deserialize; -import static de.javakaffee.kryoserializers.KryoTest.serialize; +import com.esotericsoftware.kryo.Kryo; +import com.google.common.collect.*; /** * Test for {@link ImmutableSetSerializer}. */ public class ImmutableSetSerializerTest { - private Kryo _kryo; - - @BeforeTest - public void setUp() throws Exception { - _kryo = new Kryo(); - - ImmutableSetSerializer.registerSerializers(_kryo); - } - - @Test - public void testEmpty() { - final ImmutableSet obj = ImmutableSet.of(); - final byte[] serialized = serialize( _kryo, obj ); - final ImmutableSet deserialized = deserialize(_kryo, serialized, ImmutableSet.class); - assertTrue(deserialized.isEmpty()); - assertEquals(deserialized.size(), obj.size()); - } - - @Test - public void testSingleton() { - final ImmutableSet obj = ImmutableSet.of(3); - final byte[] serialized = serialize( _kryo, obj ); - final ImmutableSet deserialized = deserialize(_kryo, serialized, ImmutableSet.class); - assertEquals(deserialized, obj); - } - - @Test - public void testRegular() { - final ImmutableSet obj = ImmutableSet.of(3, 4, 5, 6); - final byte[] serialized = serialize( _kryo, obj ); - final ImmutableSet deserialized = deserialize(_kryo, serialized, ImmutableSet.class); - assertEquals(deserialized, obj); - } - - @Test - public void testStringAsImmutableSet() { - final ImmutableSet obj = ImmutableSet.of("K","r", "y", "o"); - final byte[] serialized = serialize(_kryo, obj); - final ImmutableSet deserialized = deserialize(_kryo, serialized, ImmutableSet.class); - assertEquals(deserialized, obj); - } - - // Kryo#copy tests - - @Test - public void testCopyEmpty() { - final ImmutableSet obj = ImmutableSet.of(); - final ImmutableSet copied = _kryo.copy(obj); - assertSame(copied, obj); - } - - @Test - public void testCopySingleton() { - final ImmutableSet obj = ImmutableSet.of(1); - final ImmutableSet copied = _kryo.copy(obj); - assertSame(copied, obj); - } - - @Test - public void testCopyRegular() { - final ImmutableSet obj = ImmutableSet.of(1, 2, 3); - final ImmutableSet copied = _kryo.copy(obj); - assertSame(copied, obj); - } - - - -} \ No newline at end of file + private Kryo _kryo; + + @BeforeTest + public void setUp() throws Exception { + _kryo = new Kryo(); + + ImmutableSetSerializer.registerSerializers(_kryo); + } + + @Test + public void testEmpty() { + final ImmutableSet obj = ImmutableSet.of(); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableSet deserialized = deserialize(_kryo, serialized, ImmutableSet.class); + assertTrue(deserialized.isEmpty()); + assertEquals(deserialized.size(), obj.size()); + } + + @Test + public void testSingleton() { + final ImmutableSet obj = ImmutableSet.of(3); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableSet deserialized = deserialize(_kryo, serialized, ImmutableSet.class); + assertEquals(deserialized, obj); + } + + @Test + public void testRegular() { + final ImmutableSet obj = ImmutableSet.of(3, 4, 5, 6); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableSet deserialized = deserialize(_kryo, serialized, ImmutableSet.class); + assertEquals(deserialized, obj); + } + + @Test + public void testStringAsImmutableSet() { + final ImmutableSet obj = ImmutableSet.of("K", "r", "y", "o"); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableSet deserialized = deserialize(_kryo, serialized, ImmutableSet.class); + assertEquals(deserialized, obj); + } + + // Kryo#copy tests + + @Test + public void testCopyEmpty() { + final ImmutableSet obj = ImmutableSet.of(); + final ImmutableSet copied = _kryo.copy(obj); + assertSame(copied, obj); + } + + @Test + public void testCopySingleton() { + final ImmutableSet obj = ImmutableSet.of(1); + final ImmutableSet copied = _kryo.copy(obj); + assertSame(copied, obj); + } + + @Test + public void testCopyRegular() { + final ImmutableSet obj = ImmutableSet.of(1, 2, 3); + final ImmutableSet copied = _kryo.copy(obj); + assertSame(copied, obj); + } + +} diff --git a/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableSortedMapSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableSortedMapSerializerTest.java index c80c1347..a1df99ca 100644 --- a/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableSortedMapSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableSortedMapSerializerTest.java @@ -1,101 +1,119 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers.guava; -import com.esotericsoftware.kryo.Kryo; -import com.google.common.collect.ImmutableSortedMap; - -import org.testng.annotations.BeforeTest; -import org.testng.annotations.Test; - -import java.util.EnumMap; - import static de.javakaffee.kryoserializers.KryoTest.deserialize; import static de.javakaffee.kryoserializers.KryoTest.serialize; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertSame; import static org.testng.Assert.assertTrue; +import java.util.EnumMap; + +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; + +import com.esotericsoftware.kryo.Kryo; +import com.google.common.collect.ImmutableSortedMap; + public class ImmutableSortedMapSerializerTest { - private enum Planet { - MERCURY, VENUS, EARTH, MARS; - } - - private Kryo _kryo; - - @BeforeTest - public void setUp() throws Exception { - _kryo = new Kryo(); - ImmutableSortedMapSerializer.registerSerializers(_kryo); - } - - @Test - public void testEmpty() { - final ImmutableSortedMap obj = ImmutableSortedMap.of(); - final byte[] serialized = serialize(_kryo, obj); - final ImmutableSortedMap deserialized = deserialize(_kryo, serialized, ImmutableSortedMap.class); - assertTrue(deserialized.isEmpty()); - assertEquals(deserialized.size(), obj.size()); - } - - @Test - public void testSingleton() { - final ImmutableSortedMap obj = ImmutableSortedMap.of(3, "k"); - final byte[] serialized = serialize(_kryo, obj); - final ImmutableSortedMap deserialized = deserialize(_kryo, serialized, ImmutableSortedMap.class); - assertEquals(deserialized, obj); - } - - @Test - public void testRegular() { - final ImmutableSortedMap obj = ImmutableSortedMap.of(5, "r", 3, "k", 6, "y"); - final byte[] serialized = serialize(_kryo, obj); - final ImmutableSortedMap deserialized = deserialize(_kryo, serialized, ImmutableSortedMap.class); - assertEquals(deserialized, obj); - } - - - @Test - public void testDescending() { - final ImmutableSortedMap obj = ImmutableSortedMap.of(1, "a", 5, "e", 3, "c").descendingMap(); - final byte[] serialized = serialize(_kryo, obj); - final ImmutableSortedMap deserialized = deserialize(_kryo, serialized, ImmutableSortedMap.class); - assertEquals(deserialized, obj); - } - - @Test - public void testEnum() { - final EnumMap obj = new EnumMap(Planet.class); - for (Planet p : Planet.values()) { - obj.put(p, p.name()); - } - - final ImmutableSortedMap immutableObj = ImmutableSortedMap.copyOf(obj); - final byte[] serialized = serialize(_kryo, immutableObj); - final ImmutableSortedMap deserialized = deserialize(_kryo, serialized, ImmutableSortedMap.class); - assertEquals(deserialized, immutableObj); - } - - // Kryo#copy tests - - @Test - public void testCopyEmpty() { - final ImmutableSortedMap obj = ImmutableSortedMap.of(); - final ImmutableSortedMap copied = _kryo.copy(obj); - assertSame(copied, obj); - } - - @Test - public void testCopySingleton() { - final ImmutableSortedMap obj = ImmutableSortedMap.of(1, 1); - final ImmutableSortedMap copied = _kryo.copy(obj); - assertSame(copied, obj); - } - - @Test - public void testCopyRegular() { - final ImmutableSortedMap obj = ImmutableSortedMap.of(1, 2, 3, 4); - final ImmutableSortedMap copied = _kryo.copy(obj); - assertSame(copied, obj); - } - -} \ No newline at end of file + private enum Planet { + MERCURY, + VENUS, + EARTH, + MARS; + } + + private Kryo _kryo; + + @BeforeTest + public void setUp() throws Exception { + _kryo = new Kryo(); + ImmutableSortedMapSerializer.registerSerializers(_kryo); + } + + @Test + public void testEmpty() { + final ImmutableSortedMap obj = ImmutableSortedMap.of(); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableSortedMap deserialized = deserialize(_kryo, serialized, ImmutableSortedMap.class); + assertTrue(deserialized.isEmpty()); + assertEquals(deserialized.size(), obj.size()); + } + + @Test + public void testSingleton() { + final ImmutableSortedMap obj = ImmutableSortedMap.of(3, "k"); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableSortedMap deserialized = deserialize(_kryo, serialized, ImmutableSortedMap.class); + assertEquals(deserialized, obj); + } + + @Test + public void testRegular() { + final ImmutableSortedMap obj = ImmutableSortedMap.of(5, "r", 3, "k", 6, "y"); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableSortedMap deserialized = deserialize(_kryo, serialized, ImmutableSortedMap.class); + assertEquals(deserialized, obj); + } + + @Test + public void testDescending() { + final ImmutableSortedMap obj = ImmutableSortedMap.of(1, "a", 5, "e", 3, "c").descendingMap(); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableSortedMap deserialized = deserialize(_kryo, serialized, ImmutableSortedMap.class); + assertEquals(deserialized, obj); + } + + @Test + public void testEnum() { + final EnumMap obj = new EnumMap(Planet.class); + for (Planet p : Planet.values()) { + obj.put(p, p.name()); + } + + final ImmutableSortedMap immutableObj = ImmutableSortedMap.copyOf(obj); + final byte[] serialized = serialize(_kryo, immutableObj); + final ImmutableSortedMap deserialized = deserialize(_kryo, serialized, ImmutableSortedMap.class); + assertEquals(deserialized, immutableObj); + } + + // Kryo#copy tests + + @Test + public void testCopyEmpty() { + final ImmutableSortedMap obj = ImmutableSortedMap.of(); + final ImmutableSortedMap copied = _kryo.copy(obj); + assertSame(copied, obj); + } + + @Test + public void testCopySingleton() { + final ImmutableSortedMap obj = ImmutableSortedMap.of(1, 1); + final ImmutableSortedMap copied = _kryo.copy(obj); + assertSame(copied, obj); + } + + @Test + public void testCopyRegular() { + final ImmutableSortedMap obj = ImmutableSortedMap.of(1, 2, 3, 4); + final ImmutableSortedMap copied = _kryo.copy(obj); + assertSame(copied, obj); + } + +} diff --git a/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableSortedSetSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableSortedSetSerializerTest.java index 99c6cd29..0ec7b555 100644 --- a/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableSortedSetSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableSortedSetSerializerTest.java @@ -1,3 +1,19 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers.guava; import static de.javakaffee.kryoserializers.KryoTest.deserialize; @@ -6,93 +22,94 @@ import static org.testng.Assert.assertSame; import static org.testng.Assert.assertTrue; -import com.esotericsoftware.kryo.Kryo; -import com.google.common.collect.ImmutableSortedSet; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; +import com.esotericsoftware.kryo.Kryo; +import com.google.common.collect.ImmutableSortedSet; + /** * Test for {@link ImmutableSortedSetSerializer}. */ public class ImmutableSortedSetSerializerTest { - private Kryo _kryo; - - @BeforeTest - public void setUp() throws Exception { - _kryo = new Kryo(); - - ImmutableSortedSetSerializer.registerSerializers(_kryo); - } - - @Test - public void testEmpty() { - final ImmutableSortedSet obj = ImmutableSortedSet.of(); - final byte[] serialized = serialize( _kryo, obj ); - final ImmutableSortedSet deserialized = deserialize(_kryo, serialized, ImmutableSortedSet.class); - assertTrue(deserialized.isEmpty()); - assertEquals(deserialized.size(), obj.size()); - } - - @Test - public void testSingleton() { - final ImmutableSortedSet obj = ImmutableSortedSet.of(3); - final byte[] serialized = serialize( _kryo, obj ); - final ImmutableSortedSet deserialized = deserialize(_kryo, serialized, ImmutableSortedSet.class); - assertEquals(deserialized, obj); - } - - @Test - public void testDescending() { - final ImmutableSortedSet obj = ImmutableSortedSet.of(3, 4, 5, 6).descendingSet (); - final byte[] serialized = serialize( _kryo, obj ); - final ImmutableSortedSet deserialized = deserialize(_kryo, serialized, ImmutableSortedSet.class); - assertEquals(deserialized, obj); - } - - @Test - public void testRegular() { - final ImmutableSortedSet obj = ImmutableSortedSet.of(3, 4, 5, 6); - final byte[] serialized = serialize( _kryo, obj ); - final ImmutableSortedSet deserialized = deserialize(_kryo, serialized, ImmutableSortedSet.class); - assertEquals(deserialized, obj); - } - - @Test - public void testStringAsImmutableSortedSet() { - final ImmutableSortedSet obj = ImmutableSortedSet.of("K","r", "y", "o"); - final byte[] serialized = serialize(_kryo, obj); - final ImmutableSortedSet deserialized = deserialize(_kryo, serialized, ImmutableSortedSet.class); - assertEquals(deserialized, obj); - } - - // Kryo#copy tests - - @Test - public void testCopyEmpty() { - final ImmutableSortedSet obj = ImmutableSortedSet.of(); - final ImmutableSortedSet copied = _kryo.copy(obj); - assertSame(copied, obj); - } - - @Test - public void testCopySingleton() { - final ImmutableSortedSet obj = ImmutableSortedSet.of(1); - final ImmutableSortedSet copied = _kryo.copy(obj); - assertSame(copied, obj); - } - - @Test - public void testCopyDescending() { - final ImmutableSortedSet obj = ImmutableSortedSet.of(1, 2, 3).descendingSet (); - final ImmutableSortedSet copied = _kryo.copy(obj); - assertSame(copied, obj); - } - - @Test - public void testCopyRegular() { - final ImmutableSortedSet obj = ImmutableSortedSet.of(1, 2, 3); - final ImmutableSortedSet copied = _kryo.copy(obj); - assertSame(copied, obj); - } -} \ No newline at end of file + private Kryo _kryo; + + @BeforeTest + public void setUp() throws Exception { + _kryo = new Kryo(); + + ImmutableSortedSetSerializer.registerSerializers(_kryo); + } + + @Test + public void testEmpty() { + final ImmutableSortedSet obj = ImmutableSortedSet.of(); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableSortedSet deserialized = deserialize(_kryo, serialized, ImmutableSortedSet.class); + assertTrue(deserialized.isEmpty()); + assertEquals(deserialized.size(), obj.size()); + } + + @Test + public void testSingleton() { + final ImmutableSortedSet obj = ImmutableSortedSet.of(3); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableSortedSet deserialized = deserialize(_kryo, serialized, ImmutableSortedSet.class); + assertEquals(deserialized, obj); + } + + @Test + public void testDescending() { + final ImmutableSortedSet obj = ImmutableSortedSet.of(3, 4, 5, 6).descendingSet(); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableSortedSet deserialized = deserialize(_kryo, serialized, ImmutableSortedSet.class); + assertEquals(deserialized, obj); + } + + @Test + public void testRegular() { + final ImmutableSortedSet obj = ImmutableSortedSet.of(3, 4, 5, 6); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableSortedSet deserialized = deserialize(_kryo, serialized, ImmutableSortedSet.class); + assertEquals(deserialized, obj); + } + + @Test + public void testStringAsImmutableSortedSet() { + final ImmutableSortedSet obj = ImmutableSortedSet.of("K", "r", "y", "o"); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableSortedSet deserialized = deserialize(_kryo, serialized, ImmutableSortedSet.class); + assertEquals(deserialized, obj); + } + + // Kryo#copy tests + + @Test + public void testCopyEmpty() { + final ImmutableSortedSet obj = ImmutableSortedSet.of(); + final ImmutableSortedSet copied = _kryo.copy(obj); + assertSame(copied, obj); + } + + @Test + public void testCopySingleton() { + final ImmutableSortedSet obj = ImmutableSortedSet.of(1); + final ImmutableSortedSet copied = _kryo.copy(obj); + assertSame(copied, obj); + } + + @Test + public void testCopyDescending() { + final ImmutableSortedSet obj = ImmutableSortedSet.of(1, 2, 3).descendingSet(); + final ImmutableSortedSet copied = _kryo.copy(obj); + assertSame(copied, obj); + } + + @Test + public void testCopyRegular() { + final ImmutableSortedSet obj = ImmutableSortedSet.of(1, 2, 3); + final ImmutableSortedSet copied = _kryo.copy(obj); + assertSame(copied, obj); + } +} diff --git a/src/test/java/de/javakaffee/kryoserializers/guava/LinkedHashMultimapSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/guava/LinkedHashMultimapSerializerTest.java index a8a4ceff..12f82509 100644 --- a/src/test/java/de/javakaffee/kryoserializers/guava/LinkedHashMultimapSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/guava/LinkedHashMultimapSerializerTest.java @@ -1,30 +1,45 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers.guava; -import de.javakaffee.kryoserializers.KryoTest; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; import com.esotericsoftware.kryo.Kryo; - import com.google.common.collect.LinkedHashMultimap; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.Test; +import de.javakaffee.kryoserializers.KryoTest; public class LinkedHashMultimapSerializerTest extends MultimapSerializerTestBase { - private Kryo _kryo; - - @BeforeClass - public void initializeKyroWithSerializer() { - _kryo = new Kryo(); - LinkedHashMultimapSerializer.registerSerializers(_kryo); - } - - @Test(dataProvider = "Google Guava multimaps") - public void testMultimap(Object[] contents) { - final LinkedHashMultimap multimap = LinkedHashMultimap.create(); - populateMultimap(multimap, contents); - final byte[] serialized = KryoTest.serialize(_kryo, multimap); - final LinkedHashMultimap deserialized = KryoTest.deserialize(_kryo, serialized, LinkedHashMultimap.class); - assertEqualMultimaps(true, true, deserialized, multimap); - } + private Kryo _kryo; + + @BeforeClass + public void initializeKyroWithSerializer() { + _kryo = new Kryo(); + LinkedHashMultimapSerializer.registerSerializers(_kryo); + } + + @Test(dataProvider = "Google Guava multimaps") + public void testMultimap(Object[] contents) { + final LinkedHashMultimap multimap = LinkedHashMultimap.create(); + populateMultimap(multimap, contents); + final byte[] serialized = KryoTest.serialize(_kryo, multimap); + final LinkedHashMultimap deserialized = KryoTest.deserialize(_kryo, serialized, LinkedHashMultimap.class); + assertEqualMultimaps(true, true, deserialized, multimap); + } } diff --git a/src/test/java/de/javakaffee/kryoserializers/guava/LinkedListMultimapSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/guava/LinkedListMultimapSerializerTest.java index 129d4a03..7ad92f2d 100644 --- a/src/test/java/de/javakaffee/kryoserializers/guava/LinkedListMultimapSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/guava/LinkedListMultimapSerializerTest.java @@ -1,30 +1,45 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers.guava; -import de.javakaffee.kryoserializers.KryoTest; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; import com.esotericsoftware.kryo.Kryo; - import com.google.common.collect.LinkedListMultimap; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.Test; +import de.javakaffee.kryoserializers.KryoTest; public class LinkedListMultimapSerializerTest extends MultimapSerializerTestBase { - private Kryo _kryo; - - @BeforeClass - public void initializeKyroWithSerializer() { - _kryo = new Kryo(); - LinkedListMultimapSerializer.registerSerializers(_kryo); - } - - @Test(dataProvider = "Google Guava multimaps") - public void testMultimap(Object[] contents) { - final LinkedListMultimap multimap = LinkedListMultimap.create(); - populateMultimap(multimap, contents); - final byte[] serialized = KryoTest.serialize(_kryo, multimap); - final LinkedListMultimap deserialized = KryoTest.deserialize(_kryo, serialized, LinkedListMultimap.class); - assertEqualMultimaps(true, true, deserialized, multimap); - } + private Kryo _kryo; + + @BeforeClass + public void initializeKyroWithSerializer() { + _kryo = new Kryo(); + LinkedListMultimapSerializer.registerSerializers(_kryo); + } + + @Test(dataProvider = "Google Guava multimaps") + public void testMultimap(Object[] contents) { + final LinkedListMultimap multimap = LinkedListMultimap.create(); + populateMultimap(multimap, contents); + final byte[] serialized = KryoTest.serialize(_kryo, multimap); + final LinkedListMultimap deserialized = KryoTest.deserialize(_kryo, serialized, LinkedListMultimap.class); + assertEqualMultimaps(true, true, deserialized, multimap); + } } diff --git a/src/test/java/de/javakaffee/kryoserializers/guava/MultimapSerializerTestBase.java b/src/test/java/de/javakaffee/kryoserializers/guava/MultimapSerializerTestBase.java index 1371427d..7681c050 100644 --- a/src/test/java/de/javakaffee/kryoserializers/guava/MultimapSerializerTestBase.java +++ b/src/test/java/de/javakaffee/kryoserializers/guava/MultimapSerializerTestBase.java @@ -1,70 +1,87 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers.guava; -import com.google.common.collect.Multimap; import java.util.ArrayList; import java.util.List; import org.testng.Assert; import org.testng.annotations.DataProvider; +import com.google.common.collect.Multimap; + public abstract class MultimapSerializerTestBase { - protected void populateMultimap(Multimap multimap, Object[] contents) { - for (int index = 0; index < contents.length;) { - multimap.put((K) contents[index++], (V) contents[index++]); - } - } + protected void populateMultimap(Multimap multimap, Object[] contents) { + for (int index = 0; index < contents.length;) { + multimap.put((K) contents[index++], (V) contents[index++]); + } + } - protected void assertEqualMultimaps(boolean orderedKeys, boolean orderedValues, - Multimap actual, Multimap expected) { - if (orderedKeys) { - Assert.assertEquals(actual.keySet(), expected.keySet()); - } else { - Assert.assertEqualsNoOrder(actual.keySet().toArray(), expected.keySet().toArray()); - } - for (final K key : expected.keySet()) { - if (orderedValues) { - Assert.assertEquals(actual.get(key), expected.get(key)); - } else { - Assert.assertEqualsNoOrder(actual.get(key).toArray(), expected.get(key).toArray()); - } - } - } + protected void assertEqualMultimaps(boolean orderedKeys, boolean orderedValues, + Multimap actual, Multimap expected) { + if (orderedKeys) { + Assert.assertEquals(actual.keySet(), expected.keySet()); + } else { + Assert.assertEqualsNoOrder(actual.keySet().toArray(), expected.keySet().toArray()); + } + for (final K key : expected.keySet()) { + if (orderedValues) { + Assert.assertEquals(actual.get(key), expected.get(key)); + } else { + Assert.assertEqualsNoOrder(actual.get(key).toArray(), expected.get(key).toArray()); + } + } + } - @DataProvider(name = "Google Guava multimaps") - public Object[][][] getMultimaps() { - final Object[][] multimaps = new Object[][]{new Object[]{}, - new Object[]{"foo", "bar"}, - new Object[]{"foo", null}, - new Object[]{null, "bar"}, - new Object[]{null, null}, - new Object[]{"new", Thread.State.NEW, "run", Thread.State.RUNNABLE}, - new Object[]{1.0, "foo", null, "bar", 1.0, null, null, "baz", 1.0, "wibble"}, - new Object[]{'a', 1, 'b', 2, 'c', 3, 'a', 4, 'b', 5}, - new Object[]{'a', 1, 'b', 2, 'c', 3, 'a', 1, 'b', 2}}; - final Object[][][] toProvide = new Object[multimaps.length][][]; - int index = 0; - for (final Object[] multimap : multimaps) { - toProvide[index++] = new Object[][]{multimap}; - } - return toProvide; - } + @DataProvider(name = "Google Guava multimaps") + public Object[][][] getMultimaps() { + final Object[][] multimaps = new Object[][]{new Object[]{}, + new Object[]{"foo", "bar"}, + new Object[]{"foo", null}, + new Object[]{null, "bar"}, + new Object[]{null, null}, + new Object[]{"new", Thread.State.NEW, "run", Thread.State.RUNNABLE}, + new Object[]{1.0, "foo", null, "bar", 1.0, null, null, "baz", 1.0, "wibble"}, + new Object[]{'a', 1, 'b', 2, 'c', 3, 'a', 4, 'b', 5}, + new Object[]{'a', 1, 'b', 2, 'c', 3, 'a', 1, 'b', 2}}; + final Object[][][] toProvide = new Object[multimaps.length][][]; + int index = 0; + for (final Object[] multimap : multimaps) { + toProvide[index++] = new Object[][]{multimap}; + } + return toProvide; + } - @DataProvider(name = "Google Guava multimaps (no nulls)") - public Object[][][] getMultimapsNoNulls() { - final List multimaps = new ArrayList(); - for (final Object[][] multimap : getMultimaps()) { - boolean isNull = false; - for (final Object element : multimap[0]) { - if (element == null) { - isNull = true; - break; - } - } - if (!isNull) { - multimaps.add(multimap); - } - } - return multimaps.toArray(new Object[multimaps.size()][][]); - } + @DataProvider(name = "Google Guava multimaps (no nulls)") + public Object[][][] getMultimapsNoNulls() { + final List multimaps = new ArrayList(); + for (final Object[][] multimap : getMultimaps()) { + boolean isNull = false; + for (final Object element : multimap[0]) { + if (element == null) { + isNull = true; + break; + } + } + if (!isNull) { + multimaps.add(multimap); + } + } + return multimaps.toArray(new Object[multimaps.size()][][]); + } } diff --git a/src/test/java/de/javakaffee/kryoserializers/guava/ReverseListSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/guava/ReverseListSerializerTest.java index bc367d19..8fbb4b8a 100644 --- a/src/test/java/de/javakaffee/kryoserializers/guava/ReverseListSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/guava/ReverseListSerializerTest.java @@ -1,123 +1,137 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers.guava; -import com.google.common.collect.Lists; - -import com.esotericsoftware.kryo.Kryo; - -import org.testng.annotations.BeforeTest; -import org.testng.annotations.Test; +import static de.javakaffee.kryoserializers.KryoTest.deserialize; +import static de.javakaffee.kryoserializers.KryoTest.serialize; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; import java.util.Arrays; import java.util.Collections; import java.util.List; -import static de.javakaffee.kryoserializers.KryoTest.deserialize; -import static de.javakaffee.kryoserializers.KryoTest.serialize; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertTrue; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; +import com.esotericsoftware.kryo.Kryo; +import com.google.common.collect.Lists; /** * Test for {@link ReverseListSerializer}. */ public class ReverseListSerializerTest { - private Kryo _kryo; - - @BeforeTest - public void setUp() throws Exception { - _kryo = new Kryo(); - - ReverseListSerializer.registerSerializers(_kryo); - } - - @Test( enabled = true ) - public void testEmptyReverseList() { - testEmpty(Lists.reverse(Lists.newLinkedList())); - } - - @Test( enabled = true ) - public void testEmptyRandomAccessReverseList() { - testEmpty(Lists.reverse(Lists.newArrayList())); - } - - private void testEmpty(final List reverseList) { - final byte[] serialized = serialize( _kryo, reverseList ); - final List deserialized = deserialize(_kryo, serialized, reverseList.getClass()); - assertEquals(deserialized.getClass(), reverseList.getClass()); - assertTrue(deserialized.isEmpty()); - assertEquals(deserialized.size(), reverseList.size()); - } - - @Test( enabled = true ) - public void testSingletonReverseList() { - testSingleton(Lists.reverse(Lists.newLinkedList(Collections.singleton(3)))); - } - - @Test( enabled = true ) - public void testSingletonRandomAccessReverseList() { - testSingleton(Lists.reverse(Lists.newArrayList(Collections.singleton(3)))); - } - - private void testSingleton(final List reverseList) { - final byte[] serialized = serialize( _kryo, reverseList ); - final List deserialized = deserialize(_kryo, serialized, reverseList.getClass()); - assertEquals(deserialized.getClass(), reverseList.getClass()); - assertEquals(deserialized, reverseList); - } - - @Test( enabled = true ) - public void testRegularReverseList() { - testRegular(Lists.reverse(Lists.newLinkedList(Arrays.asList(3, 4, 5, 6)))); - } - - @Test( enabled = true ) - public void testRegularRandomAccessReverseList() { - testRegular(Lists.reverse(Lists.newArrayList(3, 4, 5, 6))); - } - - private void testRegular(final List reverseList) { - final byte[] serialized = serialize( _kryo, reverseList ); - final List deserialized = deserialize(_kryo, serialized, reverseList.getClass()); - assertEquals(deserialized.getClass(), reverseList.getClass()); - assertEquals(deserialized, reverseList); - } - - // Kryo#copy tests - - @Test( enabled = true ) - public void testCopyEmptyReverseList() { - testCopy(Lists.reverse(Lists.newLinkedList())); - } - - @Test( enabled = true ) - public void testCopyEmptyRandomAccessReverseList() { - testCopy(Lists.reverse(Lists.newArrayList())); - } - - @Test( enabled = true ) - public void testCopySingletonReverseList() { - testCopy(Lists.reverse(Lists.newLinkedList(Collections.singleton(3)))); - } - - @Test( enabled = true ) - public void testCopySingletonRandomAccessReverseList() { - testCopy(Lists.reverse(Lists.newArrayList(Collections.singleton(3)))); - } - - @Test( enabled = true ) - public void testCopyRegularReverseList() { - testCopy(Lists.reverse(Lists.newLinkedList(Arrays.asList(3, 4, 5, 6)))); - } - - @Test( enabled = true ) - public void testCopyRegularRandomAccessReverseList() { - testCopy(Lists.reverse(Lists.newArrayList(3, 4, 5, 6))); - } - - private void testCopy(List obj) { - final List copied = _kryo.copy(obj); - assertEquals(copied.getClass(), obj.getClass()); - assertEquals(copied, obj); - } + private Kryo _kryo; + + @BeforeTest + public void setUp() throws Exception { + _kryo = new Kryo(); + + ReverseListSerializer.registerSerializers(_kryo); + } + + @Test(enabled = true) + public void testEmptyReverseList() { + testEmpty(Lists.reverse(Lists.newLinkedList())); + } + + @Test(enabled = true) + public void testEmptyRandomAccessReverseList() { + testEmpty(Lists.reverse(Lists.newArrayList())); + } + + private void testEmpty(final List reverseList) { + final byte[] serialized = serialize(_kryo, reverseList); + final List deserialized = deserialize(_kryo, serialized, reverseList.getClass()); + assertEquals(deserialized.getClass(), reverseList.getClass()); + assertTrue(deserialized.isEmpty()); + assertEquals(deserialized.size(), reverseList.size()); + } + + @Test(enabled = true) + public void testSingletonReverseList() { + testSingleton(Lists.reverse(Lists.newLinkedList(Collections.singleton(3)))); + } + + @Test(enabled = true) + public void testSingletonRandomAccessReverseList() { + testSingleton(Lists.reverse(Lists.newArrayList(Collections.singleton(3)))); + } + + private void testSingleton(final List reverseList) { + final byte[] serialized = serialize(_kryo, reverseList); + final List deserialized = deserialize(_kryo, serialized, reverseList.getClass()); + assertEquals(deserialized.getClass(), reverseList.getClass()); + assertEquals(deserialized, reverseList); + } + + @Test(enabled = true) + public void testRegularReverseList() { + testRegular(Lists.reverse(Lists.newLinkedList(Arrays.asList(3, 4, 5, 6)))); + } + + @Test(enabled = true) + public void testRegularRandomAccessReverseList() { + testRegular(Lists.reverse(Lists.newArrayList(3, 4, 5, 6))); + } + + private void testRegular(final List reverseList) { + final byte[] serialized = serialize(_kryo, reverseList); + final List deserialized = deserialize(_kryo, serialized, reverseList.getClass()); + assertEquals(deserialized.getClass(), reverseList.getClass()); + assertEquals(deserialized, reverseList); + } + + // Kryo#copy tests + + @Test(enabled = true) + public void testCopyEmptyReverseList() { + testCopy(Lists.reverse(Lists.newLinkedList())); + } + + @Test(enabled = true) + public void testCopyEmptyRandomAccessReverseList() { + testCopy(Lists.reverse(Lists.newArrayList())); + } + + @Test(enabled = true) + public void testCopySingletonReverseList() { + testCopy(Lists.reverse(Lists.newLinkedList(Collections.singleton(3)))); + } + + @Test(enabled = true) + public void testCopySingletonRandomAccessReverseList() { + testCopy(Lists.reverse(Lists.newArrayList(Collections.singleton(3)))); + } + + @Test(enabled = true) + public void testCopyRegularReverseList() { + testCopy(Lists.reverse(Lists.newLinkedList(Arrays.asList(3, 4, 5, 6)))); + } + + @Test(enabled = true) + public void testCopyRegularRandomAccessReverseList() { + testCopy(Lists.reverse(Lists.newArrayList(3, 4, 5, 6))); + } + + private void testCopy(List obj) { + final List copied = _kryo.copy(obj); + assertEquals(copied.getClass(), obj.getClass()); + assertEquals(copied, obj); + } } diff --git a/src/test/java/de/javakaffee/kryoserializers/guava/TreeMultimapSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/guava/TreeMultimapSerializerTest.java index b0b81534..b4286ca2 100644 --- a/src/test/java/de/javakaffee/kryoserializers/guava/TreeMultimapSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/guava/TreeMultimapSerializerTest.java @@ -1,30 +1,45 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers.guava; -import de.javakaffee.kryoserializers.KryoTest; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; import com.esotericsoftware.kryo.Kryo; - import com.google.common.collect.TreeMultimap; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.Test; +import de.javakaffee.kryoserializers.KryoTest; public class TreeMultimapSerializerTest extends MultimapSerializerTestBase { - private Kryo _kryo; - - @BeforeClass - public void initializeKyroWithSerializer() { - _kryo = new Kryo(); - TreeMultimapSerializer.registerSerializers(_kryo); - } - - @Test(dataProvider = "Google Guava multimaps (no nulls)") - public void testMultimap(Object[] contents) { - final TreeMultimap multimap = TreeMultimap.create(); - populateMultimap(multimap, contents); - final byte[] serialized = KryoTest.serialize(_kryo, multimap); - final TreeMultimap deserialized = KryoTest.deserialize(_kryo, serialized, TreeMultimap.class); - assertEqualMultimaps(true, true, deserialized, multimap); - } + private Kryo _kryo; + + @BeforeClass + public void initializeKyroWithSerializer() { + _kryo = new Kryo(); + TreeMultimapSerializer.registerSerializers(_kryo); + } + + @Test(dataProvider = "Google Guava multimaps (no nulls)") + public void testMultimap(Object[] contents) { + final TreeMultimap multimap = TreeMultimap. create(); + populateMultimap(multimap, contents); + final byte[] serialized = KryoTest.serialize(_kryo, multimap); + final TreeMultimap deserialized = KryoTest.deserialize(_kryo, serialized, TreeMultimap.class); + assertEqualMultimaps(true, true, deserialized, multimap); + } } diff --git a/src/test/java/de/javakaffee/kryoserializers/guava/UnmodifiableNavigableSetSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/guava/UnmodifiableNavigableSetSerializerTest.java index 464f6034..ef476e46 100644 --- a/src/test/java/de/javakaffee/kryoserializers/guava/UnmodifiableNavigableSetSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/guava/UnmodifiableNavigableSetSerializerTest.java @@ -1,198 +1,214 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers.guava; import static de.javakaffee.kryoserializers.KryoTest.deserialize; import static de.javakaffee.kryoserializers.KryoTest.serialize; import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertTrue; import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertTrue; import static org.testng.Assert.fail; import java.util.NavigableSet; import java.util.TreeSet; import java.util.concurrent.ConcurrentSkipListSet; -import com.esotericsoftware.kryo.Kryo; -import com.google.common.collect.Sets; - import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; +import com.esotericsoftware.kryo.Kryo; +import com.google.common.collect.Sets; + /** * Test for {@link ImmutableSortedSetSerializer}. */ @SuppressWarnings({"rawtypes", "unchecked"}) public class UnmodifiableNavigableSetSerializerTest { - private Kryo _kryo; - - @BeforeTest - public void setUp() { - _kryo = new Kryo(); - - UnmodifiableNavigableSetSerializer.registerSerializers(_kryo); - } - - Class unmodifiableClass; - { - unmodifiableClass = (Class) Sets.unmodifiableNavigableSet(new TreeSet()).getClass(); - } - - UnmodifiableNavigableSetSerializer forUnwrapping = new UnmodifiableNavigableSetSerializer(); - - private void assertUnderlyingSet(NavigableSet deserialized, Class class1) { - assertEquals( - forUnwrapping.getDelegateFromUnmodifiableNavigableSet(deserialized).getClass(), - class1, - "Expected underlying class to match"); - } - - @Test - public void testEmptyTreeSet() { - final TreeSet coreSet = Sets.newTreeSet(); - final NavigableSet obj = Sets.unmodifiableNavigableSet(coreSet); - final byte[] serialized = serialize(_kryo, obj); - final NavigableSet deserialized = deserialize(_kryo, serialized, unmodifiableClass); - assertTrue(deserialized.isEmpty()); - assertEquals(deserialized.size(), obj.size()); - // And ensure what we get is truly unmodifiable - try { - deserialized.add("a"); - fail("Should have been unable to add a field to an unmodifiable collection post deserialization"); - } catch (UnsupportedOperationException expected) {} - assertUnderlyingSet(deserialized, coreSet.getClass()); - } - - @Test - public void testEmptySkipList() { - final ConcurrentSkipListSet coreSet = new ConcurrentSkipListSet(); - final NavigableSet obj = Sets.unmodifiableNavigableSet(coreSet); - final byte[] serialized = serialize(_kryo, obj); - final NavigableSet deserialized = deserialize(_kryo, serialized, unmodifiableClass); - assertTrue(deserialized.isEmpty()); - assertEquals(deserialized.size(), obj.size()); - // And ensure what we get is truly unmodifiable - try { - deserialized.add("a"); - fail("Should have been unable to add a field to an unmodifiable collection post deserialization"); - } catch (UnsupportedOperationException expected) {} - assertUnderlyingSet(deserialized, coreSet.getClass()); - } - - @Test - public void testPopulatedTreeSet() { - final TreeSet coreSet = Sets.newTreeSet(); - coreSet.add("k"); - coreSet.add("r"); - coreSet.add("y"); - coreSet.add("o"); - final NavigableSet obj = Sets.unmodifiableNavigableSet(coreSet); - final byte[] serialized = serialize(_kryo, obj); - final NavigableSet deserialized = deserialize(_kryo, serialized, unmodifiableClass); - assertFalse(deserialized.isEmpty()); - assertEquals(deserialized.size(), obj.size()); - assertEquals(deserialized, obj); - // And ensure what we get is truly unmodifiable - try { - deserialized.add("a"); - fail("Should have been unable to add a field to an unmodifiable collection post deserialization"); - } catch (UnsupportedOperationException expected) {} - assertUnderlyingSet(deserialized, coreSet.getClass()); - } - - @Test - public void testPopulatedSkipList() { - final ConcurrentSkipListSet coreSet = new ConcurrentSkipListSet(); - coreSet.add("k"); - coreSet.add("r"); - coreSet.add("y"); - coreSet.add("o"); - final NavigableSet obj = Sets.unmodifiableNavigableSet(coreSet); - final byte[] serialized = serialize(_kryo, obj); - final NavigableSet deserialized = deserialize(_kryo, serialized, unmodifiableClass); - assertFalse(deserialized.isEmpty()); - assertEquals(deserialized.size(), obj.size()); - assertEquals(deserialized, obj); - // And ensure what we get is truly unmodifiable - try { - deserialized.add("a"); - fail("Should have been unable to add a field to an unmodifiable collection post deserialization"); - } catch (UnsupportedOperationException expected) {} - assertUnderlyingSet(deserialized, coreSet.getClass()); - } - - // Kryo#copy tests - - @Test - public void testCopyEmptyTreeSet() { - final TreeSet coreSet = Sets.newTreeSet(); - final NavigableSet obj = Sets.unmodifiableNavigableSet(coreSet); - final NavigableSet copied = _kryo.copy(obj); - assertTrue(copied.isEmpty()); - assertEquals(copied.size(), obj.size()); - - // And ensure what we get is truly unmodifiable - try { - copied.add("a"); - fail("Should have been unable to add a field to an unmodifiable collection post deserialization"); - } catch (UnsupportedOperationException expected) {} - assertUnderlyingSet(copied, coreSet.getClass()); - } - - @Test - public void testCopyEmptySkipList() { - final ConcurrentSkipListSet coreSet = new ConcurrentSkipListSet(); - final NavigableSet obj = Sets.unmodifiableNavigableSet(coreSet); - final NavigableSet copied = _kryo.copy(obj); - assertTrue(copied.isEmpty()); - assertEquals(copied.size(), obj.size()); - - // And ensure what we get is truly unmodifiable - try { - copied.add("a"); - fail("Should have been unable to add a field to an unmodifiable collection post deserialization"); - } catch (UnsupportedOperationException expected) {} - assertUnderlyingSet(copied, coreSet.getClass()); - } - - @Test - public void testCopyPopulatedTreeSet() { - final TreeSet coreSet = Sets.newTreeSet(); - coreSet.add("k"); - coreSet.add("r"); - coreSet.add("y"); - coreSet.add("o"); - final NavigableSet obj = Sets.unmodifiableNavigableSet(coreSet); - final NavigableSet copied = _kryo.copy(obj); - assertFalse(copied.isEmpty()); - assertEquals(copied.size(), obj.size()); - assertEquals(copied, obj); - - // And ensure what we get is truly unmodifiable - try { - copied.add("a"); - fail("Should have been unable to add a field to an unmodifiable collection post deserialization"); - } catch (UnsupportedOperationException expected) {} - assertUnderlyingSet(copied, coreSet.getClass()); - } - - @Test - public void testCopyPopulatedSkipList() { - final ConcurrentSkipListSet coreSet = new ConcurrentSkipListSet(); - coreSet.add("k"); - coreSet.add("r"); - coreSet.add("y"); - coreSet.add("o"); - final NavigableSet obj = Sets.unmodifiableNavigableSet(coreSet); - final NavigableSet copied = _kryo.copy(obj); - assertFalse(copied.isEmpty()); - assertEquals(copied.size(), obj.size()); - assertEquals(copied, obj); - - // And ensure what we get is truly unmodifiable - try { - copied.add("a"); - fail("Should have been unable to add a field to an unmodifiable collection post deserialization"); - } catch (UnsupportedOperationException expected) {} - assertUnderlyingSet(copied, coreSet.getClass()); - } + private Kryo _kryo; + + @BeforeTest + public void setUp() { + _kryo = new Kryo(); + + UnmodifiableNavigableSetSerializer.registerSerializers(_kryo); + } + + Class unmodifiableClass; + { + unmodifiableClass = (Class) Sets.unmodifiableNavigableSet(new TreeSet()).getClass(); + } + + UnmodifiableNavigableSetSerializer forUnwrapping = new UnmodifiableNavigableSetSerializer(); + + private void assertUnderlyingSet(NavigableSet deserialized, Class class1) { + assertEquals( + forUnwrapping.getDelegateFromUnmodifiableNavigableSet(deserialized).getClass(), + class1, + "Expected underlying class to match"); + } + + @Test + public void testEmptyTreeSet() { + final TreeSet coreSet = Sets.newTreeSet(); + final NavigableSet obj = Sets.unmodifiableNavigableSet(coreSet); + final byte[] serialized = serialize(_kryo, obj); + final NavigableSet deserialized = deserialize(_kryo, serialized, unmodifiableClass); + assertTrue(deserialized.isEmpty()); + assertEquals(deserialized.size(), obj.size()); + // And ensure what we get is truly unmodifiable + try { + deserialized.add("a"); + fail("Should have been unable to add a field to an unmodifiable collection post deserialization"); + } catch (UnsupportedOperationException expected) {} + assertUnderlyingSet(deserialized, coreSet.getClass()); + } + + @Test + public void testEmptySkipList() { + final ConcurrentSkipListSet coreSet = new ConcurrentSkipListSet(); + final NavigableSet obj = Sets.unmodifiableNavigableSet(coreSet); + final byte[] serialized = serialize(_kryo, obj); + final NavigableSet deserialized = deserialize(_kryo, serialized, unmodifiableClass); + assertTrue(deserialized.isEmpty()); + assertEquals(deserialized.size(), obj.size()); + // And ensure what we get is truly unmodifiable + try { + deserialized.add("a"); + fail("Should have been unable to add a field to an unmodifiable collection post deserialization"); + } catch (UnsupportedOperationException expected) {} + assertUnderlyingSet(deserialized, coreSet.getClass()); + } + + @Test + public void testPopulatedTreeSet() { + final TreeSet coreSet = Sets.newTreeSet(); + coreSet.add("k"); + coreSet.add("r"); + coreSet.add("y"); + coreSet.add("o"); + final NavigableSet obj = Sets.unmodifiableNavigableSet(coreSet); + final byte[] serialized = serialize(_kryo, obj); + final NavigableSet deserialized = deserialize(_kryo, serialized, unmodifiableClass); + assertFalse(deserialized.isEmpty()); + assertEquals(deserialized.size(), obj.size()); + assertEquals(deserialized, obj); + // And ensure what we get is truly unmodifiable + try { + deserialized.add("a"); + fail("Should have been unable to add a field to an unmodifiable collection post deserialization"); + } catch (UnsupportedOperationException expected) {} + assertUnderlyingSet(deserialized, coreSet.getClass()); + } + + @Test + public void testPopulatedSkipList() { + final ConcurrentSkipListSet coreSet = new ConcurrentSkipListSet(); + coreSet.add("k"); + coreSet.add("r"); + coreSet.add("y"); + coreSet.add("o"); + final NavigableSet obj = Sets.unmodifiableNavigableSet(coreSet); + final byte[] serialized = serialize(_kryo, obj); + final NavigableSet deserialized = deserialize(_kryo, serialized, unmodifiableClass); + assertFalse(deserialized.isEmpty()); + assertEquals(deserialized.size(), obj.size()); + assertEquals(deserialized, obj); + // And ensure what we get is truly unmodifiable + try { + deserialized.add("a"); + fail("Should have been unable to add a field to an unmodifiable collection post deserialization"); + } catch (UnsupportedOperationException expected) {} + assertUnderlyingSet(deserialized, coreSet.getClass()); + } + + // Kryo#copy tests + + @Test + public void testCopyEmptyTreeSet() { + final TreeSet coreSet = Sets.newTreeSet(); + final NavigableSet obj = Sets.unmodifiableNavigableSet(coreSet); + final NavigableSet copied = _kryo.copy(obj); + assertTrue(copied.isEmpty()); + assertEquals(copied.size(), obj.size()); + + // And ensure what we get is truly unmodifiable + try { + copied.add("a"); + fail("Should have been unable to add a field to an unmodifiable collection post deserialization"); + } catch (UnsupportedOperationException expected) {} + assertUnderlyingSet(copied, coreSet.getClass()); + } + + @Test + public void testCopyEmptySkipList() { + final ConcurrentSkipListSet coreSet = new ConcurrentSkipListSet(); + final NavigableSet obj = Sets.unmodifiableNavigableSet(coreSet); + final NavigableSet copied = _kryo.copy(obj); + assertTrue(copied.isEmpty()); + assertEquals(copied.size(), obj.size()); + + // And ensure what we get is truly unmodifiable + try { + copied.add("a"); + fail("Should have been unable to add a field to an unmodifiable collection post deserialization"); + } catch (UnsupportedOperationException expected) {} + assertUnderlyingSet(copied, coreSet.getClass()); + } + + @Test + public void testCopyPopulatedTreeSet() { + final TreeSet coreSet = Sets.newTreeSet(); + coreSet.add("k"); + coreSet.add("r"); + coreSet.add("y"); + coreSet.add("o"); + final NavigableSet obj = Sets.unmodifiableNavigableSet(coreSet); + final NavigableSet copied = _kryo.copy(obj); + assertFalse(copied.isEmpty()); + assertEquals(copied.size(), obj.size()); + assertEquals(copied, obj); + + // And ensure what we get is truly unmodifiable + try { + copied.add("a"); + fail("Should have been unable to add a field to an unmodifiable collection post deserialization"); + } catch (UnsupportedOperationException expected) {} + assertUnderlyingSet(copied, coreSet.getClass()); + } + + @Test + public void testCopyPopulatedSkipList() { + final ConcurrentSkipListSet coreSet = new ConcurrentSkipListSet(); + coreSet.add("k"); + coreSet.add("r"); + coreSet.add("y"); + coreSet.add("o"); + final NavigableSet obj = Sets.unmodifiableNavigableSet(coreSet); + final NavigableSet copied = _kryo.copy(obj); + assertFalse(copied.isEmpty()); + assertEquals(copied.size(), obj.size()); + assertEquals(copied, obj); + + // And ensure what we get is truly unmodifiable + try { + copied.add("a"); + fail("Should have been unable to add a field to an unmodifiable collection post deserialization"); + } catch (UnsupportedOperationException expected) {} + assertUnderlyingSet(copied, coreSet.getClass()); + } } diff --git a/src/test/java/de/javakaffee/kryoserializers/jodatime/JodaDateTimeSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/jodatime/JodaDateTimeSerializerTest.java index 715c6956..9a16e71b 100644 --- a/src/test/java/de/javakaffee/kryoserializers/jodatime/JodaDateTimeSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/jodatime/JodaDateTimeSerializerTest.java @@ -28,32 +28,32 @@ /** * Test for {@link JodaDateTimeSerializer}. - * + * * @author Martin Grotzke */ public class JodaDateTimeSerializerTest { - - private Kryo _kryo; - - @BeforeTest - protected void beforeTest() { - _kryo = new Kryo(); - _kryo.register( DateTime.class, new JodaDateTimeSerializer() ); - } - - @Test( enabled = true ) - public void testJodaDateTime() { - final DateTime obj = new DateTime().withDayOfYear( 42 ); - final byte[] serialized = serialize( _kryo, obj ); - final DateTime deserialized = deserialize( _kryo, serialized, DateTime.class ); - Assert.assertEquals( deserialized, obj ); - } - - @Test( enabled = true ) - public void testCopyJodaDateTime() { - final DateTime obj = new DateTime().withDayOfYear( 42 ); - final DateTime copy = _kryo.copy(obj); - Assert.assertEquals( copy, obj ); - } + + private Kryo _kryo; + + @BeforeTest + protected void beforeTest() { + _kryo = new Kryo(); + _kryo.register(DateTime.class, new JodaDateTimeSerializer()); + } + + @Test(enabled = true) + public void testJodaDateTime() { + final DateTime obj = new DateTime().withDayOfYear(42); + final byte[] serialized = serialize(_kryo, obj); + final DateTime deserialized = deserialize(_kryo, serialized, DateTime.class); + Assert.assertEquals(deserialized, obj); + } + + @Test(enabled = true) + public void testCopyJodaDateTime() { + final DateTime obj = new DateTime().withDayOfYear(42); + final DateTime copy = _kryo.copy(obj); + Assert.assertEquals(copy, obj); + } } diff --git a/src/test/java/de/javakaffee/kryoserializers/jodatime/JodaIntervalSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/jodatime/JodaIntervalSerializerTest.java index ba37b8c4..7702b895 100644 --- a/src/test/java/de/javakaffee/kryoserializers/jodatime/JodaIntervalSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/jodatime/JodaIntervalSerializerTest.java @@ -1,4 +1,6 @@ /* + * Copyright 2018 Martin Grotzke + * * 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 @@ -28,31 +30,31 @@ /** * Test for {@link JodaIntervalSerializer}. - * + * */ public class JodaIntervalSerializerTest { - - private Kryo _kryo; - - @BeforeTest - protected void beforeTest() { - _kryo = new Kryo(); - _kryo.register( Interval.class, new JodaIntervalSerializer() ); - } - - @Test( enabled = true ) - public void testJodaInterval() { - final Interval obj = new Interval(new DateTime(1942,1,1,0,0,0,0), Days.days(42)); - final byte[] serialized = serialize( _kryo, obj ); - final Interval deserialized = deserialize( _kryo, serialized, Interval.class ); - Assert.assertEquals( deserialized, obj ); - } - - @Test( enabled = true ) - public void testCopyJodaDateTime() { - final Interval obj = new Interval(new DateTime(1942,1,1,0,0,0,0), Days.days(42)); - final Interval copy = _kryo.copy(obj); - Assert.assertEquals( copy, obj ); - } + + private Kryo _kryo; + + @BeforeTest + protected void beforeTest() { + _kryo = new Kryo(); + _kryo.register(Interval.class, new JodaIntervalSerializer()); + } + + @Test(enabled = true) + public void testJodaInterval() { + final Interval obj = new Interval(new DateTime(1942, 1, 1, 0, 0, 0, 0), Days.days(42)); + final byte[] serialized = serialize(_kryo, obj); + final Interval deserialized = deserialize(_kryo, serialized, Interval.class); + Assert.assertEquals(deserialized, obj); + } + + @Test(enabled = true) + public void testCopyJodaDateTime() { + final Interval obj = new Interval(new DateTime(1942, 1, 1, 0, 0, 0, 0), Days.days(42)); + final Interval copy = _kryo.copy(obj); + Assert.assertEquals(copy, obj); + } } diff --git a/src/test/java/de/javakaffee/kryoserializers/jodatime/JodaLocalDateSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/jodatime/JodaLocalDateSerializerTest.java index 191a0d34..24ac70c0 100644 --- a/src/test/java/de/javakaffee/kryoserializers/jodatime/JodaLocalDateSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/jodatime/JodaLocalDateSerializerTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2015 Rennie Petersen + * Copyright 2018 Martin Grotzke * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -33,27 +33,27 @@ */ public class JodaLocalDateSerializerTest { - private Kryo _kryo; - - @BeforeTest - protected void beforeTest() { - _kryo = new Kryo(); - _kryo.register(LocalDate.class, new JodaLocalDateSerializer()); - } - - @Test(enabled = true) - public void testJodaLocalDate() { - final LocalDate obj = new LocalDate().withDayOfYear(42); - final byte[] serialized = serialize(_kryo, obj); - final LocalDate deserialized = deserialize(_kryo, serialized, LocalDate.class); - Assert.assertEquals(deserialized, obj); - } - - @Test(enabled = true) - public void testCopyJodaLocalDate() { - final LocalDate obj = new LocalDate().withDayOfYear(42); - final LocalDate copy = _kryo.copy(obj); - Assert.assertEquals(copy, obj); - } + private Kryo _kryo; + + @BeforeTest + protected void beforeTest() { + _kryo = new Kryo(); + _kryo.register(LocalDate.class, new JodaLocalDateSerializer()); + } + + @Test(enabled = true) + public void testJodaLocalDate() { + final LocalDate obj = new LocalDate().withDayOfYear(42); + final byte[] serialized = serialize(_kryo, obj); + final LocalDate deserialized = deserialize(_kryo, serialized, LocalDate.class); + Assert.assertEquals(deserialized, obj); + } + + @Test(enabled = true) + public void testCopyJodaLocalDate() { + final LocalDate obj = new LocalDate().withDayOfYear(42); + final LocalDate copy = _kryo.copy(obj); + Assert.assertEquals(copy, obj); + } } diff --git a/src/test/java/de/javakaffee/kryoserializers/jodatime/JodaLocalDateTimeSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/jodatime/JodaLocalDateTimeSerializerTest.java index c3af3fcd..588bb5f9 100644 --- a/src/test/java/de/javakaffee/kryoserializers/jodatime/JodaLocalDateTimeSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/jodatime/JodaLocalDateTimeSerializerTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2015 Rennie Petersen + * Copyright 2018 Martin Grotzke * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -33,27 +33,27 @@ */ public class JodaLocalDateTimeSerializerTest { - private Kryo _kryo; - - @BeforeTest - protected void beforeTest() { - _kryo = new Kryo(); - _kryo.register(LocalDateTime.class, new JodaLocalDateTimeSerializer()); - } - - @Test(enabled = true) - public void testJodaLocalDateTime() { - final LocalDateTime obj = new LocalDateTime().withDayOfYear(42); - final byte[] serialized = serialize(_kryo, obj); - final LocalDateTime deserialized = deserialize(_kryo, serialized, LocalDateTime.class); - Assert.assertEquals(deserialized, obj); - } - - @Test(enabled = true) - public void testCopyJodaLocalDateTime() { - final LocalDateTime obj = new LocalDateTime().withDayOfYear(42); - final LocalDateTime copy = _kryo.copy(obj); - Assert.assertEquals(copy, obj); - } + private Kryo _kryo; + + @BeforeTest + protected void beforeTest() { + _kryo = new Kryo(); + _kryo.register(LocalDateTime.class, new JodaLocalDateTimeSerializer()); + } + + @Test(enabled = true) + public void testJodaLocalDateTime() { + final LocalDateTime obj = new LocalDateTime().withDayOfYear(42); + final byte[] serialized = serialize(_kryo, obj); + final LocalDateTime deserialized = deserialize(_kryo, serialized, LocalDateTime.class); + Assert.assertEquals(deserialized, obj); + } + + @Test(enabled = true) + public void testCopyJodaLocalDateTime() { + final LocalDateTime obj = new LocalDateTime().withDayOfYear(42); + final LocalDateTime copy = _kryo.copy(obj); + Assert.assertEquals(copy, obj); + } } diff --git a/src/test/java/de/javakaffee/kryoserializers/jodatime/JodaLocalTimeSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/jodatime/JodaLocalTimeSerializerTest.java index e391f887..45ebe699 100644 --- a/src/test/java/de/javakaffee/kryoserializers/jodatime/JodaLocalTimeSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/jodatime/JodaLocalTimeSerializerTest.java @@ -1,14 +1,31 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers.jodatime; -import com.esotericsoftware.kryo.Kryo; +import static de.javakaffee.kryoserializers.KryoTest.deserialize; +import static de.javakaffee.kryoserializers.KryoTest.serialize; + import org.joda.time.*; import org.joda.time.chrono.GregorianChronology; import org.testng.Assert; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; -import static de.javakaffee.kryoserializers.KryoTest.deserialize; -import static de.javakaffee.kryoserializers.KryoTest.serialize; +import com.esotericsoftware.kryo.Kryo; /** * Tests for {@link JodaLocalTimeSerializer}. @@ -16,30 +33,30 @@ * @author Rob Reeves */ public class JodaLocalTimeSerializerTest { - private Kryo _kryo; + private Kryo _kryo; - @BeforeTest - protected void beforeTest() { - _kryo = new Kryo(); - _kryo.register(LocalTime.class, new JodaLocalTimeSerializer()); - } + @BeforeTest + protected void beforeTest() { + _kryo = new Kryo(); + _kryo.register(LocalTime.class, new JodaLocalTimeSerializer()); + } - @Test(enabled = true) - public void testJodaLocalTime() { - final DateTimeZone tz = DateTimeZone.forID("America/Los_Angeles"); - final Chronology chronology = GregorianChronology.getInstance(tz); - final LocalTime obj = new LocalTime(null, chronology); - final byte[] serialized = serialize(_kryo, obj); - final LocalTime deserialized = deserialize(_kryo, serialized, LocalTime.class); - Assert.assertEquals(deserialized, obj); - } + @Test(enabled = true) + public void testJodaLocalTime() { + final DateTimeZone tz = DateTimeZone.forID("America/Los_Angeles"); + final Chronology chronology = GregorianChronology.getInstance(tz); + final LocalTime obj = new LocalTime(null, chronology); + final byte[] serialized = serialize(_kryo, obj); + final LocalTime deserialized = deserialize(_kryo, serialized, LocalTime.class); + Assert.assertEquals(deserialized, obj); + } - @Test(enabled = true) - public void testCopyJodaLocalTime() { - final DateTimeZone tz = DateTimeZone.forID("America/Los_Angeles"); - final Chronology chronology = GregorianChronology.getInstance(tz); - final LocalTime obj = new LocalTime(52341234, chronology); - final LocalTime copy = _kryo.copy(obj); - Assert.assertEquals(copy, obj); - } + @Test(enabled = true) + public void testCopyJodaLocalTime() { + final DateTimeZone tz = DateTimeZone.forID("America/Los_Angeles"); + final Chronology chronology = GregorianChronology.getInstance(tz); + final LocalTime obj = new LocalTime(52341234, chronology); + final LocalTime copy = _kryo.copy(obj); + Assert.assertEquals(copy, obj); + } } diff --git a/src/test/java/de/javakaffee/kryoserializers/protobuf/ProtobufSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/protobuf/ProtobufSerializerTest.java index fb10c6dd..47c64c9d 100644 --- a/src/test/java/de/javakaffee/kryoserializers/protobuf/ProtobufSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/protobuf/ProtobufSerializerTest.java @@ -1,184 +1,202 @@ +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers.protobuf; +import static org.testng.Assert.*; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; + +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; + import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output; -import org.testng.annotations.BeforeTest; -import org.testng.annotations.Test; + import de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA; import de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; - -import static org.testng.Assert.*; - public class ProtobufSerializerTest { - private Kryo _kryo; - - @BeforeTest - public void setUp() throws Exception { - _kryo = new Kryo(); - _kryo.register(SampleProtoA.class, new ProtobufSerializer()); - _kryo.register(SampleProtoB.class, new ProtobufSerializer()); - } - - @Test - /** - * Verifies that the Serializer works over a single Protobuf object - */ - public void testSerializerWithProtoA() throws Exception { - Integer expectedMessageId = 12332; - String expectedName = "Esteban"; - - SampleProtoA protoA = createSampleProtoA(expectedMessageId, expectedName); - - // Attempt to serialize - ByteArrayOutputStream outStream = new ByteArrayOutputStream(); - Output o = new Output(outStream, 4096); - _kryo.getSerializer(protoA.getClass()).write(_kryo, o, protoA); - - // Attempt to deserialize - Input i = new Input(new ByteArrayInputStream(outStream.toByteArray()), 4096); - SampleProtoA verifyProtoA = (SampleProtoA) _kryo.getSerializer(protoA.getClass()).read(_kryo, i, SampleProtoA.class); - - // Verify it - assertEquals((Integer)expectedMessageId, (Integer)verifyProtoA.getMessageId(), "MessageId is correct"); - assertEquals((String)expectedName, (String)verifyProtoA.getName(), "Name is correct"); - } - - @Test - /** - * Verifies that the Serializer works back to back with multiple protobufs instances of the same type (SampleProtoA) - */ - public void testSerializerWithMultipleInstances() throws Exception { - // Create first instance - Integer expectedMessageId1 = 12332; - String expectedName1 = "Esteban"; - SampleProtoA protoA1 = createSampleProtoA(expectedMessageId1, expectedName1); - - // Create 2nd instance - Integer expectedMessageId2 = 531; - String expectedName2 = "Bergo"; - SampleProtoA protoA2 = createSampleProtoA(expectedMessageId2, expectedName2); - - // Attempt to serialize instance 1 - ByteArrayOutputStream outStream = new ByteArrayOutputStream(); - Output o = new Output(outStream, 4096); - _kryo.getSerializer(protoA1.getClass()).write(_kryo, o, protoA1); - byte[] serializedProtoA1 = outStream.toByteArray(); - - // Attempt to serialize instance 2 - outStream = new ByteArrayOutputStream(); - o = new Output(outStream, 4096); - _kryo.getSerializer(protoA1.getClass()).write(_kryo, o, protoA2); - byte[] serializedProtoA2 = outStream.toByteArray(); - - // Attempt to deserialize instance 1 - Input i = new Input(new ByteArrayInputStream(serializedProtoA1), 4096); - SampleProtoA testProtoA1 = (SampleProtoA) _kryo.getSerializer(protoA1.getClass()).read(_kryo, i, SampleProtoA.class); - - // Attempt to deserialize instance 2 - i = new Input(new ByteArrayInputStream(serializedProtoA2), 4096); - SampleProtoA testProtoA2 = (SampleProtoA) _kryo.getSerializer(protoA1.getClass()).read(_kryo, i, SampleProtoA.class); - - // Verify instance 1 - assertEquals((Integer)expectedMessageId1, (Integer)testProtoA1.getMessageId(), "MessageId is correct"); - assertEquals((String)expectedName1, (String)testProtoA1.getName(), "Name is correct"); - - // Verify instance 2 - assertEquals((Integer)expectedMessageId2, (Integer)testProtoA2.getMessageId(), "MessageId is correct"); - assertEquals((String)expectedName2, (String)testProtoA2.getName(), "Name is correct"); - } - - @Test - /** - * Verifies that the Serializer works back to back with multiple protobufs instances of different types (SampleProtoA and SampleProtoB) - */ - public void testSerializerWithMultipleInstancesDifferentTypes() throws Exception { - // Create first instance - Integer expectedMessageId = 12332; - String expectedName = "Esteban"; - SampleProtoA protoA = createSampleProtoA(expectedMessageId, expectedName); - - // Create 2nd instance - Integer expectedIdentifier = 543; - String expectedCity = "Atlanta"; - String expectedState = "Georgia"; - SampleProtoB protoB = createSampleProtoB(expectedIdentifier, expectedCity, expectedState); - - // Attempt to serialize instance 1 - ByteArrayOutputStream outStream = new ByteArrayOutputStream(); - Output o = new Output(outStream, 4096); - _kryo.getSerializer(protoA.getClass()).write(_kryo, o, protoA); - byte[] serializedProtoA = outStream.toByteArray(); - - // Attempt to serialize instance 2 - outStream = new ByteArrayOutputStream(); - o = new Output(outStream, 4096); - ProtobufSerializer protoBSerializer = new ProtobufSerializer(); - _kryo.getSerializer(protoB.getClass()).write(_kryo, o, protoB); - byte[] serializedProtoB = outStream.toByteArray(); - - // Attempt to deserialize instance 1 - Input i = new Input(new ByteArrayInputStream(serializedProtoA), 4096); - SampleProtoA testProtoA = (SampleProtoA) _kryo.getSerializer(protoA.getClass()).read(_kryo, i, SampleProtoA.class); - - // Attempt to deserialize instance 2 - i = new Input(new ByteArrayInputStream(serializedProtoB), 4096); - SampleProtoB testProtoB = (SampleProtoB) _kryo.getSerializer(protoB.getClass()).read(_kryo, i, SampleProtoB.class); - - // Verify instance 1 - assertEquals((Integer)expectedMessageId, (Integer)testProtoA.getMessageId(), "MessageId is correct"); - assertEquals((String)expectedName, (String)testProtoA.getName(), "Name is correct"); - - // Verify instance 2 - assertEquals((Integer)expectedIdentifier, (Integer)testProtoB.getIdentifier(), "Identifier is correct"); - assertEquals((String)expectedCity, (String)testProtoB.getCity(), "City is correct"); - assertEquals((String)expectedState, (String)testProtoB.getState(), "State is correct"); - } - - @Test - public void testGetAcceptsNull() throws Exception { - ProtobufSerializer serializer = new ProtobufSerializer(); - assertTrue(serializer.getAcceptsNull(), "Accepts null"); - } - - @Test - public void testNull() { - SampleProtoA sampleProtoA = null; - - // Attempt to serialize null - ByteArrayOutputStream outStream = new ByteArrayOutputStream(); - Output o = new Output(outStream, 4096); - _kryo.getSerializer(SampleProtoA.class).write(_kryo, o, sampleProtoA); - byte[] serializedNullValue = outStream.toByteArray(); - - // Attempt to deserialize - Input i = new Input(new ByteArrayInputStream(serializedNullValue), 4096); - SampleProtoA testNullProto = (SampleProtoA) _kryo.getSerializer(SampleProtoA.class).read(_kryo, i, SampleProtoA.class); - assertNull(testNullProto); - } - - private SampleProtoA createSampleProtoA(Integer messageId, String name) { - // Create builder - SampleProtoA.Builder builder = SampleProtoA.newBuilder(); - builder.setMessageId(messageId); - builder.setName(name); - - // Build protobuf - return builder.build(); - } - - private SampleProtoB createSampleProtoB(Integer identifier, String city, String state) { - // Create builder - SampleProtoB.Builder builder = SampleProtoB.newBuilder(); - builder.setIdentifier(identifier); - builder.setCity(city); - builder.setState(state); - - // Build protobuf - return builder.build(); - } -} \ No newline at end of file + private Kryo _kryo; + + @BeforeTest + public void setUp() throws Exception { + _kryo = new Kryo(); + _kryo.register(SampleProtoA.class, new ProtobufSerializer()); + _kryo.register(SampleProtoB.class, new ProtobufSerializer()); + } + + @Test + /** + * Verifies that the Serializer works over a single Protobuf object + */ + public void testSerializerWithProtoA() throws Exception { + Integer expectedMessageId = 12332; + String expectedName = "Esteban"; + + SampleProtoA protoA = createSampleProtoA(expectedMessageId, expectedName); + + // Attempt to serialize + ByteArrayOutputStream outStream = new ByteArrayOutputStream(); + Output o = new Output(outStream, 4096); + _kryo.getSerializer(protoA.getClass()).write(_kryo, o, protoA); + + // Attempt to deserialize + Input i = new Input(new ByteArrayInputStream(outStream.toByteArray()), 4096); + SampleProtoA verifyProtoA = (SampleProtoA) _kryo.getSerializer(protoA.getClass()).read(_kryo, i, SampleProtoA.class); + + // Verify it + assertEquals((Integer) expectedMessageId, (Integer) verifyProtoA.getMessageId(), "MessageId is correct"); + assertEquals((String) expectedName, (String) verifyProtoA.getName(), "Name is correct"); + } + + @Test + /** + * Verifies that the Serializer works back to back with multiple protobufs instances of the same type (SampleProtoA) + */ + public void testSerializerWithMultipleInstances() throws Exception { + // Create first instance + Integer expectedMessageId1 = 12332; + String expectedName1 = "Esteban"; + SampleProtoA protoA1 = createSampleProtoA(expectedMessageId1, expectedName1); + + // Create 2nd instance + Integer expectedMessageId2 = 531; + String expectedName2 = "Bergo"; + SampleProtoA protoA2 = createSampleProtoA(expectedMessageId2, expectedName2); + + // Attempt to serialize instance 1 + ByteArrayOutputStream outStream = new ByteArrayOutputStream(); + Output o = new Output(outStream, 4096); + _kryo.getSerializer(protoA1.getClass()).write(_kryo, o, protoA1); + byte[] serializedProtoA1 = outStream.toByteArray(); + + // Attempt to serialize instance 2 + outStream = new ByteArrayOutputStream(); + o = new Output(outStream, 4096); + _kryo.getSerializer(protoA1.getClass()).write(_kryo, o, protoA2); + byte[] serializedProtoA2 = outStream.toByteArray(); + + // Attempt to deserialize instance 1 + Input i = new Input(new ByteArrayInputStream(serializedProtoA1), 4096); + SampleProtoA testProtoA1 = (SampleProtoA) _kryo.getSerializer(protoA1.getClass()).read(_kryo, i, SampleProtoA.class); + + // Attempt to deserialize instance 2 + i = new Input(new ByteArrayInputStream(serializedProtoA2), 4096); + SampleProtoA testProtoA2 = (SampleProtoA) _kryo.getSerializer(protoA1.getClass()).read(_kryo, i, SampleProtoA.class); + + // Verify instance 1 + assertEquals((Integer) expectedMessageId1, (Integer) testProtoA1.getMessageId(), "MessageId is correct"); + assertEquals((String) expectedName1, (String) testProtoA1.getName(), "Name is correct"); + + // Verify instance 2 + assertEquals((Integer) expectedMessageId2, (Integer) testProtoA2.getMessageId(), "MessageId is correct"); + assertEquals((String) expectedName2, (String) testProtoA2.getName(), "Name is correct"); + } + + @Test + /** + * Verifies that the Serializer works back to back with multiple protobufs instances of different types (SampleProtoA and SampleProtoB) + */ + public void testSerializerWithMultipleInstancesDifferentTypes() throws Exception { + // Create first instance + Integer expectedMessageId = 12332; + String expectedName = "Esteban"; + SampleProtoA protoA = createSampleProtoA(expectedMessageId, expectedName); + + // Create 2nd instance + Integer expectedIdentifier = 543; + String expectedCity = "Atlanta"; + String expectedState = "Georgia"; + SampleProtoB protoB = createSampleProtoB(expectedIdentifier, expectedCity, expectedState); + + // Attempt to serialize instance 1 + ByteArrayOutputStream outStream = new ByteArrayOutputStream(); + Output o = new Output(outStream, 4096); + _kryo.getSerializer(protoA.getClass()).write(_kryo, o, protoA); + byte[] serializedProtoA = outStream.toByteArray(); + + // Attempt to serialize instance 2 + outStream = new ByteArrayOutputStream(); + o = new Output(outStream, 4096); + ProtobufSerializer protoBSerializer = new ProtobufSerializer(); + _kryo.getSerializer(protoB.getClass()).write(_kryo, o, protoB); + byte[] serializedProtoB = outStream.toByteArray(); + + // Attempt to deserialize instance 1 + Input i = new Input(new ByteArrayInputStream(serializedProtoA), 4096); + SampleProtoA testProtoA = (SampleProtoA) _kryo.getSerializer(protoA.getClass()).read(_kryo, i, SampleProtoA.class); + + // Attempt to deserialize instance 2 + i = new Input(new ByteArrayInputStream(serializedProtoB), 4096); + SampleProtoB testProtoB = (SampleProtoB) _kryo.getSerializer(protoB.getClass()).read(_kryo, i, SampleProtoB.class); + + // Verify instance 1 + assertEquals((Integer) expectedMessageId, (Integer) testProtoA.getMessageId(), "MessageId is correct"); + assertEquals((String) expectedName, (String) testProtoA.getName(), "Name is correct"); + + // Verify instance 2 + assertEquals((Integer) expectedIdentifier, (Integer) testProtoB.getIdentifier(), "Identifier is correct"); + assertEquals((String) expectedCity, (String) testProtoB.getCity(), "City is correct"); + assertEquals((String) expectedState, (String) testProtoB.getState(), "State is correct"); + } + + @Test + public void testGetAcceptsNull() throws Exception { + ProtobufSerializer serializer = new ProtobufSerializer(); + assertTrue(serializer.getAcceptsNull(), "Accepts null"); + } + + @Test + public void testNull() { + SampleProtoA sampleProtoA = null; + + // Attempt to serialize null + ByteArrayOutputStream outStream = new ByteArrayOutputStream(); + Output o = new Output(outStream, 4096); + _kryo.getSerializer(SampleProtoA.class).write(_kryo, o, sampleProtoA); + byte[] serializedNullValue = outStream.toByteArray(); + + // Attempt to deserialize + Input i = new Input(new ByteArrayInputStream(serializedNullValue), 4096); + SampleProtoA testNullProto = (SampleProtoA) _kryo.getSerializer(SampleProtoA.class).read(_kryo, i, SampleProtoA.class); + assertNull(testNullProto); + } + + private SampleProtoA createSampleProtoA(Integer messageId, String name) { + // Create builder + SampleProtoA.Builder builder = SampleProtoA.newBuilder(); + builder.setMessageId(messageId); + builder.setName(name); + + // Build protobuf + return builder.build(); + } + + private SampleProtoB createSampleProtoB(Integer identifier, String city, String state) { + // Create builder + SampleProtoB.Builder builder = SampleProtoB.newBuilder(); + builder.setIdentifier(identifier); + builder.setCity(city); + builder.setState(state); + + // Build protobuf + return builder.build(); + } +} diff --git a/src/test/java/de/javakaffee/kryoserializers/protobuf/SampleProtoAOuterClass.java b/src/test/java/de/javakaffee/kryoserializers/protobuf/SampleProtoAOuterClass.java index 59103e48..19667eec 100644 --- a/src/test/java/de/javakaffee/kryoserializers/protobuf/SampleProtoAOuterClass.java +++ b/src/test/java/de/javakaffee/kryoserializers/protobuf/SampleProtoAOuterClass.java @@ -1,605 +1,652 @@ -// Generated by the protocol buffer compiler. DO NOT EDIT! -// source: SampleProtoA.proto - +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers.protobuf; public final class SampleProtoAOuterClass { - private SampleProtoAOuterClass() {} - public static void registerAllExtensions( - com.google.protobuf.ExtensionRegistry registry) { - } - public interface SampleProtoAOrBuilder extends - // @@protoc_insertion_point(interface_extends:ProtocolBuffers.SampleProtoA) - com.google.protobuf.MessageOrBuilder { - - /** - * optional string name = 1; - */ - boolean hasName(); - /** - * optional string name = 1; - */ - java.lang.String getName(); - /** - * optional string name = 1; - */ - com.google.protobuf.ByteString - getNameBytes(); - - /** - * optional uint32 message_id = 2; - */ - boolean hasMessageId(); - /** - * optional uint32 message_id = 2; - */ - int getMessageId(); - } - /** - * Protobuf type {@code ProtocolBuffers.SampleProtoA} - */ - public static final class SampleProtoA extends - com.google.protobuf.GeneratedMessage implements - // @@protoc_insertion_point(message_implements:ProtocolBuffers.SampleProtoA) - SampleProtoAOrBuilder { - // Use SampleProtoA.newBuilder() to construct. - private SampleProtoA(com.google.protobuf.GeneratedMessage.Builder builder) { - super(builder); - this.unknownFields = builder.getUnknownFields(); - } - private SampleProtoA(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } - - private static final SampleProtoA defaultInstance; - public static SampleProtoA getDefaultInstance() { - return defaultInstance; - } - - public SampleProtoA getDefaultInstanceForType() { - return defaultInstance; - } - - private final com.google.protobuf.UnknownFieldSet unknownFields; - @java.lang.Override - public final com.google.protobuf.UnknownFieldSet - getUnknownFields() { - return this.unknownFields; - } - private SampleProtoA( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - initFields(); - int mutable_bitField0_ = 0; - com.google.protobuf.UnknownFieldSet.Builder unknownFields = - com.google.protobuf.UnknownFieldSet.newBuilder(); - try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch (tag) { - case 0: - done = true; - break; - default: { - if (!parseUnknownField(input, unknownFields, - extensionRegistry, tag)) { - done = true; - } - break; - } - case 10: { - com.google.protobuf.ByteString bs = input.readBytes(); - bitField0_ |= 0x00000001; - name_ = bs; - break; - } - case 16: { - bitField0_ |= 0x00000002; - messageId_ = input.readUInt32(); - break; - } - } - } - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(this); - } catch (java.io.IOException e) { - throw new com.google.protobuf.InvalidProtocolBufferException( - e.getMessage()).setUnfinishedMessage(this); - } finally { - this.unknownFields = unknownFields.build(); - makeExtensionsImmutable(); - } - } - public static final com.google.protobuf.Descriptors.Descriptor - getDescriptor() { - return de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.internal_static_ProtocolBuffers_SampleProtoA_descriptor; - } - - protected com.google.protobuf.GeneratedMessage.FieldAccessorTable - internalGetFieldAccessorTable() { - return de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.internal_static_ProtocolBuffers_SampleProtoA_fieldAccessorTable - .ensureFieldAccessorsInitialized( - de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA.class, de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA.Builder.class); - } - - public static com.google.protobuf.Parser PARSER = - new com.google.protobuf.AbstractParser() { - public SampleProtoA parsePartialFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return new SampleProtoA(input, extensionRegistry); - } - }; - - @java.lang.Override - public com.google.protobuf.Parser getParserForType() { - return PARSER; - } - - private int bitField0_; - public static final int NAME_FIELD_NUMBER = 1; - private java.lang.Object name_; - /** - * optional string name = 1; - */ - public boolean hasName() { - return ((bitField0_ & 0x00000001) == 0x00000001); - } - /** - * optional string name = 1; - */ - public java.lang.String getName() { - java.lang.Object ref = name_; - if (ref instanceof java.lang.String) { - return (java.lang.String) ref; - } else { - com.google.protobuf.ByteString bs = - (com.google.protobuf.ByteString) ref; - java.lang.String s = bs.toStringUtf8(); - if (bs.isValidUtf8()) { - name_ = s; - } - return s; - } - } - /** - * optional string name = 1; - */ - public com.google.protobuf.ByteString - getNameBytes() { - java.lang.Object ref = name_; - if (ref instanceof java.lang.String) { - com.google.protobuf.ByteString b = - com.google.protobuf.ByteString.copyFromUtf8( - (java.lang.String) ref); - name_ = b; - return b; - } else { - return (com.google.protobuf.ByteString) ref; - } - } - - public static final int MESSAGE_ID_FIELD_NUMBER = 2; - private int messageId_; - /** - * optional uint32 message_id = 2; - */ - public boolean hasMessageId() { - return ((bitField0_ & 0x00000002) == 0x00000002); - } - /** - * optional uint32 message_id = 2; - */ - public int getMessageId() { - return messageId_; - } - - private void initFields() { - name_ = ""; - messageId_ = 0; - } - private byte memoizedIsInitialized = -1; - public final boolean isInitialized() { - byte isInitialized = memoizedIsInitialized; - if (isInitialized == 1) return true; - if (isInitialized == 0) return false; - - memoizedIsInitialized = 1; - return true; - } - - public void writeTo(com.google.protobuf.CodedOutputStream output) - throws java.io.IOException { - getSerializedSize(); - if (((bitField0_ & 0x00000001) == 0x00000001)) { - output.writeBytes(1, getNameBytes()); - } - if (((bitField0_ & 0x00000002) == 0x00000002)) { - output.writeUInt32(2, messageId_); - } - getUnknownFields().writeTo(output); - } - - private int memoizedSerializedSize = -1; - public int getSerializedSize() { - int size = memoizedSerializedSize; - if (size != -1) return size; - - size = 0; - if (((bitField0_ & 0x00000001) == 0x00000001)) { - size += com.google.protobuf.CodedOutputStream - .computeBytesSize(1, getNameBytes()); - } - if (((bitField0_ & 0x00000002) == 0x00000002)) { - size += com.google.protobuf.CodedOutputStream - .computeUInt32Size(2, messageId_); - } - size += getUnknownFields().getSerializedSize(); - memoizedSerializedSize = size; - return size; - } - - private static final long serialVersionUID = 0L; - @java.lang.Override - protected java.lang.Object writeReplace() - throws java.io.ObjectStreamException { - return super.writeReplace(); - } - - public static de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA parseFrom( - com.google.protobuf.ByteString data) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data); - } - public static de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA parseFrom( - com.google.protobuf.ByteString data, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data, extensionRegistry); - } - public static de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA parseFrom(byte[] data) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data); - } - public static de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA parseFrom( - byte[] data, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data, extensionRegistry); - } - public static de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA parseFrom(java.io.InputStream input) - throws java.io.IOException { - return PARSER.parseFrom(input); - } - public static de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA parseFrom( - java.io.InputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseFrom(input, extensionRegistry); - } - public static de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA parseDelimitedFrom(java.io.InputStream input) - throws java.io.IOException { - return PARSER.parseDelimitedFrom(input); - } - public static de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA parseDelimitedFrom( - java.io.InputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseDelimitedFrom(input, extensionRegistry); - } - public static de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA parseFrom( - com.google.protobuf.CodedInputStream input) - throws java.io.IOException { - return PARSER.parseFrom(input); - } - public static de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA parseFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseFrom(input, extensionRegistry); - } - - public static Builder newBuilder() { return Builder.create(); } - public Builder newBuilderForType() { return newBuilder(); } - public static Builder newBuilder(de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA prototype) { - return newBuilder().mergeFrom(prototype); - } - public Builder toBuilder() { return newBuilder(this); } - - @java.lang.Override - protected Builder newBuilderForType( - com.google.protobuf.GeneratedMessage.BuilderParent parent) { - Builder builder = new Builder(parent); - return builder; - } - /** - * Protobuf type {@code ProtocolBuffers.SampleProtoA} - */ - public static final class Builder extends - com.google.protobuf.GeneratedMessage.Builder implements - // @@protoc_insertion_point(builder_implements:ProtocolBuffers.SampleProtoA) - de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoAOrBuilder { - public static final com.google.protobuf.Descriptors.Descriptor - getDescriptor() { - return de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.internal_static_ProtocolBuffers_SampleProtoA_descriptor; - } - - protected com.google.protobuf.GeneratedMessage.FieldAccessorTable - internalGetFieldAccessorTable() { - return de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.internal_static_ProtocolBuffers_SampleProtoA_fieldAccessorTable - .ensureFieldAccessorsInitialized( - de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA.class, de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA.Builder.class); - } - - // Construct using de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA.newBuilder() - private Builder() { - maybeForceBuilderInitialization(); - } - - private Builder( - com.google.protobuf.GeneratedMessage.BuilderParent parent) { - super(parent); - maybeForceBuilderInitialization(); - } - private void maybeForceBuilderInitialization() { - if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { - } - } - private static Builder create() { - return new Builder(); - } - - public Builder clear() { - super.clear(); - name_ = ""; - bitField0_ = (bitField0_ & ~0x00000001); - messageId_ = 0; - bitField0_ = (bitField0_ & ~0x00000002); - return this; - } - - public Builder clone() { - return create().mergeFrom(buildPartial()); - } - - public com.google.protobuf.Descriptors.Descriptor - getDescriptorForType() { - return de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.internal_static_ProtocolBuffers_SampleProtoA_descriptor; - } - - public de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA getDefaultInstanceForType() { - return de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA.getDefaultInstance(); - } - - public de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA build() { - de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA result = buildPartial(); - if (!result.isInitialized()) { - throw newUninitializedMessageException(result); - } - return result; - } - - public de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA buildPartial() { - de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA result = new de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA(this); - int from_bitField0_ = bitField0_; - int to_bitField0_ = 0; - if (((from_bitField0_ & 0x00000001) == 0x00000001)) { - to_bitField0_ |= 0x00000001; - } - result.name_ = name_; - if (((from_bitField0_ & 0x00000002) == 0x00000002)) { - to_bitField0_ |= 0x00000002; - } - result.messageId_ = messageId_; - result.bitField0_ = to_bitField0_; - onBuilt(); - return result; - } - - public Builder mergeFrom(com.google.protobuf.Message other) { - if (other instanceof de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA) { - return mergeFrom((de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA)other); - } else { - super.mergeFrom(other); - return this; - } - } - - public Builder mergeFrom(de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA other) { - if (other == de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA.getDefaultInstance()) return this; - if (other.hasName()) { - bitField0_ |= 0x00000001; - name_ = other.name_; - onChanged(); - } - if (other.hasMessageId()) { - setMessageId(other.getMessageId()); - } - this.mergeUnknownFields(other.getUnknownFields()); - return this; - } - - public final boolean isInitialized() { - return true; - } - - public Builder mergeFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA parsedMessage = null; - try { - parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - parsedMessage = (de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA) e.getUnfinishedMessage(); - throw e; - } finally { - if (parsedMessage != null) { - mergeFrom(parsedMessage); - } - } - return this; - } - private int bitField0_; - - private java.lang.Object name_ = ""; - /** - * optional string name = 1; - */ - public boolean hasName() { - return ((bitField0_ & 0x00000001) == 0x00000001); - } - /** - * optional string name = 1; - */ - public java.lang.String getName() { - java.lang.Object ref = name_; - if (!(ref instanceof java.lang.String)) { - com.google.protobuf.ByteString bs = - (com.google.protobuf.ByteString) ref; - java.lang.String s = bs.toStringUtf8(); - if (bs.isValidUtf8()) { - name_ = s; - } - return s; - } else { - return (java.lang.String) ref; - } - } - /** - * optional string name = 1; - */ - public com.google.protobuf.ByteString - getNameBytes() { - java.lang.Object ref = name_; - if (ref instanceof String) { - com.google.protobuf.ByteString b = - com.google.protobuf.ByteString.copyFromUtf8( - (java.lang.String) ref); - name_ = b; - return b; - } else { - return (com.google.protobuf.ByteString) ref; - } - } - /** - * optional string name = 1; - */ - public Builder setName( - java.lang.String value) { - if (value == null) { - throw new NullPointerException(); - } - bitField0_ |= 0x00000001; - name_ = value; - onChanged(); - return this; - } - /** - * optional string name = 1; - */ - public Builder clearName() { - bitField0_ = (bitField0_ & ~0x00000001); - name_ = getDefaultInstance().getName(); - onChanged(); - return this; - } - /** - * optional string name = 1; - */ - public Builder setNameBytes( - com.google.protobuf.ByteString value) { - if (value == null) { - throw new NullPointerException(); - } - bitField0_ |= 0x00000001; - name_ = value; - onChanged(); - return this; - } - - private int messageId_ ; - /** - * optional uint32 message_id = 2; - */ - public boolean hasMessageId() { - return ((bitField0_ & 0x00000002) == 0x00000002); - } - /** - * optional uint32 message_id = 2; - */ - public int getMessageId() { - return messageId_; - } - /** - * optional uint32 message_id = 2; - */ - public Builder setMessageId(int value) { - bitField0_ |= 0x00000002; - messageId_ = value; - onChanged(); - return this; - } - /** - * optional uint32 message_id = 2; - */ - public Builder clearMessageId() { - bitField0_ = (bitField0_ & ~0x00000002); - messageId_ = 0; - onChanged(); - return this; - } - - // @@protoc_insertion_point(builder_scope:ProtocolBuffers.SampleProtoA) - } - - static { - defaultInstance = new SampleProtoA(true); - defaultInstance.initFields(); - } - - // @@protoc_insertion_point(class_scope:ProtocolBuffers.SampleProtoA) - } - - private static final com.google.protobuf.Descriptors.Descriptor - internal_static_ProtocolBuffers_SampleProtoA_descriptor; - private static - com.google.protobuf.GeneratedMessage.FieldAccessorTable - internal_static_ProtocolBuffers_SampleProtoA_fieldAccessorTable; - - public static com.google.protobuf.Descriptors.FileDescriptor - getDescriptor() { - return descriptor; - } - private static com.google.protobuf.Descriptors.FileDescriptor - descriptor; - static { - java.lang.String[] descriptorData = { - "\n\022SampleProtoA.proto\022\017ProtocolBuffers\"0\n" + - "\014SampleProtoA\022\014\n\004name\030\001 \001(\t\022\022\n\nmessage_i" + - "d\030\002 \001(\rB@\n&de.javakaffee.kryoserializers" + - ".protobufB\026SampleProtoAOuterClass" - }; - com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = - new com.google.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() { - public com.google.protobuf.ExtensionRegistry assignDescriptors( - com.google.protobuf.Descriptors.FileDescriptor root) { - descriptor = root; - return null; - } - }; - com.google.protobuf.Descriptors.FileDescriptor - .internalBuildGeneratedFileFrom(descriptorData, - new com.google.protobuf.Descriptors.FileDescriptor[] { - }, assigner); - internal_static_ProtocolBuffers_SampleProtoA_descriptor = - getDescriptor().getMessageTypes().get(0); - internal_static_ProtocolBuffers_SampleProtoA_fieldAccessorTable = new - com.google.protobuf.GeneratedMessage.FieldAccessorTable( - internal_static_ProtocolBuffers_SampleProtoA_descriptor, - new java.lang.String[] { "Name", "MessageId", }); - } - - // @@protoc_insertion_point(outer_class_scope) + private SampleProtoAOuterClass() {} + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) {} + + public interface SampleProtoAOrBuilder extends + // @@protoc_insertion_point(interface_extends:ProtocolBuffers.SampleProtoA) + com.google.protobuf.MessageOrBuilder { + + /** + * optional string name = 1; + */ + boolean hasName(); + + /** + * optional string name = 1; + */ + java.lang.String getName(); + + /** + * optional string name = 1; + */ + com.google.protobuf.ByteString getNameBytes(); + + /** + * optional uint32 message_id = 2; + */ + boolean hasMessageId(); + + /** + * optional uint32 message_id = 2; + */ + int getMessageId(); + } + + /** + * Protobuf type {@code ProtocolBuffers.SampleProtoA} + */ + public static final class SampleProtoA extends + com.google.protobuf.GeneratedMessage implements + // @@protoc_insertion_point(message_implements:ProtocolBuffers.SampleProtoA) + SampleProtoAOrBuilder { + // Use SampleProtoA.newBuilder() to construct. + private SampleProtoA(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + + private SampleProtoA(boolean noInit) { + this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); + } + + private static final SampleProtoA defaultInstance; + + public static SampleProtoA getDefaultInstance() { + return defaultInstance; + } + + public SampleProtoA getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet getUnknownFields() { + return this.unknownFields; + } + + private SampleProtoA( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000001; + name_ = bs; + break; + } + case 16: { + bitField0_ |= 0x00000002; + messageId_ = input.readUInt32(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.internal_static_ProtocolBuffers_SampleProtoA_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable internalGetFieldAccessorTable() { + return de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.internal_static_ProtocolBuffers_SampleProtoA_fieldAccessorTable + .ensureFieldAccessorsInitialized( + de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA.class, de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() { + public SampleProtoA parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new SampleProtoA(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + public static final int NAME_FIELD_NUMBER = 1; + private java.lang.Object name_; + + /** + * optional string name = 1; + */ + public boolean hasName() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + + /** + * optional string name = 1; + */ + public java.lang.String getName() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + name_ = s; + } + return s; + } + } + + /** + * optional string name = 1; + */ + public com.google.protobuf.ByteString getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int MESSAGE_ID_FIELD_NUMBER = 2; + private int messageId_; + + /** + * optional uint32 message_id = 2; + */ + public boolean hasMessageId() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + + /** + * optional uint32 message_id = 2; + */ + public int getMessageId() { + return messageId_; + } + + private void initFields() { + name_ = ""; + messageId_ = 0; + } + + private byte memoizedIsInitialized = -1; + + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) + return true; + if (isInitialized == 0) + return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, getNameBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeUInt32(2, messageId_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) + return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, getNameBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(2, messageId_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + + public static de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + + public static de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + + public static de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + + public static de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { + return Builder.create(); + } + + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder(de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA prototype) { + return newBuilder().mergeFrom(prototype); + } + + public Builder toBuilder() { + return newBuilder(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + + /** + * Protobuf type {@code ProtocolBuffers.SampleProtoA} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder implements + // @@protoc_insertion_point(builder_implements:ProtocolBuffers.SampleProtoA) + de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoAOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.internal_static_ProtocolBuffers_SampleProtoA_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable internalGetFieldAccessorTable() { + return de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.internal_static_ProtocolBuffers_SampleProtoA_fieldAccessorTable + .ensureFieldAccessorsInitialized( + de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA.class, de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA.Builder.class); + } + + // Construct using de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {} + } + + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + name_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + messageId_ = 0; + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.internal_static_ProtocolBuffers_SampleProtoA_descriptor; + } + + public de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA getDefaultInstanceForType() { + return de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA.getDefaultInstance(); + } + + public de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA build() { + de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA buildPartial() { + de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA result = new de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.name_ = name_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.messageId_ = messageId_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA) { + return mergeFrom((de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA other) { + if (other == de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA.getDefaultInstance()) + return this; + if (other.hasName()) { + bitField0_ |= 0x00000001; + name_ = other.name_; + onChanged(); + } + if (other.hasMessageId()) { + setMessageId(other.getMessageId()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private int bitField0_; + + private java.lang.Object name_ = ""; + + /** + * optional string name = 1; + */ + public boolean hasName() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + + /** + * optional string name = 1; + */ + public java.lang.String getName() { + java.lang.Object ref = name_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + name_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + + /** + * optional string name = 1; + */ + public com.google.protobuf.ByteString getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + * optional string name = 1; + */ + public Builder setName( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + name_ = value; + onChanged(); + return this; + } + + /** + * optional string name = 1; + */ + public Builder clearName() { + bitField0_ = (bitField0_ & ~0x00000001); + name_ = getDefaultInstance().getName(); + onChanged(); + return this; + } + + /** + * optional string name = 1; + */ + public Builder setNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + name_ = value; + onChanged(); + return this; + } + + private int messageId_; + + /** + * optional uint32 message_id = 2; + */ + public boolean hasMessageId() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + + /** + * optional uint32 message_id = 2; + */ + public int getMessageId() { + return messageId_; + } + + /** + * optional uint32 message_id = 2; + */ + public Builder setMessageId(int value) { + bitField0_ |= 0x00000002; + messageId_ = value; + onChanged(); + return this; + } + + /** + * optional uint32 message_id = 2; + */ + public Builder clearMessageId() { + bitField0_ = (bitField0_ & ~0x00000002); + messageId_ = 0; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:ProtocolBuffers.SampleProtoA) + } + + static { + defaultInstance = new SampleProtoA(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:ProtocolBuffers.SampleProtoA) + } + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_ProtocolBuffers_SampleProtoA_descriptor; + private static com.google.protobuf.GeneratedMessage.FieldAccessorTable internal_static_ProtocolBuffers_SampleProtoA_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() { + return descriptor; + } + + private static com.google.protobuf.Descriptors.FileDescriptor descriptor; + static { + java.lang.String[] descriptorData = { + "\n\022SampleProtoA.proto\022\017ProtocolBuffers\"0\n" + + "\014SampleProtoA\022\014\n\004name\030\001 \001(\t\022\022\n\nmessage_i" + + "d\030\002 \001(\rB@\n&de.javakaffee.kryoserializers" + + ".protobufB\026SampleProtoAOuterClass" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[]{ + }, assigner); + internal_static_ProtocolBuffers_SampleProtoA_descriptor = getDescriptor().getMessageTypes().get(0); + internal_static_ProtocolBuffers_SampleProtoA_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_ProtocolBuffers_SampleProtoA_descriptor, + new java.lang.String[]{"Name", "MessageId",}); + } + + // @@protoc_insertion_point(outer_class_scope) } diff --git a/src/test/java/de/javakaffee/kryoserializers/protobuf/SampleProtoBOuterClass.java b/src/test/java/de/javakaffee/kryoserializers/protobuf/SampleProtoBOuterClass.java index cdc0d424..10d13a5d 100644 --- a/src/test/java/de/javakaffee/kryoserializers/protobuf/SampleProtoBOuterClass.java +++ b/src/test/java/de/javakaffee/kryoserializers/protobuf/SampleProtoBOuterClass.java @@ -1,787 +1,838 @@ -// Generated by the protocol buffer compiler. DO NOT EDIT! -// source: SampleProtoB.proto - +/* + * Copyright 2018 Martin Grotzke + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package de.javakaffee.kryoserializers.protobuf; public final class SampleProtoBOuterClass { - private SampleProtoBOuterClass() {} - public static void registerAllExtensions( - com.google.protobuf.ExtensionRegistry registry) { - } - public interface SampleProtoBOrBuilder extends - // @@protoc_insertion_point(interface_extends:ProtocolBuffers.SampleProtoB) - com.google.protobuf.MessageOrBuilder { - - /** - * required uint32 identifier = 1; - */ - boolean hasIdentifier(); - /** - * required uint32 identifier = 1; - */ - int getIdentifier(); - - /** - * required string state = 2; - */ - boolean hasState(); - /** - * required string state = 2; - */ - java.lang.String getState(); - /** - * required string state = 2; - */ - com.google.protobuf.ByteString - getStateBytes(); - - /** - * required string city = 3; - */ - boolean hasCity(); - /** - * required string city = 3; - */ - java.lang.String getCity(); - /** - * required string city = 3; - */ - com.google.protobuf.ByteString - getCityBytes(); - } - /** - * Protobuf type {@code ProtocolBuffers.SampleProtoB} - */ - public static final class SampleProtoB extends - com.google.protobuf.GeneratedMessage implements - // @@protoc_insertion_point(message_implements:ProtocolBuffers.SampleProtoB) - SampleProtoBOrBuilder { - // Use SampleProtoB.newBuilder() to construct. - private SampleProtoB(com.google.protobuf.GeneratedMessage.Builder builder) { - super(builder); - this.unknownFields = builder.getUnknownFields(); - } - private SampleProtoB(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } - - private static final SampleProtoB defaultInstance; - public static SampleProtoB getDefaultInstance() { - return defaultInstance; - } - - public SampleProtoB getDefaultInstanceForType() { - return defaultInstance; - } - - private final com.google.protobuf.UnknownFieldSet unknownFields; - @java.lang.Override - public final com.google.protobuf.UnknownFieldSet - getUnknownFields() { - return this.unknownFields; - } - private SampleProtoB( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - initFields(); - int mutable_bitField0_ = 0; - com.google.protobuf.UnknownFieldSet.Builder unknownFields = - com.google.protobuf.UnknownFieldSet.newBuilder(); - try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch (tag) { - case 0: - done = true; - break; - default: { - if (!parseUnknownField(input, unknownFields, - extensionRegistry, tag)) { - done = true; - } - break; - } - case 8: { - bitField0_ |= 0x00000001; - identifier_ = input.readUInt32(); - break; - } - case 18: { - com.google.protobuf.ByteString bs = input.readBytes(); - bitField0_ |= 0x00000002; - state_ = bs; - break; - } - case 26: { - com.google.protobuf.ByteString bs = input.readBytes(); - bitField0_ |= 0x00000004; - city_ = bs; - break; - } - } - } - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(this); - } catch (java.io.IOException e) { - throw new com.google.protobuf.InvalidProtocolBufferException( - e.getMessage()).setUnfinishedMessage(this); - } finally { - this.unknownFields = unknownFields.build(); - makeExtensionsImmutable(); - } - } - public static final com.google.protobuf.Descriptors.Descriptor - getDescriptor() { - return de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.internal_static_ProtocolBuffers_SampleProtoB_descriptor; - } - - protected com.google.protobuf.GeneratedMessage.FieldAccessorTable - internalGetFieldAccessorTable() { - return de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.internal_static_ProtocolBuffers_SampleProtoB_fieldAccessorTable - .ensureFieldAccessorsInitialized( - de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB.class, de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB.Builder.class); - } - - public static com.google.protobuf.Parser PARSER = - new com.google.protobuf.AbstractParser() { - public SampleProtoB parsePartialFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return new SampleProtoB(input, extensionRegistry); - } - }; - - @java.lang.Override - public com.google.protobuf.Parser getParserForType() { - return PARSER; - } - - private int bitField0_; - public static final int IDENTIFIER_FIELD_NUMBER = 1; - private int identifier_; - /** - * required uint32 identifier = 1; - */ - public boolean hasIdentifier() { - return ((bitField0_ & 0x00000001) == 0x00000001); - } - /** - * required uint32 identifier = 1; - */ - public int getIdentifier() { - return identifier_; - } - - public static final int STATE_FIELD_NUMBER = 2; - private java.lang.Object state_; - /** - * required string state = 2; - */ - public boolean hasState() { - return ((bitField0_ & 0x00000002) == 0x00000002); - } - /** - * required string state = 2; - */ - public java.lang.String getState() { - java.lang.Object ref = state_; - if (ref instanceof java.lang.String) { - return (java.lang.String) ref; - } else { - com.google.protobuf.ByteString bs = - (com.google.protobuf.ByteString) ref; - java.lang.String s = bs.toStringUtf8(); - if (bs.isValidUtf8()) { - state_ = s; - } - return s; - } - } - /** - * required string state = 2; - */ - public com.google.protobuf.ByteString - getStateBytes() { - java.lang.Object ref = state_; - if (ref instanceof java.lang.String) { - com.google.protobuf.ByteString b = - com.google.protobuf.ByteString.copyFromUtf8( - (java.lang.String) ref); - state_ = b; - return b; - } else { - return (com.google.protobuf.ByteString) ref; - } - } - - public static final int CITY_FIELD_NUMBER = 3; - private java.lang.Object city_; - /** - * required string city = 3; - */ - public boolean hasCity() { - return ((bitField0_ & 0x00000004) == 0x00000004); - } - /** - * required string city = 3; - */ - public java.lang.String getCity() { - java.lang.Object ref = city_; - if (ref instanceof java.lang.String) { - return (java.lang.String) ref; - } else { - com.google.protobuf.ByteString bs = - (com.google.protobuf.ByteString) ref; - java.lang.String s = bs.toStringUtf8(); - if (bs.isValidUtf8()) { - city_ = s; - } - return s; - } - } - /** - * required string city = 3; - */ - public com.google.protobuf.ByteString - getCityBytes() { - java.lang.Object ref = city_; - if (ref instanceof java.lang.String) { - com.google.protobuf.ByteString b = - com.google.protobuf.ByteString.copyFromUtf8( - (java.lang.String) ref); - city_ = b; - return b; - } else { - return (com.google.protobuf.ByteString) ref; - } - } - - private void initFields() { - identifier_ = 0; - state_ = ""; - city_ = ""; - } - private byte memoizedIsInitialized = -1; - public final boolean isInitialized() { - byte isInitialized = memoizedIsInitialized; - if (isInitialized == 1) return true; - if (isInitialized == 0) return false; - - if (!hasIdentifier()) { - memoizedIsInitialized = 0; - return false; - } - if (!hasState()) { - memoizedIsInitialized = 0; - return false; - } - if (!hasCity()) { - memoizedIsInitialized = 0; - return false; - } - memoizedIsInitialized = 1; - return true; - } - - public void writeTo(com.google.protobuf.CodedOutputStream output) - throws java.io.IOException { - getSerializedSize(); - if (((bitField0_ & 0x00000001) == 0x00000001)) { - output.writeUInt32(1, identifier_); - } - if (((bitField0_ & 0x00000002) == 0x00000002)) { - output.writeBytes(2, getStateBytes()); - } - if (((bitField0_ & 0x00000004) == 0x00000004)) { - output.writeBytes(3, getCityBytes()); - } - getUnknownFields().writeTo(output); - } - - private int memoizedSerializedSize = -1; - public int getSerializedSize() { - int size = memoizedSerializedSize; - if (size != -1) return size; - - size = 0; - if (((bitField0_ & 0x00000001) == 0x00000001)) { - size += com.google.protobuf.CodedOutputStream - .computeUInt32Size(1, identifier_); - } - if (((bitField0_ & 0x00000002) == 0x00000002)) { - size += com.google.protobuf.CodedOutputStream - .computeBytesSize(2, getStateBytes()); - } - if (((bitField0_ & 0x00000004) == 0x00000004)) { - size += com.google.protobuf.CodedOutputStream - .computeBytesSize(3, getCityBytes()); - } - size += getUnknownFields().getSerializedSize(); - memoizedSerializedSize = size; - return size; - } - - private static final long serialVersionUID = 0L; - @java.lang.Override - protected java.lang.Object writeReplace() - throws java.io.ObjectStreamException { - return super.writeReplace(); - } - - public static de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB parseFrom( - com.google.protobuf.ByteString data) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data); - } - public static de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB parseFrom( - com.google.protobuf.ByteString data, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data, extensionRegistry); - } - public static de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB parseFrom(byte[] data) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data); - } - public static de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB parseFrom( - byte[] data, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data, extensionRegistry); - } - public static de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB parseFrom(java.io.InputStream input) - throws java.io.IOException { - return PARSER.parseFrom(input); - } - public static de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB parseFrom( - java.io.InputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseFrom(input, extensionRegistry); - } - public static de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB parseDelimitedFrom(java.io.InputStream input) - throws java.io.IOException { - return PARSER.parseDelimitedFrom(input); - } - public static de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB parseDelimitedFrom( - java.io.InputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseDelimitedFrom(input, extensionRegistry); - } - public static de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB parseFrom( - com.google.protobuf.CodedInputStream input) - throws java.io.IOException { - return PARSER.parseFrom(input); - } - public static de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB parseFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseFrom(input, extensionRegistry); - } - - public static Builder newBuilder() { return Builder.create(); } - public Builder newBuilderForType() { return newBuilder(); } - public static Builder newBuilder(de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB prototype) { - return newBuilder().mergeFrom(prototype); - } - public Builder toBuilder() { return newBuilder(this); } - - @java.lang.Override - protected Builder newBuilderForType( - com.google.protobuf.GeneratedMessage.BuilderParent parent) { - Builder builder = new Builder(parent); - return builder; - } - /** - * Protobuf type {@code ProtocolBuffers.SampleProtoB} - */ - public static final class Builder extends - com.google.protobuf.GeneratedMessage.Builder implements - // @@protoc_insertion_point(builder_implements:ProtocolBuffers.SampleProtoB) - de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoBOrBuilder { - public static final com.google.protobuf.Descriptors.Descriptor - getDescriptor() { - return de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.internal_static_ProtocolBuffers_SampleProtoB_descriptor; - } - - protected com.google.protobuf.GeneratedMessage.FieldAccessorTable - internalGetFieldAccessorTable() { - return de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.internal_static_ProtocolBuffers_SampleProtoB_fieldAccessorTable - .ensureFieldAccessorsInitialized( - de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB.class, de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB.Builder.class); - } - - // Construct using de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB.newBuilder() - private Builder() { - maybeForceBuilderInitialization(); - } - - private Builder( - com.google.protobuf.GeneratedMessage.BuilderParent parent) { - super(parent); - maybeForceBuilderInitialization(); - } - private void maybeForceBuilderInitialization() { - if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { - } - } - private static Builder create() { - return new Builder(); - } - - public Builder clear() { - super.clear(); - identifier_ = 0; - bitField0_ = (bitField0_ & ~0x00000001); - state_ = ""; - bitField0_ = (bitField0_ & ~0x00000002); - city_ = ""; - bitField0_ = (bitField0_ & ~0x00000004); - return this; - } - - public Builder clone() { - return create().mergeFrom(buildPartial()); - } - - public com.google.protobuf.Descriptors.Descriptor - getDescriptorForType() { - return de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.internal_static_ProtocolBuffers_SampleProtoB_descriptor; - } - - public de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB getDefaultInstanceForType() { - return de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB.getDefaultInstance(); - } - - public de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB build() { - de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB result = buildPartial(); - if (!result.isInitialized()) { - throw newUninitializedMessageException(result); - } - return result; - } - - public de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB buildPartial() { - de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB result = new de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB(this); - int from_bitField0_ = bitField0_; - int to_bitField0_ = 0; - if (((from_bitField0_ & 0x00000001) == 0x00000001)) { - to_bitField0_ |= 0x00000001; - } - result.identifier_ = identifier_; - if (((from_bitField0_ & 0x00000002) == 0x00000002)) { - to_bitField0_ |= 0x00000002; - } - result.state_ = state_; - if (((from_bitField0_ & 0x00000004) == 0x00000004)) { - to_bitField0_ |= 0x00000004; - } - result.city_ = city_; - result.bitField0_ = to_bitField0_; - onBuilt(); - return result; - } - - public Builder mergeFrom(com.google.protobuf.Message other) { - if (other instanceof de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB) { - return mergeFrom((de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB)other); - } else { - super.mergeFrom(other); - return this; - } - } - - public Builder mergeFrom(de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB other) { - if (other == de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB.getDefaultInstance()) return this; - if (other.hasIdentifier()) { - setIdentifier(other.getIdentifier()); - } - if (other.hasState()) { - bitField0_ |= 0x00000002; - state_ = other.state_; - onChanged(); - } - if (other.hasCity()) { - bitField0_ |= 0x00000004; - city_ = other.city_; - onChanged(); - } - this.mergeUnknownFields(other.getUnknownFields()); - return this; - } - - public final boolean isInitialized() { - if (!hasIdentifier()) { - - return false; - } - if (!hasState()) { - - return false; - } - if (!hasCity()) { - - return false; - } - return true; - } - - public Builder mergeFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB parsedMessage = null; - try { - parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - parsedMessage = (de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB) e.getUnfinishedMessage(); - throw e; - } finally { - if (parsedMessage != null) { - mergeFrom(parsedMessage); - } - } - return this; - } - private int bitField0_; - - private int identifier_ ; - /** - * required uint32 identifier = 1; - */ - public boolean hasIdentifier() { - return ((bitField0_ & 0x00000001) == 0x00000001); - } - /** - * required uint32 identifier = 1; - */ - public int getIdentifier() { - return identifier_; - } - /** - * required uint32 identifier = 1; - */ - public Builder setIdentifier(int value) { - bitField0_ |= 0x00000001; - identifier_ = value; - onChanged(); - return this; - } - /** - * required uint32 identifier = 1; - */ - public Builder clearIdentifier() { - bitField0_ = (bitField0_ & ~0x00000001); - identifier_ = 0; - onChanged(); - return this; - } - - private java.lang.Object state_ = ""; - /** - * required string state = 2; - */ - public boolean hasState() { - return ((bitField0_ & 0x00000002) == 0x00000002); - } - /** - * required string state = 2; - */ - public java.lang.String getState() { - java.lang.Object ref = state_; - if (!(ref instanceof java.lang.String)) { - com.google.protobuf.ByteString bs = - (com.google.protobuf.ByteString) ref; - java.lang.String s = bs.toStringUtf8(); - if (bs.isValidUtf8()) { - state_ = s; - } - return s; - } else { - return (java.lang.String) ref; - } - } - /** - * required string state = 2; - */ - public com.google.protobuf.ByteString - getStateBytes() { - java.lang.Object ref = state_; - if (ref instanceof String) { - com.google.protobuf.ByteString b = - com.google.protobuf.ByteString.copyFromUtf8( - (java.lang.String) ref); - state_ = b; - return b; - } else { - return (com.google.protobuf.ByteString) ref; - } - } - /** - * required string state = 2; - */ - public Builder setState( - java.lang.String value) { - if (value == null) { - throw new NullPointerException(); - } - bitField0_ |= 0x00000002; - state_ = value; - onChanged(); - return this; - } - /** - * required string state = 2; - */ - public Builder clearState() { - bitField0_ = (bitField0_ & ~0x00000002); - state_ = getDefaultInstance().getState(); - onChanged(); - return this; - } - /** - * required string state = 2; - */ - public Builder setStateBytes( - com.google.protobuf.ByteString value) { - if (value == null) { - throw new NullPointerException(); - } - bitField0_ |= 0x00000002; - state_ = value; - onChanged(); - return this; - } - - private java.lang.Object city_ = ""; - /** - * required string city = 3; - */ - public boolean hasCity() { - return ((bitField0_ & 0x00000004) == 0x00000004); - } - /** - * required string city = 3; - */ - public java.lang.String getCity() { - java.lang.Object ref = city_; - if (!(ref instanceof java.lang.String)) { - com.google.protobuf.ByteString bs = - (com.google.protobuf.ByteString) ref; - java.lang.String s = bs.toStringUtf8(); - if (bs.isValidUtf8()) { - city_ = s; - } - return s; - } else { - return (java.lang.String) ref; - } - } - /** - * required string city = 3; - */ - public com.google.protobuf.ByteString - getCityBytes() { - java.lang.Object ref = city_; - if (ref instanceof String) { - com.google.protobuf.ByteString b = - com.google.protobuf.ByteString.copyFromUtf8( - (java.lang.String) ref); - city_ = b; - return b; - } else { - return (com.google.protobuf.ByteString) ref; - } - } - /** - * required string city = 3; - */ - public Builder setCity( - java.lang.String value) { - if (value == null) { - throw new NullPointerException(); - } - bitField0_ |= 0x00000004; - city_ = value; - onChanged(); - return this; - } - /** - * required string city = 3; - */ - public Builder clearCity() { - bitField0_ = (bitField0_ & ~0x00000004); - city_ = getDefaultInstance().getCity(); - onChanged(); - return this; - } - /** - * required string city = 3; - */ - public Builder setCityBytes( - com.google.protobuf.ByteString value) { - if (value == null) { - throw new NullPointerException(); - } - bitField0_ |= 0x00000004; - city_ = value; - onChanged(); - return this; - } - - // @@protoc_insertion_point(builder_scope:ProtocolBuffers.SampleProtoB) - } - - static { - defaultInstance = new SampleProtoB(true); - defaultInstance.initFields(); - } - - // @@protoc_insertion_point(class_scope:ProtocolBuffers.SampleProtoB) - } - - private static final com.google.protobuf.Descriptors.Descriptor - internal_static_ProtocolBuffers_SampleProtoB_descriptor; - private static - com.google.protobuf.GeneratedMessage.FieldAccessorTable - internal_static_ProtocolBuffers_SampleProtoB_fieldAccessorTable; - - public static com.google.protobuf.Descriptors.FileDescriptor - getDescriptor() { - return descriptor; - } - private static com.google.protobuf.Descriptors.FileDescriptor - descriptor; - static { - java.lang.String[] descriptorData = { - "\n\022SampleProtoB.proto\022\017ProtocolBuffers\"?\n" + - "\014SampleProtoB\022\022\n\nidentifier\030\001 \002(\r\022\r\n\005sta" + - "te\030\002 \002(\t\022\014\n\004city\030\003 \002(\tB@\n&de.javakaffee." + - "kryoserializers.protobufB\026SampleProtoBOu" + - "terClass" - }; - com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = - new com.google.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() { - public com.google.protobuf.ExtensionRegistry assignDescriptors( - com.google.protobuf.Descriptors.FileDescriptor root) { - descriptor = root; - return null; - } - }; - com.google.protobuf.Descriptors.FileDescriptor - .internalBuildGeneratedFileFrom(descriptorData, - new com.google.protobuf.Descriptors.FileDescriptor[] { - }, assigner); - internal_static_ProtocolBuffers_SampleProtoB_descriptor = - getDescriptor().getMessageTypes().get(0); - internal_static_ProtocolBuffers_SampleProtoB_fieldAccessorTable = new - com.google.protobuf.GeneratedMessage.FieldAccessorTable( - internal_static_ProtocolBuffers_SampleProtoB_descriptor, - new java.lang.String[] { "Identifier", "State", "City", }); - } - - // @@protoc_insertion_point(outer_class_scope) + private SampleProtoBOuterClass() {} + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) {} + + public interface SampleProtoBOrBuilder extends + // @@protoc_insertion_point(interface_extends:ProtocolBuffers.SampleProtoB) + com.google.protobuf.MessageOrBuilder { + + /** + * required uint32 identifier = 1; + */ + boolean hasIdentifier(); + + /** + * required uint32 identifier = 1; + */ + int getIdentifier(); + + /** + * required string state = 2; + */ + boolean hasState(); + + /** + * required string state = 2; + */ + java.lang.String getState(); + + /** + * required string state = 2; + */ + com.google.protobuf.ByteString getStateBytes(); + + /** + * required string city = 3; + */ + boolean hasCity(); + + /** + * required string city = 3; + */ + java.lang.String getCity(); + + /** + * required string city = 3; + */ + com.google.protobuf.ByteString getCityBytes(); + } + + /** + * Protobuf type {@code ProtocolBuffers.SampleProtoB} + */ + public static final class SampleProtoB extends + com.google.protobuf.GeneratedMessage implements + // @@protoc_insertion_point(message_implements:ProtocolBuffers.SampleProtoB) + SampleProtoBOrBuilder { + // Use SampleProtoB.newBuilder() to construct. + private SampleProtoB(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + + private SampleProtoB(boolean noInit) { + this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); + } + + private static final SampleProtoB defaultInstance; + + public static SampleProtoB getDefaultInstance() { + return defaultInstance; + } + + public SampleProtoB getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet getUnknownFields() { + return this.unknownFields; + } + + private SampleProtoB( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + bitField0_ |= 0x00000001; + identifier_ = input.readUInt32(); + break; + } + case 18: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000002; + state_ = bs; + break; + } + case 26: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000004; + city_ = bs; + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.internal_static_ProtocolBuffers_SampleProtoB_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable internalGetFieldAccessorTable() { + return de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.internal_static_ProtocolBuffers_SampleProtoB_fieldAccessorTable + .ensureFieldAccessorsInitialized( + de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB.class, de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() { + public SampleProtoB parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new SampleProtoB(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + public static final int IDENTIFIER_FIELD_NUMBER = 1; + private int identifier_; + + /** + * required uint32 identifier = 1; + */ + public boolean hasIdentifier() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + + /** + * required uint32 identifier = 1; + */ + public int getIdentifier() { + return identifier_; + } + + public static final int STATE_FIELD_NUMBER = 2; + private java.lang.Object state_; + + /** + * required string state = 2; + */ + public boolean hasState() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + + /** + * required string state = 2; + */ + public java.lang.String getState() { + java.lang.Object ref = state_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + state_ = s; + } + return s; + } + } + + /** + * required string state = 2; + */ + public com.google.protobuf.ByteString getStateBytes() { + java.lang.Object ref = state_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + state_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int CITY_FIELD_NUMBER = 3; + private java.lang.Object city_; + + /** + * required string city = 3; + */ + public boolean hasCity() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + + /** + * required string city = 3; + */ + public java.lang.String getCity() { + java.lang.Object ref = city_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + city_ = s; + } + return s; + } + } + + /** + * required string city = 3; + */ + public com.google.protobuf.ByteString getCityBytes() { + java.lang.Object ref = city_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + city_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private void initFields() { + identifier_ = 0; + state_ = ""; + city_ = ""; + } + + private byte memoizedIsInitialized = -1; + + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) + return true; + if (isInitialized == 0) + return false; + + if (!hasIdentifier()) { + memoizedIsInitialized = 0; + return false; + } + if (!hasState()) { + memoizedIsInitialized = 0; + return false; + } + if (!hasCity()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeUInt32(1, identifier_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, getStateBytes()); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeBytes(3, getCityBytes()); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) + return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(1, identifier_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, getStateBytes()); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(3, getCityBytes()); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + + public static de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + + public static de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + + public static de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + + public static de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { + return Builder.create(); + } + + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder(de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB prototype) { + return newBuilder().mergeFrom(prototype); + } + + public Builder toBuilder() { + return newBuilder(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + + /** + * Protobuf type {@code ProtocolBuffers.SampleProtoB} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder implements + // @@protoc_insertion_point(builder_implements:ProtocolBuffers.SampleProtoB) + de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoBOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.internal_static_ProtocolBuffers_SampleProtoB_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable internalGetFieldAccessorTable() { + return de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.internal_static_ProtocolBuffers_SampleProtoB_fieldAccessorTable + .ensureFieldAccessorsInitialized( + de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB.class, de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB.Builder.class); + } + + // Construct using de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {} + } + + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + identifier_ = 0; + bitField0_ = (bitField0_ & ~0x00000001); + state_ = ""; + bitField0_ = (bitField0_ & ~0x00000002); + city_ = ""; + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.internal_static_ProtocolBuffers_SampleProtoB_descriptor; + } + + public de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB getDefaultInstanceForType() { + return de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB.getDefaultInstance(); + } + + public de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB build() { + de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB buildPartial() { + de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB result = new de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.identifier_ = identifier_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.state_ = state_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.city_ = city_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB) { + return mergeFrom((de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB other) { + if (other == de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB.getDefaultInstance()) + return this; + if (other.hasIdentifier()) { + setIdentifier(other.getIdentifier()); + } + if (other.hasState()) { + bitField0_ |= 0x00000002; + state_ = other.state_; + onChanged(); + } + if (other.hasCity()) { + bitField0_ |= 0x00000004; + city_ = other.city_; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + if (!hasIdentifier()) { + + return false; + } + if (!hasState()) { + + return false; + } + if (!hasCity()) { + + return false; + } + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private int bitField0_; + + private int identifier_; + + /** + * required uint32 identifier = 1; + */ + public boolean hasIdentifier() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + + /** + * required uint32 identifier = 1; + */ + public int getIdentifier() { + return identifier_; + } + + /** + * required uint32 identifier = 1; + */ + public Builder setIdentifier(int value) { + bitField0_ |= 0x00000001; + identifier_ = value; + onChanged(); + return this; + } + + /** + * required uint32 identifier = 1; + */ + public Builder clearIdentifier() { + bitField0_ = (bitField0_ & ~0x00000001); + identifier_ = 0; + onChanged(); + return this; + } + + private java.lang.Object state_ = ""; + + /** + * required string state = 2; + */ + public boolean hasState() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + + /** + * required string state = 2; + */ + public java.lang.String getState() { + java.lang.Object ref = state_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + state_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + + /** + * required string state = 2; + */ + public com.google.protobuf.ByteString getStateBytes() { + java.lang.Object ref = state_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + state_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + * required string state = 2; + */ + public Builder setState( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + state_ = value; + onChanged(); + return this; + } + + /** + * required string state = 2; + */ + public Builder clearState() { + bitField0_ = (bitField0_ & ~0x00000002); + state_ = getDefaultInstance().getState(); + onChanged(); + return this; + } + + /** + * required string state = 2; + */ + public Builder setStateBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + state_ = value; + onChanged(); + return this; + } + + private java.lang.Object city_ = ""; + + /** + * required string city = 3; + */ + public boolean hasCity() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + + /** + * required string city = 3; + */ + public java.lang.String getCity() { + java.lang.Object ref = city_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + city_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + + /** + * required string city = 3; + */ + public com.google.protobuf.ByteString getCityBytes() { + java.lang.Object ref = city_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + city_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + * required string city = 3; + */ + public Builder setCity( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + city_ = value; + onChanged(); + return this; + } + + /** + * required string city = 3; + */ + public Builder clearCity() { + bitField0_ = (bitField0_ & ~0x00000004); + city_ = getDefaultInstance().getCity(); + onChanged(); + return this; + } + + /** + * required string city = 3; + */ + public Builder setCityBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + city_ = value; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:ProtocolBuffers.SampleProtoB) + } + + static { + defaultInstance = new SampleProtoB(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:ProtocolBuffers.SampleProtoB) + } + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_ProtocolBuffers_SampleProtoB_descriptor; + private static com.google.protobuf.GeneratedMessage.FieldAccessorTable internal_static_ProtocolBuffers_SampleProtoB_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() { + return descriptor; + } + + private static com.google.protobuf.Descriptors.FileDescriptor descriptor; + static { + java.lang.String[] descriptorData = { + "\n\022SampleProtoB.proto\022\017ProtocolBuffers\"?\n" + + "\014SampleProtoB\022\022\n\nidentifier\030\001 \002(\r\022\r\n\005sta" + + "te\030\002 \002(\t\022\014\n\004city\030\003 \002(\tB@\n&de.javakaffee." + + "kryoserializers.protobufB\026SampleProtoBOu" + + "terClass" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[]{ + }, assigner); + internal_static_ProtocolBuffers_SampleProtoB_descriptor = getDescriptor().getMessageTypes().get(0); + internal_static_ProtocolBuffers_SampleProtoB_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_ProtocolBuffers_SampleProtoB_descriptor, + new java.lang.String[]{"Identifier", "State", "City",}); + } + + // @@protoc_insertion_point(outer_class_scope) } diff --git a/src/test/java/de/javakaffee/kryoserializers/wicket/MiniMapSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/wicket/MiniMapSerializerTest.java index a8a2fd4e..18a5747c 100644 --- a/src/test/java/de/javakaffee/kryoserializers/wicket/MiniMapSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/wicket/MiniMapSerializerTest.java @@ -1,5 +1,5 @@ /* -* Copyright 2010 Martin Grotzke + * Copyright 2018 Martin Grotzke * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,67 +32,67 @@ /** * Test for {@link JodaDateTimeSerializer}. - * + * * @author Martin Grotzke */ public class MiniMapSerializerTest { - - private Kryo _kryo; - @BeforeTest - protected void beforeTest() { - _kryo = new Kryo(); - _kryo.register( MiniMap.class, new MiniMapSerializer() ); - } + private Kryo _kryo; + + @BeforeTest + protected void beforeTest() { + _kryo = new Kryo(); + _kryo.register(MiniMap.class, new MiniMapSerializer()); + } + + @Test(enabled = true) + public void testMiniMapEmpty() { + final MiniMap obj = new MiniMap(0); + final byte[] serialized = serialize(_kryo, obj); + final MiniMap deserialized = deserialize(_kryo, serialized, MiniMap.class); + Assert.assertEquals(deserialized.size(), obj.size()); + } - @Test( enabled = true ) - public void testMiniMapEmpty() { - final MiniMap obj = new MiniMap( 0 ); - final byte[] serialized = serialize( _kryo, obj ); - final MiniMap deserialized = deserialize( _kryo, serialized, MiniMap.class ); - Assert.assertEquals( deserialized.size(), obj.size() ); - } + @Test(enabled = true) + public void testMiniMapExactNumberOfEntries() { + final MiniMap obj = new MiniMap(1); + obj.put("foo", "bar"); + final byte[] serialized = serialize(_kryo, obj); + final MiniMap deserialized = deserialize(_kryo, serialized, MiniMap.class); + Assert.assertEquals(deserialized.size(), obj.size()); + final Entry deserializedNext = deserialized.entrySet().iterator().next(); + final Entry origNext = obj.entrySet().iterator().next(); + Assert.assertEquals(deserializedNext.getKey(), origNext.getKey()); + Assert.assertEquals(deserializedNext.getValue(), origNext.getValue()); + } - @Test( enabled = true ) - public void testMiniMapExactNumberOfEntries() { - final MiniMap obj = new MiniMap( 1 ); - obj.put( "foo", "bar" ); - final byte[] serialized = serialize( _kryo, obj ); - final MiniMap deserialized = deserialize( _kryo, serialized, MiniMap.class ); - Assert.assertEquals( deserialized.size(), obj.size() ); - final Entry deserializedNext = deserialized.entrySet().iterator().next(); - final Entry origNext = obj.entrySet().iterator().next(); - Assert.assertEquals( deserializedNext.getKey(), origNext.getKey() ); - Assert.assertEquals( deserializedNext.getValue(), origNext.getValue() ); - } + @Test(enabled = true) + public void testMiniMapLessThanMaxEntries() { + final MiniMap obj = new MiniMap(2); + obj.put("foo", "bar"); + final byte[] serialized = serialize(_kryo, obj); + final MiniMap deserialized = deserialize(_kryo, serialized, MiniMap.class); + Assert.assertEquals(deserialized.size(), obj.size()); + } - @Test( enabled = true ) - public void testMiniMapLessThanMaxEntries() { - final MiniMap obj = new MiniMap( 2 ); - obj.put( "foo", "bar" ); - final byte[] serialized = serialize( _kryo, obj ); - final MiniMap deserialized = deserialize( _kryo, serialized, MiniMap.class ); - Assert.assertEquals( deserialized.size(), obj.size() ); - } + @SuppressWarnings("unchecked") + @Test(enabled = true) + public void testMiniMapAddEntriesAfterDeserialization() { + final MiniMap obj = new MiniMap(2); + obj.put("foo", "bar"); + final byte[] serialized = serialize(_kryo, obj); + final MiniMap deserialized = deserialize(_kryo, serialized, MiniMap.class); + Assert.assertEquals(deserialized.size(), obj.size()); - @SuppressWarnings("unchecked") - @Test( enabled = true ) - public void testMiniMapAddEntriesAfterDeserialization() { - final MiniMap obj = new MiniMap( 2 ); - obj.put( "foo", "bar" ); - final byte[] serialized = serialize( _kryo, obj ); - final MiniMap deserialized = deserialize( _kryo, serialized, MiniMap.class ); - Assert.assertEquals( deserialized.size(), obj.size() ); - - deserialized.put( "bar", "baz" ); - try { - deserialized.put( "this should", "fail" ); - Assert.fail( "We told the orig MiniMap to accept 2 entries at max," + - " therefore we should not be allowed to put more." ); - } catch( final RuntimeException e ) { - // this is expected - didn't use @Test.expectedExceptions - // as this would tie us to the exactly thrown exception - } - } + deserialized.put("bar", "baz"); + try { + deserialized.put("this should", "fail"); + Assert.fail("We told the orig MiniMap to accept 2 entries at max," + + " therefore we should not be allowed to put more."); + } catch (final RuntimeException e) { + // this is expected - didn't use @Test.expectedExceptions + // as this would tie us to the exactly thrown exception + } + } } diff --git a/src/test/java/de/javakaffee/kryoserializers/wicket/WicketTest.java b/src/test/java/de/javakaffee/kryoserializers/wicket/WicketTest.java index 6af420d7..a1b4701e 100644 --- a/src/test/java/de/javakaffee/kryoserializers/wicket/WicketTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/wicket/WicketTest.java @@ -1,5 +1,5 @@ /* -* Copyright 2010 Martin Grotzke + * Copyright 2018 Martin Grotzke * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,9 +16,8 @@ */ package de.javakaffee.kryoserializers.wicket; -import com.esotericsoftware.kryo.Kryo; -import com.esotericsoftware.kryo.Serializer; -import com.esotericsoftware.kryo.serializers.FieldSerializer; +import static de.javakaffee.kryoserializers.KryoTest.deserialize; +import static de.javakaffee.kryoserializers.KryoTest.serialize; import org.apache.wicket.Component; import org.apache.wicket.MarkupContainer; @@ -32,90 +31,91 @@ import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; +import com.esotericsoftware.kryo.Kryo; +import com.esotericsoftware.kryo.Serializer; +import com.esotericsoftware.kryo.serializers.FieldSerializer; + import de.javakaffee.kryoserializers.KryoReflectionFactorySupport; import de.javakaffee.kryoserializers.KryoTest; -import static de.javakaffee.kryoserializers.KryoTest.deserialize; -import static de.javakaffee.kryoserializers.KryoTest.serialize; - /** * A general test for several wicket serializations that don't require * specific serializers. - * + * * @author Martin Grotzke */ public class WicketTest { - public static final String SERIALIZED_CLASS_NAME = MarkupContainer.class.getName() + "$ChildList"; - - private Kryo _kryo; - private WicketTester _wicketTester; - - @BeforeTest - @SuppressWarnings( "unchecked" ) - protected void beforeTest() { - _kryo = new KryoReflectionFactorySupport() { - - @SuppressWarnings("rawtypes") - @Override - public Serializer getDefaultSerializer( final Class type ) { - if ( SERIALIZED_CLASS_NAME.equals( type.getName() ) ) { - return new FieldSerializer( this, type ); - } - return super.getDefaultSerializer(type); - } - - }; - _kryo.setRegistrationRequired( false ); - - final WebApplication application = new WebApplication() { - - @Override - public Class getHomePage() { - return null; - } - - }; - - _wicketTester = new WicketTester( application ); - } - - @AfterTest - protected void afterTest() { - _wicketTester.destroy(); - } - - /** - * Tests that MarkupContainer.ChildList is serialized/deserialized correctly. - * It needs ReflectionFactory support, ReferenceFieldSerializer as default - * serializer and the FieldSerializer for MarkupContainer.ChildList (instead of - * default CollectionSerializer). - * - * @throws Exception - */ - @Test( enabled = true ) - public void testMarkupContainerChildList() throws Exception { - final MarkupContainer markupContainer = new WebMarkupContainer("foo"); - markupContainer.add( new Label( "label1", "foo" ) ); - markupContainer.add( new Label( "label", "hello" ) ); - final byte[] serialized = serialize( _kryo, markupContainer ); - final MarkupContainer deserialized = deserialize( _kryo, serialized, markupContainer.getClass() ); - KryoTest.assertDeepEquals( deserialized, markupContainer ); - } - - @Test( enabled = true ) - public void testFeedbackPanel() throws Exception { - final FeedbackPanel markupContainer = new FeedbackPanel("foo"); - //markupContainer.info( "foo" ); - final Component child = markupContainer.get( "feedbackul" ); - child.isVisible(); - final byte[] serialized = serialize( _kryo, markupContainer ); - final MarkupContainer deserialized = deserialize( _kryo, serialized, markupContainer.getClass() ); - - final Component deserializedChild = deserialized.get( "feedbackul" ); - deserializedChild.isVisible(); - - KryoTest.assertDeepEquals( deserialized, markupContainer ); - } + public static final String SERIALIZED_CLASS_NAME = MarkupContainer.class.getName() + "$ChildList"; + + private Kryo _kryo; + private WicketTester _wicketTester; + + @BeforeTest + @SuppressWarnings("unchecked") + protected void beforeTest() { + _kryo = new KryoReflectionFactorySupport() { + + @SuppressWarnings("rawtypes") + @Override + public Serializer getDefaultSerializer(final Class type) { + if (SERIALIZED_CLASS_NAME.equals(type.getName())) { + return new FieldSerializer(this, type); + } + return super.getDefaultSerializer(type); + } + + }; + _kryo.setRegistrationRequired(false); + + final WebApplication application = new WebApplication() { + + @Override + public Class getHomePage() { + return null; + } + + }; + + _wicketTester = new WicketTester(application); + } + + @AfterTest + protected void afterTest() { + _wicketTester.destroy(); + } + + /** + * Tests that MarkupContainer.ChildList is serialized/deserialized correctly. + * It needs ReflectionFactory support, ReferenceFieldSerializer as default + * serializer and the FieldSerializer for MarkupContainer.ChildList (instead of + * default CollectionSerializer). + * + * @throws Exception + */ + @Test(enabled = true) + public void testMarkupContainerChildList() throws Exception { + final MarkupContainer markupContainer = new WebMarkupContainer("foo"); + markupContainer.add(new Label("label1", "foo")); + markupContainer.add(new Label("label", "hello")); + final byte[] serialized = serialize(_kryo, markupContainer); + final MarkupContainer deserialized = deserialize(_kryo, serialized, markupContainer.getClass()); + KryoTest.assertDeepEquals(deserialized, markupContainer); + } + + @Test(enabled = true) + public void testFeedbackPanel() throws Exception { + final FeedbackPanel markupContainer = new FeedbackPanel("foo"); + //markupContainer.info( "foo" ); + final Component child = markupContainer.get("feedbackul"); + child.isVisible(); + final byte[] serialized = serialize(_kryo, markupContainer); + final MarkupContainer deserialized = deserialize(_kryo, serialized, markupContainer.getClass()); + + final Component deserializedChild = deserialized.get("feedbackul"); + deserializedChild.isVisible(); + + KryoTest.assertDeepEquals(deserialized, markupContainer); + } } From 2fd8ac666e9a9493e0718b474233e2e09efbfcdd Mon Sep 17 00:00:00 2001 From: Mitchell Skaggs Date: Thu, 1 Feb 2018 19:26:52 -0600 Subject: [PATCH 08/13] Finalized Intellij and Spotless formatting rules, updated dependencies, added ProtoBuf plugin instead of precompiled classes so newer ProtoBuf versions can be used --- .gitignore | 22 +- .idea/codeStyles/Project.xml | 60 ++ .idea/codeStyles/codeStyleConfig.xml | 5 + build.gradle | 24 +- spotless.eclipseformat.xml | 326 ++++--- .../ArraysAsListSerializer.java | 46 +- .../CollectionsEmptyListSerializer.java | 3 +- .../CollectionsEmptyMapSerializer.java | 3 +- .../CollectionsEmptySetSerializer.java | 3 +- .../CollectionsSingletonListSerializer.java | 3 +- ...eldSerializerReflectionFactorySupport.java | 1 + .../kryoserializers/EnumMapSerializer.java | 13 +- .../kryoserializers/EnumSetSerializer.java | 2 +- .../FieldAnnotationAwareSerializer.java | 66 +- .../kryoserializers/JdkProxySerializer.java | 8 +- .../KryoReflectionFactorySupport.java | 68 +- .../kryoserializers/SubListSerializers.java | 15 +- .../SynchronizedCollectionsSerializer.java | 79 +- .../UnicodeBlockSerializer.java | 7 +- .../UnmodifiableCollectionsSerializer.java | 8 +- .../cglib/CGLibProxySerializer.java | 13 +- .../kryoserializers/dexx/ListSerializer.java | 36 +- .../kryoserializers/dexx/MapSerializer.java | 40 +- .../kryoserializers/dexx/SetSerializer.java | 38 +- .../guava/ArrayListMultimapSerializer.java | 23 +- .../guava/HashMultimapSerializer.java | 20 +- .../guava/ImmutableListSerializer.java | 42 +- .../guava/ImmutableMapSerializer.java | 24 +- .../guava/ImmutableMultimapSerializer.java | 62 +- .../guava/ImmutableSetSerializer.java | 39 +- .../guava/ImmutableSortedMapSerializer.java | 25 +- .../guava/ImmutableSortedSetSerializer.java | 41 +- .../guava/LinkedHashMultimapSerializer.java | 23 +- .../guava/LinkedListMultimapSerializer.java | 23 +- .../guava/ReverseListSerializer.java | 26 +- .../guava/TreeMultimapSerializer.java | 23 +- .../UnmodifiableNavigableSetSerializer.java | 30 +- .../jodatime/JodaDateTimeSerializer.java | 9 +- .../jodatime/JodaIntervalSerializer.java | 10 +- .../jodatime/JodaLocalDateSerializer.java | 22 +- .../jodatime/JodaLocalDateTimeSerializer.java | 25 +- .../protobuf/ProtobufSerializer.java | 13 +- .../EnumMapSerializerTest.java | 44 +- .../FieldAnnotationAwareSerializerTest.java | 32 +- .../javakaffee/kryoserializers/KryoTest.java | 112 +-- .../SubListSerializersTest.java | 20 +- .../kryoserializers/TestClasses.java | 133 ++- .../UnicodeBlockSerializerTest.java | 16 +- .../cglib/CGLibProxySerializerTest.java | 33 +- .../cglib/CustomClassLoader.java | 24 +- .../dexx/ListSerializerTest.java | 4 +- .../dexx/MapSerializerTest.java | 2 +- .../ArrayListMultimapSerializerTest.java | 3 +- .../guava/ImmutableListSerializerTest.java | 6 +- .../guava/ImmutableMapSerializerTest.java | 18 +- .../guava/ImmutableSetSerializerTest.java | 2 +- .../ImmutableSortedMapSerializerTest.java | 22 +- .../ImmutableSortedSetSerializerTest.java | 4 +- .../LinkedHashMultimapSerializerTest.java | 3 +- .../LinkedListMultimapSerializerTest.java | 3 +- .../guava/MultimapSerializerTestBase.java | 25 +- .../guava/TreeMultimapSerializerTest.java | 5 +- ...nmodifiableNavigableSetSerializerTest.java | 48 +- .../jodatime/JodaIntervalSerializerTest.java | 1 - .../jodatime/JodaLocalTimeSerializerTest.java | 4 +- .../protobuf/ProtobufSerializerTest.java | 62 +- .../protobuf/SampleProtoAOuterClass.java | 652 -------------- .../protobuf/SampleProtoBOuterClass.java | 838 ------------------ .../wicket/MiniMapSerializerTest.java | 4 +- .../{resources => proto}/SampleProtoA.proto | 4 +- .../{resources => proto}/SampleProtoB.proto | 4 +- 71 files changed, 1047 insertions(+), 2450 deletions(-) create mode 100644 .idea/codeStyles/Project.xml create mode 100644 .idea/codeStyles/codeStyleConfig.xml delete mode 100644 src/test/java/de/javakaffee/kryoserializers/protobuf/SampleProtoAOuterClass.java delete mode 100644 src/test/java/de/javakaffee/kryoserializers/protobuf/SampleProtoBOuterClass.java rename src/test/{resources => proto}/SampleProtoA.proto (65%) rename src/test/{resources => proto}/SampleProtoB.proto (68%) diff --git a/.gitignore b/.gitignore index e8892c08..1b267076 100644 --- a/.gitignore +++ b/.gitignore @@ -112,27 +112,11 @@ crashlytics-build.properties fabric.properties ### Java template # Compiled class file -*.class - # Log file -*.log - # BlueJ files -*.ctxt - # Mobile Tools for Java (J2ME) -.mtj.tmp/ - # Package Files # -*.jar -*.war -*.ear -*.zip -*.tar.gz -*.rar - # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* ### Gradle template .gradle /build/ @@ -176,5 +160,7 @@ Network Trash Folder Temporary Items .apdisk -.idea/ -target/ \ No newline at end of file +/.idea/* +!/.idea/codeStyles + +target/ diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 00000000..c2c4bac3 --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 00000000..79ee123c --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index 8c3361cf..aaa132c6 100644 --- a/build.gradle +++ b/build.gradle @@ -1,8 +1,10 @@ plugins { + id 'idea' id 'java-library' id 'maven-publish' id 'com.diffplug.gradle.spotless' version '3.8.0' id 'com.github.ben-manes.versions' version '0.17.0' + id "com.google.protobuf" version "0.8.4" } group = 'de.javakaffee' @@ -31,6 +33,8 @@ task javadocJar(type: Jar, dependsOn: javadoc) { ]) } } +sourceSets.main.java.srcDirs 'build/generated/source/proto/main/java' +sourceSets.test.java.srcDirs 'build/generated/source/proto/test/java' compileJava { // Disable warnings about Sun classes (ReflectionFactory). @@ -42,13 +46,13 @@ compileJava { options.forkOptions.executable = 'javac' } +protobuf { protoc { artifact = 'com.google.protobuf:protoc:3.5.1-1' } } + publishing { publications { maven(MavenPublication) { from components.java - //noinspection GroovyAssignabilityCheck artifact sourcesJar - //noinspection GroovyAssignabilityCheck artifact javadocJar } } @@ -73,17 +77,18 @@ dependencies { // Testing - testImplementation 'org.testng:testng:6.13.1' + testImplementation 'org.testng:testng:6.14.1' testImplementation 'junit:junit:4.12' testImplementation optionalDependencies testImplementation 'javax.servlet:javax.servlet-api:4.0.0' - testImplementation 'org.slf4j:slf4j-simple:1.8.0-beta0' + testImplementation 'org.slf4j:slf4j-simple:1.8.0-beta1' testImplementation 'org.apache.commons:commons-lang3:3.7' } spotless { + enforceCheck false java { it.with { licenseHeaderFile 'spotless.license' @@ -91,6 +96,17 @@ spotless { eclipse().configFile 'spotless.eclipseformat.xml' trimTrailingWhitespace() removeUnusedImports() + endWithNewline() + + // Eclipse formatter removes whitespace in a for loop without an increment. + // for(int i = 0; i < 10;) // what Eclipse does + // for(int i = 0; i < 10; ) // what I wish Eclipse did + custom 'For loop fix', { it.replace(';)', '; )') } + + ignoreErrorForPath 'build/generated/source/proto/test/java/de/javakaffee/kryoserializers/protobuf/SampleProtoAOuterClass.java' + ignoreErrorForPath 'build/generated/source/proto/test/java/de/javakaffee/kryoserializers/protobuf/SampleProtoBOuterClass.java' + ignoreErrorForPath 'build\\generated\\source\\proto\\test\\java\\de\\javakaffee\\kryoserializers\\protobuf\\SampleProtoAOuterClass.java' + ignoreErrorForPath 'build\\generated\\source\\proto\\test\\java\\de\\javakaffee\\kryoserializers\\protobuf\\SampleProtoBOuterClass.java' } } groovyGradle { diff --git a/spotless.eclipseformat.xml b/spotless.eclipseformat.xml index ecfc4323..f130329f 100644 --- a/spotless.eclipseformat.xml +++ b/spotless.eclipseformat.xml @@ -3,30 +3,39 @@ - - - + + + - + - + - - + + - + - + @@ -34,32 +43,42 @@ - + - + - + - + - - + + - + - + - - + + @@ -68,34 +87,46 @@ - - + + - + - + - + - + - + - + - - - + + + - + @@ -103,18 +134,22 @@ - + - + - + - + @@ -127,65 +162,81 @@ - + - - + + - - + + - - + + - - + + - + - + - + - - + + - + - + - - + + - + - + - + @@ -195,90 +246,132 @@ - + - + - - + + - - + + - - + + - + - + - + - + - - - + + + - - - + + + - - - - - - + + + + + + - + - + - + - + - - + + - - + + - + - + - + - + - + - - - - + + + + @@ -287,27 +380,40 @@ - + - - - - - + + + + + - - + + - + - + - + - - + + diff --git a/src/main/java/de/javakaffee/kryoserializers/ArraysAsListSerializer.java b/src/main/java/de/javakaffee/kryoserializers/ArraysAsListSerializer.java index 8867fe01..ef01d621 100644 --- a/src/main/java/de/javakaffee/kryoserializers/ArraysAsListSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/ArraysAsListSerializer.java @@ -48,6 +48,29 @@ public ArraysAsListSerializer() { } } + private static Class getPrimitiveWrapperClass(final Class c) { + if (c.isPrimitive()) { + if (c.equals(Long.TYPE)) { + return Long.class; + } else if (c.equals(Integer.TYPE)) { + return Integer.class; + } else if (c.equals(Double.TYPE)) { + return Double.class; + } else if (c.equals(Float.TYPE)) { + return Float.class; + } else if (c.equals(Boolean.TYPE)) { + return Boolean.class; + } else if (c.equals(Character.TYPE)) { + return Character.class; + } else if (c.equals(Short.TYPE)) { + return Short.class; + } else if (c.equals(Byte.TYPE)) { + return Byte.class; + } + } + return c; + } + @Override public List read(final Kryo kryo, final Input input, final Class> type) { final int length = input.readInt(true); @@ -96,27 +119,4 @@ public List copy(Kryo kryo, List original) { throw new RuntimeException(e); } } - - private static Class getPrimitiveWrapperClass(final Class c) { - if (c.isPrimitive()) { - if (c.equals(Long.TYPE)) { - return Long.class; - } else if (c.equals(Integer.TYPE)) { - return Integer.class; - } else if (c.equals(Double.TYPE)) { - return Double.class; - } else if (c.equals(Float.TYPE)) { - return Float.class; - } else if (c.equals(Boolean.TYPE)) { - return Boolean.class; - } else if (c.equals(Character.TYPE)) { - return Character.class; - } else if (c.equals(Short.TYPE)) { - return Short.class; - } else if (c.equals(Byte.TYPE)) { - return Byte.class; - } - } - return c; - } } diff --git a/src/main/java/de/javakaffee/kryoserializers/CollectionsEmptyListSerializer.java b/src/main/java/de/javakaffee/kryoserializers/CollectionsEmptyListSerializer.java index e79f069e..a9cdb4ff 100644 --- a/src/main/java/de/javakaffee/kryoserializers/CollectionsEmptyListSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/CollectionsEmptyListSerializer.java @@ -42,5 +42,6 @@ public List read(final Kryo kryo, final Input input, final Class> typ } @Override - public void write(final Kryo kryo, final Output output, final List object) {} + public void write(final Kryo kryo, final Output output, final List object) { + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/CollectionsEmptyMapSerializer.java b/src/main/java/de/javakaffee/kryoserializers/CollectionsEmptyMapSerializer.java index 99129fe6..8cc7b0ee 100644 --- a/src/main/java/de/javakaffee/kryoserializers/CollectionsEmptyMapSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/CollectionsEmptyMapSerializer.java @@ -42,5 +42,6 @@ public CollectionsEmptyMapSerializer() { } @Override - public void write(final Kryo kryo, final Output output, final Map object) {} + public void write(final Kryo kryo, final Output output, final Map object) { + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/CollectionsEmptySetSerializer.java b/src/main/java/de/javakaffee/kryoserializers/CollectionsEmptySetSerializer.java index c9a14397..20a6eb3d 100644 --- a/src/main/java/de/javakaffee/kryoserializers/CollectionsEmptySetSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/CollectionsEmptySetSerializer.java @@ -43,5 +43,6 @@ public Set read(final Kryo kryo, final Input input, final Class> type) } @Override - public void write(final Kryo kryo, final Output output, final Set object) {} + public void write(final Kryo kryo, final Output output, final Set object) { + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/CollectionsSingletonListSerializer.java b/src/main/java/de/javakaffee/kryoserializers/CollectionsSingletonListSerializer.java index 653ad26e..8c012a24 100644 --- a/src/main/java/de/javakaffee/kryoserializers/CollectionsSingletonListSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/CollectionsSingletonListSerializer.java @@ -35,7 +35,8 @@ */ public class CollectionsSingletonListSerializer extends Serializer> { - public CollectionsSingletonListSerializer() {} + public CollectionsSingletonListSerializer() { + } @Override public List read(final Kryo kryo, final Input input, final Class> type) { diff --git a/src/main/java/de/javakaffee/kryoserializers/CompatibleFieldSerializerReflectionFactorySupport.java b/src/main/java/de/javakaffee/kryoserializers/CompatibleFieldSerializerReflectionFactorySupport.java index 316e071e..6f765390 100644 --- a/src/main/java/de/javakaffee/kryoserializers/CompatibleFieldSerializerReflectionFactorySupport.java +++ b/src/main/java/de/javakaffee/kryoserializers/CompatibleFieldSerializerReflectionFactorySupport.java @@ -32,6 +32,7 @@ public class CompatibleFieldSerializerReflectionFactorySupport extends Compatibl /** * Creates a new instance. + * * @param kryo the kryo instance that is passed to {@link CompatibleFieldSerializer#CompatibleFieldSerializer(Kryo, Class)}. * @param type the type to serialize. */ diff --git a/src/main/java/de/javakaffee/kryoserializers/EnumMapSerializer.java b/src/main/java/de/javakaffee/kryoserializers/EnumMapSerializer.java index 4bc2c857..b7c2e51f 100644 --- a/src/main/java/de/javakaffee/kryoserializers/EnumMapSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/EnumMapSerializer.java @@ -36,6 +36,9 @@ public class EnumMapSerializer extends Serializer, ?>> { private static final Field TYPE_FIELD; + // Workaround reference reading, this should be removed sometimes. See also + // https://groups.google.com/d/msg/kryo-users/Eu5V4bxCfws/k-8UQ22y59AJ + private static final Object FAKE_REFERENCE = new Object(); static { try { @@ -46,12 +49,8 @@ public class EnumMapSerializer extends Serializer, ?>> } } - // Workaround reference reading, this should be removed sometimes. See also - // https://groups.google.com/d/msg/kryo-users/Eu5V4bxCfws/k-8UQ22y59AJ - private static final Object FAKE_REFERENCE = new Object(); - @Override - @SuppressWarnings({"unchecked", "rawtypes"}) + @SuppressWarnings({ "unchecked", "rawtypes" }) public EnumMap, ?> copy(final Kryo kryo, final EnumMap, ?> original) { // Make a shallow copy to copy the private key type of the original map without using reflection. // This will work for empty original maps as well. @@ -62,7 +61,7 @@ public class EnumMapSerializer extends Serializer, ?>> return copy; } - @SuppressWarnings({"unchecked", "rawtypes"}) + @SuppressWarnings({ "unchecked", "rawtypes" }) private EnumMap, ?> create(final Kryo kryo, final Input input, final Class, ?>> type) { final Class> keyType = kryo.readClass(input).getType(); @@ -70,7 +69,7 @@ public class EnumMapSerializer extends Serializer, ?>> } @Override - @SuppressWarnings({"rawtypes", "unchecked"}) + @SuppressWarnings({ "rawtypes", "unchecked" }) public EnumMap, ?> read(final Kryo kryo, final Input input, final Class, ?>> type) { kryo.reference(FAKE_REFERENCE); diff --git a/src/main/java/de/javakaffee/kryoserializers/EnumSetSerializer.java b/src/main/java/de/javakaffee/kryoserializers/EnumSetSerializer.java index c0e2054f..8f0fae26 100644 --- a/src/main/java/de/javakaffee/kryoserializers/EnumSetSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/EnumSetSerializer.java @@ -32,7 +32,7 @@ * * @author Martin Grotzke */ -@SuppressWarnings({"unchecked", "rawtypes"}) +@SuppressWarnings({ "unchecked", "rawtypes" }) public class EnumSetSerializer extends Serializer>> { private static final Field TYPE_FIELD; diff --git a/src/main/java/de/javakaffee/kryoserializers/FieldAnnotationAwareSerializer.java b/src/main/java/de/javakaffee/kryoserializers/FieldAnnotationAwareSerializer.java index 90718aad..f7bb20a1 100644 --- a/src/main/java/de/javakaffee/kryoserializers/FieldAnnotationAwareSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/FieldAnnotationAwareSerializer.java @@ -55,36 +55,7 @@ */ public class FieldAnnotationAwareSerializer extends FieldSerializer { - /** - * A factory for creating instances of {@link FieldAnnotationAwareSerializer}. - */ - public static class Factory implements SerializerFactory { - - private final Collection> marked; - private final boolean disregarding; - - /** - * Creates a new factory. See {@link FieldAnnotationAwareSerializer#FieldAnnotationAwareSerializer( - *com.esotericsoftware.kryo.Kryo, Class, java.util.Collection, boolean)} - * for additional information on the constructor parameters. - * - * @param marked The annotations that will be considered of the resulting converter. - * @param disregarding If {@code true}, the serializer will ignore all annotated fields, - * if set to {@code false} it will exclusively look at annotated fields. - */ - public Factory(final Collection> marked, final boolean disregarding) { - this.marked = marked; - this.disregarding = disregarding; - } - - @Override - public Serializer makeSerializer(final Kryo kryo, final Class type) { - return new FieldAnnotationAwareSerializer(kryo, type, marked, disregarding); - } - } - private final Set> marked; - /** * Determines whether annotated fields should be excluded from serialization. *

    @@ -107,10 +78,8 @@ public Serializer makeSerializer(final Kryo kryo, final Class type) { * @param disregarding If {@code true}, the serializer will ignore all annotated fields, * if set to {@code false} it will exclusively look at annotated fields. */ - public FieldAnnotationAwareSerializer(final Kryo kryo, - final Class type, - final Collection> marked, - final boolean disregarding) { + public FieldAnnotationAwareSerializer(final Kryo kryo, final Class type, + final Collection> marked, final boolean disregarding) { super(kryo, type); this.disregarding = disregarding; this.marked = new HashSet>(marked); @@ -135,7 +104,8 @@ private void removeFields() { final Field field = cachedField.getField(); if (isRemove(field)) { if (TRACE) { - trace("kryo", String.format("Ignoring field %s tag: %s", disregarding ? "without" : "with", cachedField)); + trace("kryo", + String.format("Ignoring field %s tag: %s", disregarding ? "without" : "with", cachedField)); } super.removeField(field.getName()); } @@ -201,4 +171,32 @@ public boolean removeAnnotation(final Class clazz) { } return false; } + + /** + * A factory for creating instances of {@link FieldAnnotationAwareSerializer}. + */ + public static class Factory implements SerializerFactory { + + private final Collection> marked; + private final boolean disregarding; + + /** + * Creates a new factory. See {@link FieldAnnotationAwareSerializer#FieldAnnotationAwareSerializer( + *com.esotericsoftware.kryo.Kryo, Class, java.util.Collection, boolean)} + * for additional information on the constructor parameters. + * + * @param marked The annotations that will be considered of the resulting converter. + * @param disregarding If {@code true}, the serializer will ignore all annotated fields, + * if set to {@code false} it will exclusively look at annotated fields. + */ + public Factory(final Collection> marked, final boolean disregarding) { + this.marked = marked; + this.disregarding = disregarding; + } + + @Override + public Serializer makeSerializer(final Kryo kryo, final Class type) { + return new FieldAnnotationAwareSerializer(kryo, type, marked, disregarding); + } + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/JdkProxySerializer.java b/src/main/java/de/javakaffee/kryoserializers/JdkProxySerializer.java index 340cb8de..0245b92f 100644 --- a/src/main/java/de/javakaffee/kryoserializers/JdkProxySerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/JdkProxySerializer.java @@ -39,10 +39,10 @@ public Object read(final Kryo kryo, final Input input, final Class type) try { return Proxy.newProxyInstance(classLoader, interfaces, invocationHandler); } catch (final RuntimeException e) { - System.err.println(getClass().getName() + ".read:\n" + - "Could not create proxy using classLoader " + classLoader + "," + - " have invocationhandler.classloader: " + invocationHandler.getClass().getClassLoader() + - " have contextclassloader: " + Thread.currentThread().getContextClassLoader()); + System.err.println( + getClass().getName() + ".read:\n" + "Could not create proxy using classLoader " + classLoader + "," + + " have invocationhandler.classloader: " + invocationHandler.getClass().getClassLoader() + + " have contextclassloader: " + Thread.currentThread().getContextClassLoader()); throw e; } } diff --git a/src/main/java/de/javakaffee/kryoserializers/KryoReflectionFactorySupport.java b/src/main/java/de/javakaffee/kryoserializers/KryoReflectionFactorySupport.java index d218192d..20f27d37 100644 --- a/src/main/java/de/javakaffee/kryoserializers/KryoReflectionFactorySupport.java +++ b/src/main/java/de/javakaffee/kryoserializers/KryoReflectionFactorySupport.java @@ -32,43 +32,14 @@ * * @author Martin Grotzke */ -@SuppressWarnings({"restriction", "sunapi"}) +@SuppressWarnings({ "restriction", "sunapi" }) public class KryoReflectionFactorySupport extends Kryo { private static final ReflectionFactory REFLECTION_FACTORY = ReflectionFactory.getReflectionFactory(); private static final Object[] INITARGS = new Object[0]; - private static final Map, Constructor> _constructors = new ConcurrentHashMap, Constructor>(); - - @Override - public Serializer getDefaultSerializer(@SuppressWarnings("rawtypes") final Class type) { - final Serializer result = super.getDefaultSerializer(type); - if (result instanceof FieldSerializer) { - // don't ignore synthetic fields so that inner classes work (see KryoTest.testInnerClass) - ((FieldSerializer) result).setIgnoreSyntheticFields(false); - } - return result; - } - - /** - * {@inheritDoc} - */ - @Override - @SuppressWarnings("unchecked") - public T newInstance(final Class type) { - if (type == null) { - throw new IllegalArgumentException("type cannot be null."); - } - Constructor constructor = _constructors.get(type); - if (constructor == null) { - constructor = getNoArgsConstructor(type); - if (constructor == null) { - constructor = newConstructorForSerialization(type); - } - _constructors.put(type, constructor); - } - return (T) newInstanceFrom(constructor); - } + private static final Map, Constructor> _constructors = + new ConcurrentHashMap, Constructor>(); private static Object newInstanceFrom(final Constructor constructor) { try { @@ -90,7 +61,8 @@ public static T newInstanceFromReflectionFactory(final Class type) { private static Constructor newConstructorForSerialization(final Class type) { try { - final Constructor constructor = REFLECTION_FACTORY.newConstructorForSerialization(type, Object.class.getDeclaredConstructor(new Class[0])); + final Constructor constructor = + REFLECTION_FACTORY.newConstructorForSerialization(type, Object.class.getDeclaredConstructor()); constructor.setAccessible(true); return constructor; } catch (final Exception e) { @@ -109,4 +81,34 @@ private static Constructor getNoArgsConstructor(final Class type) { return null; } + @Override + public Serializer getDefaultSerializer(@SuppressWarnings("rawtypes") final Class type) { + final Serializer result = super.getDefaultSerializer(type); + if (result instanceof FieldSerializer) { + // don't ignore synthetic fields so that inner classes work (see KryoTest.testInnerClass) + ((FieldSerializer) result).setIgnoreSyntheticFields(false); + } + return result; + } + + /** + * {@inheritDoc} + */ + @Override + @SuppressWarnings("unchecked") + public T newInstance(final Class type) { + if (type == null) { + throw new IllegalArgumentException("type cannot be null."); + } + Constructor constructor = _constructors.get(type); + if (constructor == null) { + constructor = getNoArgsConstructor(type); + if (constructor == null) { + constructor = newConstructorForSerialization(type); + } + _constructors.put(type, constructor); + } + return (T) newInstanceFrom(constructor); + } + } diff --git a/src/main/java/de/javakaffee/kryoserializers/SubListSerializers.java b/src/main/java/de/javakaffee/kryoserializers/SubListSerializers.java index 7f572fdb..eafc0cd8 100644 --- a/src/main/java/de/javakaffee/kryoserializers/SubListSerializers.java +++ b/src/main/java/de/javakaffee/kryoserializers/SubListSerializers.java @@ -36,6 +36,10 @@ */ public class SubListSerializers { + // Workaround reference reading, this should be removed sometimes. See also + // https://groups.google.com/d/msg/kryo-users/Eu5V4bxCfws/k-8UQ22y59AJ + private static final Object FAKE_REFERENCE = new Object(); + static Class getClass(final String className) { try { return Class.forName(className); @@ -52,13 +56,10 @@ static Class getClassOrNull(final String className) { } } - // Workaround reference reading, this should be removed sometimes. See also - // https://groups.google.com/d/msg/kryo-users/Eu5V4bxCfws/k-8UQ22y59AJ - private static final Object FAKE_REFERENCE = new Object(); - /** * Obtain a serializer for the given sublist type. If the type is not supported * null is returned. + * * @param type the class of the sublist. * @return a serializer instance or null. */ @@ -112,8 +113,7 @@ public ArrayListSubListSerializer() { /** * Can be used to determine, if the given type can be handled by this serializer. * - * @param type - * the class to check. + * @param type the class to check. * @return true if the given class can be serialized/deserialized by this serializer. */ public static boolean canSerialize(final Class type) { @@ -197,8 +197,7 @@ public JavaUtilSubListSerializer() { /** * Can be used to determine, if the given type can be handled by this serializer. * - * @param type - * the class to check. + * @param type the class to check. * @return true if the given class can be serialized/deserialized by this serializer. */ public static boolean canSerialize(final Class type) { diff --git a/src/main/java/de/javakaffee/kryoserializers/SynchronizedCollectionsSerializer.java b/src/main/java/de/javakaffee/kryoserializers/SynchronizedCollectionsSerializer.java index a0ef6ca6..518d18c5 100644 --- a/src/main/java/de/javakaffee/kryoserializers/SynchronizedCollectionsSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/SynchronizedCollectionsSerializer.java @@ -17,20 +17,7 @@ package de.javakaffee.kryoserializers; import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.SortedMap; -import java.util.SortedSet; -import java.util.TreeMap; -import java.util.TreeSet; +import java.util.*; import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.Serializer; @@ -50,16 +37,37 @@ public class SynchronizedCollectionsSerializer extends Serializer { static { try { - SOURCE_COLLECTION_FIELD = Class.forName("java.util.Collections$SynchronizedCollection") - .getDeclaredField("c"); + SOURCE_COLLECTION_FIELD = + Class.forName("java.util.Collections$SynchronizedCollection").getDeclaredField("c"); SOURCE_COLLECTION_FIELD.setAccessible(true); - SOURCE_MAP_FIELD = Class.forName("java.util.Collections$SynchronizedMap") - .getDeclaredField("m"); + SOURCE_MAP_FIELD = Class.forName("java.util.Collections$SynchronizedMap").getDeclaredField("m"); SOURCE_MAP_FIELD.setAccessible(true); } catch (final Exception e) { - throw new RuntimeException("Could not access source collection" + - " field in java.util.Collections$SynchronizedCollection.", e); + throw new RuntimeException( + "Could not access source collection" + " field in java.util.Collections$SynchronizedCollection.", + e); + } + } + + /** + * Creates a new {@link SynchronizedCollectionsSerializer} and registers its serializer + * for the several synchronized Collections that can be created via {@link Collections}, + * including {@link Map}s. + * + * @param kryo the {@link Kryo} instance to set the serializer on. + * @see Collections#synchronizedCollection(Collection) + * @see Collections#synchronizedList(List) + * @see Collections#synchronizedSet(Set) + * @see Collections#synchronizedSortedSet(SortedSet) + * @see Collections#synchronizedMap(Map) + * @see Collections#synchronizedSortedMap(SortedMap) + */ + public static void registerSerializers(final Kryo kryo) { + final SynchronizedCollectionsSerializer serializer = new SynchronizedCollectionsSerializer(); + SynchronizedCollection.values(); + for (final SynchronizedCollection item : SynchronizedCollection.values()) { + kryo.register(item.type, serializer); } } @@ -133,7 +141,6 @@ public Object create(final Object sourceCollection) { } }, MAP(Collections.synchronizedMap(new HashMap()).getClass(), SOURCE_MAP_FIELD) { - @Override public Object create(final Object sourceCollection) { return Collections.synchronizedMap((Map) sourceCollection); @@ -155,11 +162,6 @@ private SynchronizedCollection(final Class type, final Field sourceCollection this.sourceCollectionField = sourceCollectionField; } - /** - * @param sourceCollection - */ - public abstract Object create(Object sourceCollection); - static SynchronizedCollection valueOfType(final Class type) { for (final SynchronizedCollection item : values()) { if (item.type.equals(type)) { @@ -169,28 +171,11 @@ static SynchronizedCollection valueOfType(final Class type) { throw new IllegalArgumentException("The type " + type + " is not supported."); } - } + /** + * @param sourceCollection + */ + public abstract Object create(Object sourceCollection); - /** - * Creates a new {@link SynchronizedCollectionsSerializer} and registers its serializer - * for the several synchronized Collections that can be created via {@link Collections}, - * including {@link Map}s. - * - * @param kryo the {@link Kryo} instance to set the serializer on. - * - * @see Collections#synchronizedCollection(Collection) - * @see Collections#synchronizedList(List) - * @see Collections#synchronizedSet(Set) - * @see Collections#synchronizedSortedSet(SortedSet) - * @see Collections#synchronizedMap(Map) - * @see Collections#synchronizedSortedMap(SortedMap) - */ - public static void registerSerializers(final Kryo kryo) { - final SynchronizedCollectionsSerializer serializer = new SynchronizedCollectionsSerializer(); - SynchronizedCollection.values(); - for (final SynchronizedCollection item : SynchronizedCollection.values()) { - kryo.register(item.type, serializer); - } } } diff --git a/src/main/java/de/javakaffee/kryoserializers/UnicodeBlockSerializer.java b/src/main/java/de/javakaffee/kryoserializers/UnicodeBlockSerializer.java index 2af93e68..db0e2e55 100644 --- a/src/main/java/de/javakaffee/kryoserializers/UnicodeBlockSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/UnicodeBlockSerializer.java @@ -33,7 +33,9 @@ * @author Chris Hennick */ public class UnicodeBlockSerializer extends Serializer { - private static final IdentityHashMap BLOCK_NAMES = new IdentityHashMap(); + private static final IdentityHashMap BLOCK_NAMES = + new IdentityHashMap(); + static { // Reflectively look up the instances and their names, which are in UnicodeBlock's static // fields (necessary since UnicodeBlock isn't an actual enum) @@ -77,8 +79,7 @@ public UnicodeBlock copy(final Kryo kryo, final UnicodeBlock original) { } @Override - public UnicodeBlock read(final Kryo kryo, final Input input, - final Class unicodeBlockClass) { + public UnicodeBlock read(final Kryo kryo, final Input input, final Class unicodeBlockClass) { String name = input.readString(); return (name == null) ? null : UnicodeBlock.forName(name); } diff --git a/src/main/java/de/javakaffee/kryoserializers/UnmodifiableCollectionsSerializer.java b/src/main/java/de/javakaffee/kryoserializers/UnmodifiableCollectionsSerializer.java index 22c0ce0c..8d5e16dc 100644 --- a/src/main/java/de/javakaffee/kryoserializers/UnmodifiableCollectionsSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/UnmodifiableCollectionsSerializer.java @@ -37,8 +37,8 @@ public class UnmodifiableCollectionsSerializer extends Serializer { static { try { - SOURCE_COLLECTION_FIELD = Class.forName("java.util.Collections$UnmodifiableCollection") - .getDeclaredField("c"); + SOURCE_COLLECTION_FIELD = + Class.forName("java.util.Collections$UnmodifiableCollection").getDeclaredField("c"); SOURCE_COLLECTION_FIELD.setAccessible(true); SOURCE_MAP_FIELD = Class.forName("java.util.Collections$UnmodifiableMap").getDeclaredField("m"); @@ -98,8 +98,8 @@ public void write(final Kryo kryo, final Output output, final Object object) { @Override public Object copy(Kryo kryo, Object original) { try { - final UnmodifiableCollection unmodifiableCollection = UnmodifiableCollection - .valueOfType(original.getClass()); + final UnmodifiableCollection unmodifiableCollection = + UnmodifiableCollection.valueOfType(original.getClass()); Object sourceCollectionCopy = kryo.copy(unmodifiableCollection.sourceCollectionField.get(original)); return unmodifiableCollection.create(sourceCollectionCopy); } catch (final RuntimeException e) { diff --git a/src/main/java/de/javakaffee/kryoserializers/cglib/CGLibProxySerializer.java b/src/main/java/de/javakaffee/kryoserializers/cglib/CGLibProxySerializer.java index 3998e5ae..adc2f0fa 100644 --- a/src/main/java/de/javakaffee/kryoserializers/cglib/CGLibProxySerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/cglib/CGLibProxySerializer.java @@ -35,12 +35,6 @@ */ public class CGLibProxySerializer extends Serializer { - /** - * This class is used as a marker class - written to the class attribute - * on serialization and checked on deserialization (via {@link CGLibProxySerializer#canSerialize(Class)}). - */ - public static interface CGLibProxyMarker {} - public static final String DEFAULT_NAMING_MARKER = "$$EnhancerByCGLIB$$"; public static boolean canSerialize(final Class cls) { @@ -70,4 +64,11 @@ private Object createProxy(final Class targetClass, final Class[] interfac return e.create(); } + /** + * This class is used as a marker class - written to the class attribute + * on serialization and checked on deserialization (via {@link CGLibProxySerializer#canSerialize(Class)}). + */ + public static interface CGLibProxyMarker { + } + } diff --git a/src/main/java/de/javakaffee/kryoserializers/dexx/ListSerializer.java b/src/main/java/de/javakaffee/kryoserializers/dexx/ListSerializer.java index c11aeeee..aebe40c1 100644 --- a/src/main/java/de/javakaffee/kryoserializers/dexx/ListSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/dexx/ListSerializer.java @@ -35,24 +35,6 @@ public ListSerializer() { super(DOES_NOT_ACCEPT_NULL, IMMUTABLE); } - @Override - public void write(Kryo kryo, Output output, List object) { - output.writeInt(object.size(), true); - for (Object elm : object) { - kryo.writeClassAndObject(output, elm); - } - } - - @Override - public List read(Kryo kryo, Input input, Class aClass) { - final int size = input.readInt(true); - final Object[] list = new Object[size]; - for (int i = 0; i < size; ++i) { - list[i] = kryo.readClassAndObject(input); - } - return IndexedLists.copyOf(list); - } - /** * Creates a new {@link de.javakaffee.kryoserializers.guava.ImmutableListSerializer} and registers its serializer * @@ -82,4 +64,22 @@ public static void registerSerializers(final Kryo kryo) { kryo.register(IndexedLists.of(1, 2, 3, 4, 5, 6, 7, 8, 10, 11).getClass(), serializer); } + + @Override + public void write(Kryo kryo, Output output, List object) { + output.writeInt(object.size(), true); + for (Object elm : object) { + kryo.writeClassAndObject(output, elm); + } + } + + @Override + public List read(Kryo kryo, Input input, Class aClass) { + final int size = input.readInt(true); + final Object[] list = new Object[size]; + for (int i = 0; i < size; ++i) { + list[i] = kryo.readClassAndObject(input); + } + return IndexedLists.copyOf(list); + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/dexx/MapSerializer.java b/src/main/java/de/javakaffee/kryoserializers/dexx/MapSerializer.java index 48fc97c4..7c942ff4 100644 --- a/src/main/java/de/javakaffee/kryoserializers/dexx/MapSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/dexx/MapSerializer.java @@ -29,7 +29,7 @@ import com.github.andrewoma.dexx.collection.Pair; /** -* A kryo {@link Serializer} for dexx {@link Map} + * A kryo {@link Serializer} for dexx {@link Map} */ public class MapSerializer extends Serializer> { @@ -40,25 +40,6 @@ public MapSerializer() { super(DOES_NOT_ACCEPT_NULL, IMMUTABLE); } - @Override - public void write(Kryo kryo, Output output, Map immutableMap) { - kryo.writeObject(output, immutableMap.asMap()); - } - - @SuppressWarnings("unchecked") - @Override - public Map read(Kryo kryo, Input input, Class> type) { - HashMap map = kryo.readObject(input, HashMap.class); - ArrayList> listOfPairs = new ArrayList(); - - for (Entry entry : map.entrySet()) { - Pair pair = new Pair(entry.getKey(), entry.getValue()); - listOfPairs.add(pair); - } - - return Maps.copyOf(listOfPairs); - } - /** * Creates a new {@link de.javakaffee.kryoserializers.guava.ImmutableMapSerializer} and registers its serializer * for the several ImmutableMap related classes. @@ -85,4 +66,23 @@ public static void registerSerializers(final Kryo kryo) { kryo.register(Maps.of(o1, o1, o2, o2, o3, o3, o4, o4, o5, o5).getClass(), serializer); } + + @Override + public void write(Kryo kryo, Output output, Map immutableMap) { + kryo.writeObject(output, immutableMap.asMap()); + } + + @SuppressWarnings("unchecked") + @Override + public Map read(Kryo kryo, Input input, Class> type) { + HashMap map = kryo.readObject(input, HashMap.class); + ArrayList> listOfPairs = new ArrayList(); + + for (Entry entry : map.entrySet()) { + Pair pair = new Pair(entry.getKey(), entry.getValue()); + listOfPairs.add(pair); + } + + return Maps.copyOf(listOfPairs); + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/dexx/SetSerializer.java b/src/main/java/de/javakaffee/kryoserializers/dexx/SetSerializer.java index 1d31ac92..7be61865 100644 --- a/src/main/java/de/javakaffee/kryoserializers/dexx/SetSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/dexx/SetSerializer.java @@ -25,7 +25,7 @@ import com.github.andrewoma.dexx.collection.Sets; /** -* A kryo {@link Serializer} for dexx {@link Set} + * A kryo {@link Serializer} for dexx {@link Set} */ public class SetSerializer extends Serializer> { @@ -36,24 +36,6 @@ public SetSerializer() { super(DOES_NOT_ACCEPT_NULL, IMMUTABLE); } - @Override - public void write(Kryo kryo, Output output, Set object) { - output.writeInt(object.size(), true); - for (Object elm : object) { - kryo.writeClassAndObject(output, elm); - } - } - - @Override - public Set read(Kryo kryo, Input input, Class> type) { - final int size = input.readInt(true); - Builder> builder = Sets.builder(); - for (int i = 0; i < size; ++i) { - builder.add(kryo.readClassAndObject(input)); - } - return builder.build(); - } - /** * Creates a new {@link de.javakaffee.kryoserializers.guava.ImmutableSetSerializer} and registers its serializer * for the several ImmutableSet related classes. @@ -83,4 +65,22 @@ public static void registerSerializers(final Kryo kryo) { kryo.register(Sets.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11).getClass(), serializer); } + + @Override + public void write(Kryo kryo, Output output, Set object) { + output.writeInt(object.size(), true); + for (Object elm : object) { + kryo.writeClassAndObject(output, elm); + } + } + + @Override + public Set read(Kryo kryo, Input input, Class> type) { + final int size = input.readInt(true); + Builder> builder = Sets.builder(); + for (int i = 0; i < size; ++i) { + builder.add(kryo.readClassAndObject(input)); + } + return builder.build(); + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/guava/ArrayListMultimapSerializer.java b/src/main/java/de/javakaffee/kryoserializers/guava/ArrayListMultimapSerializer.java index aa3ef364..abb82b2b 100644 --- a/src/main/java/de/javakaffee/kryoserializers/guava/ArrayListMultimapSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/guava/ArrayListMultimapSerializer.java @@ -26,7 +26,8 @@ * A kryo {@link Serializer} for guava-libraries {@link ArrayListMultimap}. * This does not yet support {@link Kryo#copy(java.lang.Object)}. */ -public class ArrayListMultimapSerializer extends MultimapSerializerBase> { +public class ArrayListMultimapSerializer + extends MultimapSerializerBase> { private static final boolean DOES_NOT_ACCEPT_NULL = false; @@ -36,6 +37,16 @@ public ArrayListMultimapSerializer() { super(DOES_NOT_ACCEPT_NULL, IMMUTABLE); } + /** + * Creates a new {@link ArrayListMultimapSerializer} and registers its serializer. + * + * @param kryo the {@link Kryo} instance to set the serializer on + */ + public static void registerSerializers(final Kryo kryo) { + final ArrayListMultimapSerializer serializer = new ArrayListMultimapSerializer(); + kryo.register(ArrayListMultimap.class, serializer); + } + @Override public void write(Kryo kryo, Output output, ArrayListMultimap multimap) { writeMultimap(kryo, output, multimap); @@ -47,14 +58,4 @@ public ArrayListMultimap read(Kryo kryo, Input input, Class multimap) { writeMultimap(kryo, output, multimap); @@ -47,14 +57,4 @@ public HashMultimap read(Kryo kryo, Input input, Class object) { - output.writeInt(object.size(), true); - for (Object elm : object) { - kryo.writeClassAndObject(output, elm); - } - } - - @Override - public ImmutableList read(Kryo kryo, Input input, Class> type) { - final int size = input.readInt(true); - final Object[] list = new Object[size]; - for (int i = 0; i < size; ++i) { - list[i] = kryo.readClassAndObject(input); - } - return ImmutableList.copyOf(list); - } - /** * Creates a new {@link ImmutableListSerializer} and registers its serializer * for the several ImmutableList related classes. @@ -100,4 +78,22 @@ public static void registerSerializers(final Kryo kryo) { kryo.register(table.values().getClass(), serializer); } + + @Override + public void write(Kryo kryo, Output output, ImmutableList object) { + output.writeInt(object.size(), true); + for (Object elm : object) { + kryo.writeClassAndObject(output, elm); + } + } + + @Override + public ImmutableList read(Kryo kryo, Input input, Class> type) { + final int size = input.readInt(true); + final Object[] list = new Object[size]; + for (int i = 0; i < size; ++i) { + list[i] = kryo.readClassAndObject(input); + } + return ImmutableList.copyOf(list); + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableMapSerializer.java b/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableMapSerializer.java index 267093b3..fd4a205d 100644 --- a/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableMapSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableMapSerializer.java @@ -39,18 +39,6 @@ public ImmutableMapSerializer() { super(DOES_NOT_ACCEPT_NULL, IMMUTABLE); } - @Override - public void write(Kryo kryo, Output output, ImmutableMap immutableMap) { - kryo.writeObject(output, Maps.newHashMap(immutableMap)); - } - - @SuppressWarnings("unchecked") - @Override - public ImmutableMap read(Kryo kryo, Input input, Class> type) { - Map map = kryo.readObject(input, HashMap.class); - return ImmutableMap.copyOf(map); - } - /** * Creates a new {@link ImmutableMapSerializer} and registers its serializer * for the several ImmutableMap related classes. @@ -78,6 +66,18 @@ public static void registerSerializers(final Kryo kryo) { kryo.register(ImmutableMap.copyOf(enumMap).getClass(), serializer); } + @Override + public void write(Kryo kryo, Output output, ImmutableMap immutableMap) { + kryo.writeObject(output, Maps.newHashMap(immutableMap)); + } + + @SuppressWarnings("unchecked") + @Override + public ImmutableMap read(Kryo kryo, Input input, Class> type) { + Map map = kryo.readObject(input, HashMap.class); + return ImmutableMap.copyOf(map); + } + private enum DummyEnum { VALUE1, VALUE2 diff --git a/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableMultimapSerializer.java b/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableMultimapSerializer.java index a7e6a833..5f4af561 100644 --- a/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableMultimapSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableMultimapSerializer.java @@ -24,12 +24,7 @@ import com.esotericsoftware.kryo.Serializer; import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableListMultimap; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableMultimap; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.ImmutableSetMultimap; +import com.google.common.collect.*; /** * A kryo {@link Serializer} for guava-libraries {@link ImmutableMultimap}. @@ -43,33 +38,6 @@ public ImmutableMultimapSerializer() { super(DOES_NOT_ACCEPT_NULL, IMMUTABLE); } - @Override - public void write(Kryo kryo, Output output, ImmutableMultimap immutableMultiMap) { - kryo.writeObject(output, ImmutableMap.copyOf(immutableMultiMap.asMap())); - } - - @SuppressWarnings("unchecked") - @Override - public ImmutableMultimap read(Kryo kryo, Input input, Class> type) { - final ImmutableMultimap.Builder builder; - if (type.equals(ImmutableListMultimap.class)) { - builder = ImmutableMultimap.builder(); - } else if (type.equals(ImmutableSetMultimap.class)) { - builder = ImmutableSetMultimap.builder(); - } else { - builder = ImmutableMultimap.builder(); - } - - final Map map = kryo.readObject(input, ImmutableMap.class); - final Set>> entries = map.entrySet(); - - for (Map.Entry> entry : entries) { - builder.putAll(entry.getKey(), entry.getValue()); - } - - return builder.build(); - } - /** * Creates a new {@link ImmutableMultimapSerializer} and registers its serializer * for the several ImmutableMultimap related classes. @@ -115,4 +83,32 @@ public static void registerSerializers(final Kryo kryo) { kryo.register(ImmutableSetMultimap.of().getClass(), serializer); kryo.register(ImmutableSetMultimap.of("A", "B").getClass(), serializer); } + + @Override + public void write(Kryo kryo, Output output, ImmutableMultimap immutableMultiMap) { + kryo.writeObject(output, ImmutableMap.copyOf(immutableMultiMap.asMap())); + } + + @SuppressWarnings("unchecked") + @Override + public ImmutableMultimap read(Kryo kryo, Input input, + Class> type) { + final ImmutableMultimap.Builder builder; + if (type.equals(ImmutableListMultimap.class)) { + builder = ImmutableMultimap.builder(); + } else if (type.equals(ImmutableSetMultimap.class)) { + builder = ImmutableSetMultimap.builder(); + } else { + builder = ImmutableMultimap.builder(); + } + + final Map map = kryo.readObject(input, ImmutableMap.class); + final Set>> entries = map.entrySet(); + + for (Map.Entry> entry : entries) { + builder.putAll(entry.getKey(), entry.getValue()); + } + + return builder.build(); + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableSetSerializer.java b/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableSetSerializer.java index 4a9ff76b..18a840f1 100644 --- a/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableSetSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableSetSerializer.java @@ -25,8 +25,9 @@ /** * A kryo {@link Serializer} for guava-libraries {@link ImmutableSet}. - * + *

    * (the array.clone as done by copyOf is saved), for more elements copyOf seems to get more efficient. + * * @implNote ImmutableSet builder would be a little bit more efficient for less than five elements */ public class ImmutableSetSerializer extends Serializer> { @@ -38,24 +39,6 @@ public ImmutableSetSerializer() { super(DOES_NOT_ACCEPT_NULL, IMMUTABLE); } - @Override - public void write(Kryo kryo, Output output, ImmutableSet object) { - output.writeInt(object.size(), true); - for (Object elm : object) { - kryo.writeClassAndObject(output, elm); - } - } - - @Override - public ImmutableSet read(Kryo kryo, Input input, Class> type) { - final int size = input.readInt(true); - ImmutableSet.Builder builder = ImmutableSet.builder(); - for (int i = 0; i < size; ++i) { - builder.add(kryo.readClassAndObject(input)); - } - return builder.build(); - } - /** * Creates a new {@link ImmutableSetSerializer} and registers its serializer * for the several ImmutableSet related classes. @@ -89,6 +72,24 @@ public static void registerSerializers(final Kryo kryo) { kryo.register(Sets.immutableEnumSet(SomeEnum.A, SomeEnum.B, SomeEnum.C).getClass(), serializer); } + @Override + public void write(Kryo kryo, Output output, ImmutableSet object) { + output.writeInt(object.size(), true); + for (Object elm : object) { + kryo.writeClassAndObject(output, elm); + } + } + + @Override + public ImmutableSet read(Kryo kryo, Input input, Class> type) { + final int size = input.readInt(true); + ImmutableSet.Builder builder = ImmutableSet.builder(); + for (int i = 0; i < size; ++i) { + builder.add(kryo.readClassAndObject(input)); + } + return builder.build(); + } + private enum SomeEnum { A, B, diff --git a/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableSortedMapSerializer.java b/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableSortedMapSerializer.java index f7140d53..6f18c92d 100644 --- a/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableSortedMapSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableSortedMapSerializer.java @@ -39,18 +39,6 @@ public ImmutableSortedMapSerializer() { super(DOES_NOT_ACCEPT_NULL, IMMUTABLE); } - @Override - public void write(Kryo kryo, Output output, ImmutableSortedMap immutableMap) { - kryo.writeObject(output, Maps.newTreeMap(immutableMap)); - } - - @SuppressWarnings("unchecked") - @Override - public ImmutableSortedMap read(Kryo kryo, Input input, Class> type) { - Map map = kryo.readObject(input, TreeMap.class); - return ImmutableSortedMap.copyOf(map); - } - /** * Creates a new {@link ImmutableSortedMapSerializer} and registers its serializer * for the several ImmutableMap related classes. @@ -90,6 +78,19 @@ public int compareTo(Object o) { kryo.register(ImmutableSortedMap.copyOf(enumMap).getClass(), serializer); } + @Override + public void write(Kryo kryo, Output output, ImmutableSortedMap immutableMap) { + kryo.writeObject(output, Maps.newTreeMap(immutableMap)); + } + + @SuppressWarnings("unchecked") + @Override + public ImmutableSortedMap read(Kryo kryo, Input input, + Class> type) { + Map map = kryo.readObject(input, TreeMap.class); + return ImmutableSortedMap.copyOf(map); + } + private enum DummyEnum { VALUE1, VALUE2 diff --git a/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableSortedSetSerializer.java b/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableSortedSetSerializer.java index 462e9f16..7269c453 100644 --- a/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableSortedSetSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableSortedSetSerializer.java @@ -36,26 +36,6 @@ public ImmutableSortedSetSerializer() { super(DOES_NOT_ACCEPT_NULL, IMMUTABLE); } - @Override - public void write(Kryo kryo, Output output, ImmutableSortedSet object) { - kryo.writeClassAndObject(output, object.comparator()); - output.writeInt(object.size(), true); - for (Object elm : object) { - kryo.writeClassAndObject(output, elm); - } - } - - @Override - public ImmutableSortedSet read(Kryo kryo, Input input, Class> type) { - @SuppressWarnings("unchecked") - ImmutableSortedSet.Builder builder = ImmutableSortedSet.orderedBy((Comparator) kryo.readClassAndObject(input)); - final int size = input.readInt(true); - for (int i = 0; i < size; ++i) { - builder.add(kryo.readClassAndObject(input)); - } - return builder.build(); - } - /** * Creates a new {@link ImmutableSortedSetSerializer} and registers its serializer * for the several ImmutableSortedSet related classes. @@ -76,4 +56,25 @@ public static void registerSerializers(final Kryo kryo) { kryo.register(ImmutableSortedSet.of("").getClass(), serializer); kryo.register(ImmutableSortedSet.of().descendingSet().getClass(), serializer); } + + @Override + public void write(Kryo kryo, Output output, ImmutableSortedSet object) { + kryo.writeClassAndObject(output, object.comparator()); + output.writeInt(object.size(), true); + for (Object elm : object) { + kryo.writeClassAndObject(output, elm); + } + } + + @Override + public ImmutableSortedSet read(Kryo kryo, Input input, Class> type) { + @SuppressWarnings("unchecked") + ImmutableSortedSet.Builder builder = + ImmutableSortedSet.orderedBy((Comparator) kryo.readClassAndObject(input)); + final int size = input.readInt(true); + for (int i = 0; i < size; ++i) { + builder.add(kryo.readClassAndObject(input)); + } + return builder.build(); + } } diff --git a/src/main/java/de/javakaffee/kryoserializers/guava/LinkedHashMultimapSerializer.java b/src/main/java/de/javakaffee/kryoserializers/guava/LinkedHashMultimapSerializer.java index fbcad104..8b43b206 100644 --- a/src/main/java/de/javakaffee/kryoserializers/guava/LinkedHashMultimapSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/guava/LinkedHashMultimapSerializer.java @@ -26,7 +26,8 @@ * A kryo {@link Serializer} for guava-libraries {@link LinkedHashMultimap}. * This does not yet support {@link Kryo#copy(java.lang.Object)}. */ -public class LinkedHashMultimapSerializer extends MultimapSerializerBase> { +public class LinkedHashMultimapSerializer + extends MultimapSerializerBase> { private static final boolean DOES_NOT_ACCEPT_NULL = false; @@ -36,6 +37,16 @@ public LinkedHashMultimapSerializer() { super(DOES_NOT_ACCEPT_NULL, IMMUTABLE); } + /** + * Creates a new {@link LinkedHashMultimapSerializer} and registers its serializer. + * + * @param kryo the {@link Kryo} instance to set the serializer on + */ + public static void registerSerializers(final Kryo kryo) { + final LinkedHashMultimapSerializer serializer = new LinkedHashMultimapSerializer(); + kryo.register(LinkedHashMultimap.class, serializer); + } + @Override public void write(Kryo kryo, Output output, LinkedHashMultimap multimap) { writeMultimap(kryo, output, multimap); @@ -47,14 +58,4 @@ public LinkedHashMultimap read(Kryo kryo, Input input, Class> { +public class LinkedListMultimapSerializer + extends MultimapSerializerBase> { private static final boolean DOES_NOT_ACCEPT_NULL = false; @@ -36,6 +37,16 @@ public LinkedListMultimapSerializer() { super(DOES_NOT_ACCEPT_NULL, IMMUTABLE); } + /** + * Creates a new {@link LinkedListMultimapSerializer} and registers its serializer. + * + * @param kryo the {@link Kryo} instance to set the serializer on + */ + public static void registerSerializers(final Kryo kryo) { + final LinkedListMultimapSerializer serializer = new LinkedListMultimapSerializer(); + kryo.register(LinkedListMultimap.class, serializer); + } + @Override public void write(Kryo kryo, Output output, LinkedListMultimap multimap) { writeMultimap(kryo, output, multimap); @@ -47,14 +58,4 @@ public LinkedListMultimap read(Kryo kryo, Input input, Class> { private static final CollectionSerializer serializer = new CollectionSerializer(); + public static void registerSerializers(final Kryo kryo) { + kryo.register(Lists.reverse(Lists.newLinkedList()).getClass(), forReverseList()); + kryo.register(Lists.reverse(Lists.newArrayList()).getClass(), forRandomAccessReverseList()); + } + + public static ReverseListSerializer forReverseList() { + return new ReverseListSerializer.ReverseList(); + } + + public static ReverseListSerializer forRandomAccessReverseList() { + return new ReverseListSerializer.RandomAccessReverseList(); + } + @SuppressWarnings("unchecked") @Override public void write(Kryo kryo, Output output, List object) { @@ -51,19 +64,6 @@ public List copy(Kryo kryo, List original) { return Lists.reverse((List) serializer.copy(kryo, forwardList)); } - public static void registerSerializers(final Kryo kryo) { - kryo.register(Lists.reverse(Lists.newLinkedList()).getClass(), forReverseList()); - kryo.register(Lists.reverse(Lists.newArrayList()).getClass(), forRandomAccessReverseList()); - } - - public static ReverseListSerializer forReverseList() { - return new ReverseListSerializer.ReverseList(); - } - - public static ReverseListSerializer forRandomAccessReverseList() { - return new ReverseListSerializer.RandomAccessReverseList(); - } - /** * A {@link Lists.ReverseList} implementation based on a {@link LinkedList}. */ diff --git a/src/main/java/de/javakaffee/kryoserializers/guava/TreeMultimapSerializer.java b/src/main/java/de/javakaffee/kryoserializers/guava/TreeMultimapSerializer.java index 79015754..9023605a 100644 --- a/src/main/java/de/javakaffee/kryoserializers/guava/TreeMultimapSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/guava/TreeMultimapSerializer.java @@ -27,7 +27,8 @@ * The default comparator is assumed so the multimaps are not null-safe. * This does not yet support {@link Kryo#copy(java.lang.Object)}. */ -public class TreeMultimapSerializer extends MultimapSerializerBase> { +public class TreeMultimapSerializer + extends MultimapSerializerBase> { /* assumes default comparator */ private static final boolean DOES_NOT_ACCEPT_NULL = true; @@ -38,6 +39,16 @@ public TreeMultimapSerializer() { super(DOES_NOT_ACCEPT_NULL, IMMUTABLE); } + /** + * Creates a new {@link TreeMultimapSerializer} and registers its serializer. + * + * @param kryo the {@link Kryo} instance to set the serializer on + */ + public static void registerSerializers(final Kryo kryo) { + final TreeMultimapSerializer serializer = new TreeMultimapSerializer(); + kryo.register(TreeMultimap.class, serializer); + } + @Override public void write(Kryo kryo, Output output, TreeMultimap multimap) { writeMultimap(kryo, output, multimap); @@ -49,14 +60,4 @@ public TreeMultimap read(Kryo kryo, Input input, Class()).getClass(), serializer); + } + @VisibleForTesting protected Object getDelegateFromUnmodifiableNavigableSet(NavigableSet object) { try { @@ -79,19 +94,4 @@ public NavigableSet read(Kryo kryo, Input input, Class> type) public NavigableSet copy(Kryo kryo, NavigableSet original) { return Sets.unmodifiableNavigableSet((NavigableSet) kryo.copy(getDelegateFromUnmodifiableNavigableSet(original))); } - - /** - * Creates a new {@link UnmodifiableNavigableSetSerializer} and registers its serializer - * for the UnmodifiableNavigableSetSerializer related class. - * - * @param kryo the {@link Kryo} instance to set the serializer on - */ - public static void registerSerializers(final Kryo kryo) { - - // UnmodifiableNavigableSetSerializer (private class) - - final UnmodifiableNavigableSetSerializer serializer = new UnmodifiableNavigableSetSerializer(); - - kryo.register(Sets.unmodifiableNavigableSet(new TreeSet()).getClass(), serializer); - } } diff --git a/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaDateTimeSerializer.java b/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaDateTimeSerializer.java index 979218ff..fa58dc69 100644 --- a/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaDateTimeSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaDateTimeSerializer.java @@ -19,14 +19,7 @@ import org.joda.time.Chronology; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; -import org.joda.time.chrono.BuddhistChronology; -import org.joda.time.chrono.CopticChronology; -import org.joda.time.chrono.EthiopicChronology; -import org.joda.time.chrono.GJChronology; -import org.joda.time.chrono.GregorianChronology; -import org.joda.time.chrono.ISOChronology; -import org.joda.time.chrono.IslamicChronology; -import org.joda.time.chrono.JulianChronology; +import org.joda.time.chrono.*; import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.Serializer; diff --git a/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaIntervalSerializer.java b/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaIntervalSerializer.java index b512ae85..40f5b5a3 100644 --- a/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaIntervalSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaIntervalSerializer.java @@ -18,14 +18,7 @@ import org.joda.time.Chronology; import org.joda.time.Interval; -import org.joda.time.chrono.BuddhistChronology; -import org.joda.time.chrono.CopticChronology; -import org.joda.time.chrono.EthiopicChronology; -import org.joda.time.chrono.GJChronology; -import org.joda.time.chrono.GregorianChronology; -import org.joda.time.chrono.ISOChronology; -import org.joda.time.chrono.IslamicChronology; -import org.joda.time.chrono.JulianChronology; +import org.joda.time.chrono.*; import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.Serializer; @@ -48,7 +41,6 @@ *
  • {@link BuddhistChronology}
  • *
  • {@link GJChronology}
  • * - * */ public class JodaIntervalSerializer extends Serializer { diff --git a/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaLocalDateSerializer.java b/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaLocalDateSerializer.java index 4707b133..91c12876 100644 --- a/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaLocalDateSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaLocalDateSerializer.java @@ -18,14 +18,7 @@ import org.joda.time.Chronology; import org.joda.time.LocalDate; -import org.joda.time.chrono.BuddhistChronology; -import org.joda.time.chrono.CopticChronology; -import org.joda.time.chrono.EthiopicChronology; -import org.joda.time.chrono.GJChronology; -import org.joda.time.chrono.GregorianChronology; -import org.joda.time.chrono.ISOChronology; -import org.joda.time.chrono.IslamicChronology; -import org.joda.time.chrono.JulianChronology; +import org.joda.time.chrono.*; import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.Serializer; @@ -38,7 +31,7 @@ * No time zone is involved. If the chronology is {@link org.joda.time.chrono.ISOChronology} the * attribute is serialized as an empty string, thus {@link org.joda.time.chrono.ISOChronology} is * considered to be default. - * + *

    * Note that internally the LocalDate object makes use of an iLocalMillis value, but that field is * not accessible for reading here because the getLocalMillis() method is protected. There could * conceivably be cases where a user has created a derived version of LocalDate, and is using the @@ -69,17 +62,14 @@ public JodaLocalDateSerializer() { public LocalDate read(final Kryo kryo, final Input input, final Class type) { final int packedYearMonthDay = input.readInt(true); final Chronology chronology = IdentifiableChronology.readChronology(input); - return new LocalDate(packedYearMonthDay / (13 * 32), - (packedYearMonthDay % (13 * 32)) / 32, - packedYearMonthDay % 32, - chronology); + return new LocalDate(packedYearMonthDay / (13 * 32), (packedYearMonthDay % (13 * 32)) / 32, + packedYearMonthDay % 32, chronology); } @Override public void write(final Kryo kryo, final Output output, final LocalDate localDate) { - final int packedYearMonthDay = localDate.getYear() * 13 * 32 + - localDate.getMonthOfYear() * 32 + - localDate.getDayOfMonth(); + final int packedYearMonthDay = + localDate.getYear() * 13 * 32 + localDate.getMonthOfYear() * 32 + localDate.getDayOfMonth(); output.writeInt(packedYearMonthDay, true); final String chronologyId = IdentifiableChronology.getChronologyId(localDate.getChronology()); output.writeString(chronologyId == null ? "" : chronologyId); diff --git a/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaLocalDateTimeSerializer.java b/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaLocalDateTimeSerializer.java index 311784f5..84069c14 100644 --- a/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaLocalDateTimeSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaLocalDateTimeSerializer.java @@ -18,14 +18,7 @@ import org.joda.time.Chronology; import org.joda.time.LocalDateTime; -import org.joda.time.chrono.BuddhistChronology; -import org.joda.time.chrono.CopticChronology; -import org.joda.time.chrono.EthiopicChronology; -import org.joda.time.chrono.GJChronology; -import org.joda.time.chrono.GregorianChronology; -import org.joda.time.chrono.ISOChronology; -import org.joda.time.chrono.IslamicChronology; -import org.joda.time.chrono.JulianChronology; +import org.joda.time.chrono.*; import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.Serializer; @@ -65,21 +58,15 @@ public LocalDateTime read(Kryo kryo, Input input, Class type) { final int packedYearMonthDay = (int) (packedLocalDateTime / 86400000); final int millisOfDay = (int) (packedLocalDateTime % 86400000); final Chronology chronology = IdentifiableChronology.readChronology(input); - return new LocalDateTime(packedYearMonthDay / (13 * 32), - (packedYearMonthDay % (13 * 32)) / 32, - packedYearMonthDay % 32, - millisOfDay / 3600000, - (millisOfDay % 3600000) / 60000, - (millisOfDay % 60000) / 1000, - millisOfDay % 1000, - chronology); + return new LocalDateTime(packedYearMonthDay / (13 * 32), (packedYearMonthDay % (13 * 32)) / 32, + packedYearMonthDay % 32, millisOfDay / 3600000, (millisOfDay % 3600000) / 60000, + (millisOfDay % 60000) / 1000, millisOfDay % 1000, chronology); } @Override public void write(Kryo kryo, Output output, LocalDateTime localDateTime) { - final int packedYearMonthDay = localDateTime.getYear() * 13 * 32 + - localDateTime.getMonthOfYear() * 32 + - localDateTime.getDayOfMonth(); + final int packedYearMonthDay = + localDateTime.getYear() * 13 * 32 + localDateTime.getMonthOfYear() * 32 + localDateTime.getDayOfMonth(); output.writeLong((long) packedYearMonthDay * 86400000 + localDateTime.getMillisOfDay(), true); final String chronologyId = IdentifiableChronology.getChronologyId(localDateTime.getChronology()); output.writeString(chronologyId == null ? "" : chronologyId); diff --git a/src/main/java/de/javakaffee/kryoserializers/protobuf/ProtobufSerializer.java b/src/main/java/de/javakaffee/kryoserializers/protobuf/ProtobufSerializer.java index ef75eec3..48b9fbeb 100644 --- a/src/main/java/de/javakaffee/kryoserializers/protobuf/ProtobufSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/protobuf/ProtobufSerializer.java @@ -25,9 +25,9 @@ import com.esotericsoftware.kryo.Serializer; import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output; -import com.google.protobuf.GeneratedMessage; +import com.google.protobuf.GeneratedMessageV3; -public class ProtobufSerializer extends Serializer { +public class ProtobufSerializer extends Serializer { private Method parseFromMethod = null; @@ -70,18 +70,15 @@ public T read(Kryo kryo, Input input, Class type) { try { // Deserialize protobuf return (T) (getParseFromMethod(type).invoke(type, (Object) bytes)); - } catch (NoSuchMethodException e) { - throw new RuntimeException("Unable to deserialize protobuf " + e.getMessage(), e); - } catch (InvocationTargetException e) { - throw new RuntimeException("Unable to deserialize protobuf " + e.getMessage(), e); - } catch (IllegalAccessException e) { + } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { throw new RuntimeException("Unable to deserialize protobuf " + e.getMessage(), e); } } /** * Caches method reflection lookup - * @throws NoSuchMethodException + * + * @throws NoSuchMethodException should never be thrown */ private Method getParseFromMethod(Class type) throws NoSuchMethodException { if (parseFromMethod == null) { diff --git a/src/test/java/de/javakaffee/kryoserializers/EnumMapSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/EnumMapSerializerTest.java index 0e67a9a5..da62063f 100755 --- a/src/test/java/de/javakaffee/kryoserializers/EnumMapSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/EnumMapSerializerTest.java @@ -16,9 +16,7 @@ */ package de.javakaffee.kryoserializers; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertNotSame; -import static org.testng.Assert.assertTrue; +import static org.testng.Assert.*; import java.util.EnumMap; import java.util.HashSet; @@ -33,24 +31,6 @@ * A test case for the {@link EnumMapSerializer}. */ public class EnumMapSerializerTest { - private static enum Vipers { - SNAKE_CHARMER, - BLACK_MAMBA, - COTTONMOUTH, - COPPERHEAD, - CALIFORNIA_MOUNTAIN_SNAKE, - SIDEWINDER; - } - - private static enum Colors { - BLUE, - ORANGE, - PINK, - WHITE, - BROWN, - BLONDE; - } - private Kryo _kryo; private EnumMap> _original; @@ -61,8 +41,8 @@ protected void beforeTest() { _original = new EnumMap>(Vipers.class); } - @SuppressWarnings({"unchecked", "rawtypes"}) - @Test(expectedExceptions = {ClassCastException.class}) + @SuppressWarnings({ "unchecked", "rawtypes" }) + @Test(expectedExceptions = { ClassCastException.class }) public void testCopyEmpty() throws Exception { EnumMap copy = _kryo.copy(_original); // The next statement asserts that the key type of the copy is initialized correctly - @@ -83,4 +63,22 @@ public void testDeepCopy() throws Exception { assertNotSame(_original.get(Vipers.BLACK_MAMBA), copy.get(Vipers.BLACK_MAMBA)); assertEquals(_original, copy); } + + private static enum Vipers { + SNAKE_CHARMER, + BLACK_MAMBA, + COTTONMOUTH, + COPPERHEAD, + CALIFORNIA_MOUNTAIN_SNAKE, + SIDEWINDER; + } + + private static enum Colors { + BLUE, + ORANGE, + PINK, + WHITE, + BROWN, + BLONDE; + } } diff --git a/src/test/java/de/javakaffee/kryoserializers/FieldAnnotationAwareSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/FieldAnnotationAwareSerializerTest.java index eba76ffc..c121307d 100644 --- a/src/test/java/de/javakaffee/kryoserializers/FieldAnnotationAwareSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/FieldAnnotationAwareSerializerTest.java @@ -17,16 +17,9 @@ package de.javakaffee.kryoserializers; import static java.nio.charset.StandardCharsets.UTF_8; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertFalse; -import static org.testng.Assert.assertNull; -import static org.testng.Assert.assertTrue; - -import java.lang.annotation.Annotation; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; +import static org.testng.Assert.*; + +import java.lang.annotation.*; import java.nio.ByteBuffer; import java.util.Arrays; @@ -68,8 +61,9 @@ public void testExcludeFields() throws Exception { final Kryo kryo = new Kryo(); @SuppressWarnings("unchecked") - final SerializerFactory disregardingSerializerFactory = new FieldAnnotationAwareSerializer.Factory( - Arrays.> asList(CustomMark.class), true); + final SerializerFactory disregardingSerializerFactory = + new FieldAnnotationAwareSerializer.Factory(Arrays.>asList(CustomMark.class), + true); kryo.addDefaultSerializer(CustomBean.class, disregardingSerializerFactory); final byte[] buffer = makeBuffer(); @@ -94,8 +88,9 @@ public void testIncludeFields() throws Exception { final Kryo kryo = new Kryo(); @SuppressWarnings("unchecked") - final SerializerFactory regardingSerializerFactory = new FieldAnnotationAwareSerializer.Factory( - Arrays.> asList(CustomMark.class), false); + final SerializerFactory regardingSerializerFactory = + new FieldAnnotationAwareSerializer.Factory(Arrays.>asList(CustomMark.class), + false); kryo.addDefaultSerializer(CustomBean.class, regardingSerializerFactory); final byte[] buffer = makeBuffer(); @@ -115,6 +110,11 @@ public void testIncludeFields() throws Exception { assertNull(inputBean.getSecondValue()); } + @Target(ElementType.FIELD) + @Retention(RetentionPolicy.RUNTIME) + private static @interface CustomMark { + } + private static class CustomBean { @CustomMark @@ -138,8 +138,4 @@ public void setFirstValue(final String firstValue) { this.firstValue = firstValue; } } - - @Target(ElementType.FIELD) - @Retention(RetentionPolicy.RUNTIME) - private static @interface CustomMark {} } diff --git a/src/test/java/de/javakaffee/kryoserializers/KryoTest.java b/src/test/java/de/javakaffee/kryoserializers/KryoTest.java index 544897b7..1e5b5d56 100644 --- a/src/test/java/de/javakaffee/kryoserializers/KryoTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/KryoTest.java @@ -16,6 +16,9 @@ */ package de.javakaffee.kryoserializers; +import static de.javakaffee.kryoserializers.TestClasses.*; +import static org.testng.Assert.assertEquals; + import java.lang.reflect.Field; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Modifier; @@ -44,9 +47,6 @@ import de.javakaffee.kryoserializers.TestClasses.*; import de.javakaffee.kryoserializers.TestClasses.Person.Gender; -import static de.javakaffee.kryoserializers.TestClasses.*; -import static org.testng.Assert.assertEquals; - /** * Test for {@link Kryo} serialization. * @@ -145,7 +145,7 @@ protected void beforeTest() { _kryo = new KryoReflectionFactorySupport() { @Override - @SuppressWarnings({"rawtypes", "unchecked"}) + @SuppressWarnings({ "rawtypes", "unchecked" }) public Serializer getDefaultSerializer(final Class type) { if (EnumSet.class.isAssignableFrom(type)) { return new EnumSetSerializer(); @@ -432,8 +432,8 @@ public void testRegex() throws Exception { final Holder deserialized = deserialize(serialize(pattern), Holder.class); assertDeepEquals(deserialized, pattern); - final Holder patternWithFlags = new Holder( - Pattern.compile("\n", Pattern.MULTILINE | Pattern.CASE_INSENSITIVE)); + final Holder patternWithFlags = + new Holder(Pattern.compile("\n", Pattern.MULTILINE | Pattern.CASE_INSENSITIVE)); @SuppressWarnings("unchecked") final Holder deserializedWithFlags = deserialize(serialize(patternWithFlags), Holder.class); assertDeepEquals(deserializedWithFlags, patternWithFlags); @@ -445,24 +445,24 @@ public void testCopyRegex() throws Exception { final Holder copy = _kryo.copy(pattern); assertDeepEquals(copy, pattern); - final Holder patternWithFlags = new Holder( - Pattern.compile("\n", Pattern.MULTILINE | Pattern.CASE_INSENSITIVE)); + final Holder patternWithFlags = + new Holder(Pattern.compile("\n", Pattern.MULTILINE | Pattern.CASE_INSENSITIVE)); final Holder copyWithFlags = _kryo.copy(patternWithFlags); assertDeepEquals(copyWithFlags, patternWithFlags); } @Test(enabled = true) public void testStringBuffer() throws Exception { - final StringBuffer stringBuffer = new StringBuffer( - "with some content \n& some lines..."); + final StringBuffer stringBuffer = + new StringBuffer("with some content \n& some lines..."); final StringBuffer deserialized = deserialize(serialize(stringBuffer), StringBuffer.class); assertDeepEquals(deserialized, stringBuffer); } @Test(enabled = true) public void testStringBuilder() throws Exception { - final StringBuilder stringBuilder = new StringBuilder( - "with some content \n& some lines..."); + final StringBuilder stringBuilder = + new StringBuilder("with some content \n& some lines..."); final StringBuilder deserialized = deserialize(serialize(stringBuilder), StringBuilder.class); assertDeepEquals(deserialized, stringBuilder); } @@ -470,8 +470,8 @@ public void testStringBuilder() throws Exception { @Test(enabled = true) public void testMapWithIntConstructorOnly() throws Exception { final HashMapWithIntConstructorOnly map = new HashMapWithIntConstructorOnly(5); - final HashMapWithIntConstructorOnly deserialized = deserialize(serialize(map), - HashMapWithIntConstructorOnly.class); + final HashMapWithIntConstructorOnly deserialized = + deserialize(serialize(map), HashMapWithIntConstructorOnly.class); assertDeepEquals(deserialized, map); } @@ -491,9 +491,9 @@ public void testCurrency() throws Exception { public Object[][] unmodifiableCollections() { final HashMap m = new HashMap(); m.put("foo", "bar"); - return new Object[][]{{Collections.unmodifiableList(new ArrayList(Arrays.asList("foo", "bar")))}, - {Collections.unmodifiableSet(new HashSet(Arrays.asList("foo", "bar")))}, - {Collections.unmodifiableMap(m)},}; + return new Object[][] { { Collections.unmodifiableList(new ArrayList(Arrays.asList("foo", "bar"))) }, + { Collections.unmodifiableSet(new HashSet(Arrays.asList("foo", "bar"))) }, + { Collections.unmodifiableMap(m) }, }; } @SuppressWarnings("unchecked") @@ -515,9 +515,9 @@ public void testCopyUnmodifiableCollections(final Object collection) throws Exce public Object[][] synchronizedCollections() { final HashMap m = new HashMap(); m.put("foo", "bar"); - return new Object[][]{{Collections.synchronizedList(new ArrayList(Arrays.asList("foo", "bar")))}, - {Collections.synchronizedSet(new HashSet(Arrays.asList("foo", "bar")))}, - {Collections.synchronizedMap(m)},}; + return new Object[][] { { Collections.synchronizedList(new ArrayList(Arrays.asList("foo", "bar"))) }, + { Collections.synchronizedSet(new HashSet(Arrays.asList("foo", "bar"))) }, + { Collections.synchronizedMap(m) }, }; } @SuppressWarnings("unchecked") @@ -538,14 +538,14 @@ public void testCopySynchronizedCollections(final Object collection) throws Exce @SuppressWarnings("unchecked") @Test(enabled = true) public void testJavaUtilCollectionsEmptyList() throws Exception { - final Holder> emptyList = new Holder>(Collections. emptyList()); + final Holder> emptyList = new Holder>(Collections.emptyList()); final Holder> deserialized = deserialize(serialize(emptyList), Holder.class); assertDeepEquals(deserialized, emptyList); } @Test(enabled = true) public void testCopyJavaUtilCollectionsEmptyList() throws Exception { - final Holder> emptyList = new Holder>(Collections. emptyList()); + final Holder> emptyList = new Holder>(Collections.emptyList()); final Holder> copy = _kryo.copy(emptyList); assertDeepEquals(copy, emptyList); } @@ -553,14 +553,14 @@ public void testCopyJavaUtilCollectionsEmptyList() throws Exception { @SuppressWarnings("unchecked") @Test(enabled = true) public void testJavaUtilCollectionsEmptySet() throws Exception { - final Holder> emptyList = new Holder>(Collections. emptySet()); + final Holder> emptyList = new Holder>(Collections.emptySet()); final Holder> deserialized = deserialize(serialize(emptyList), Holder.class); assertDeepEquals(deserialized, emptyList); } @Test(enabled = true) public void testCopyJavaUtilCollectionsEmptySet() throws Exception { - final Holder> emptyList = new Holder>(Collections. emptySet()); + final Holder> emptyList = new Holder>(Collections.emptySet()); final Holder> copy = _kryo.copy(emptyList); assertDeepEquals(copy, emptyList); } @@ -568,16 +568,16 @@ public void testCopyJavaUtilCollectionsEmptySet() throws Exception { @SuppressWarnings("unchecked") @Test(enabled = true) public void testJavaUtilCollectionsEmptyMap() throws Exception { - final Holder> emptyMap = new Holder>( - Collections. emptyMap()); + final Holder> emptyMap = + new Holder>(Collections.emptyMap()); final Holder> deserialized = deserialize(serialize(emptyMap), Holder.class); assertDeepEquals(deserialized, emptyMap); } @Test(enabled = true) public void testCopyJavaUtilCollectionsEmptyMap() throws Exception { - final Holder> emptyMap = new Holder>( - Collections. emptyMap()); + final Holder> emptyMap = + new Holder>(Collections.emptyMap()); final Holder> copy = _kryo.copy(emptyMap); assertDeepEquals(copy, emptyMap); } @@ -585,7 +585,7 @@ public void testCopyJavaUtilCollectionsEmptyMap() throws Exception { @SuppressWarnings("unchecked") @Test(enabled = true) public void testJavaUtilArraysAsListEmpty() throws Exception { - final Holder> asListHolder = new Holder>(Arrays. asList()); + final Holder> asListHolder = new Holder>(Arrays.asList()); final Holder> deserialized = deserialize(serialize(asListHolder), Holder.class); assertDeepEquals(deserialized, asListHolder); } @@ -593,7 +593,7 @@ public void testJavaUtilArraysAsListEmpty() throws Exception { @SuppressWarnings("unchecked") @Test(enabled = true) public void testJavaUtilArraysAsListPrimitiveArrayElement() throws Exception { - final int[] values = {1, 2}; + final int[] values = { 1, 2 }; @SuppressWarnings("rawtypes") final Holder> asListHolder = new Holder(Arrays.asList(values)); final Holder> deserialized = deserialize(serialize(asListHolder), Holder.class); @@ -603,7 +603,7 @@ public void testJavaUtilArraysAsListPrimitiveArrayElement() throws Exception { @SuppressWarnings("unchecked") @Test(enabled = true) public void testJavaUtilArraysAsListBoxedPrimitives() throws Exception { - final Integer[] values = {1, 2}; + final Integer[] values = { 1, 2 }; final List list = Arrays.asList(values); @SuppressWarnings("rawtypes") final Holder> asListHolder = new Holder(list); @@ -614,7 +614,7 @@ public void testJavaUtilArraysAsListBoxedPrimitives() throws Exception { @SuppressWarnings("unchecked") @Test(enabled = true) public void testJavaUtilArraysAsListString() throws Exception { - final Holder> asListHolder = new Holder>(Arrays. asList("foo", "bar")); + final Holder> asListHolder = new Holder>(Arrays.asList("foo", "bar")); final Holder> deserialized = deserialize(serialize(asListHolder), Holder.class); assertDeepEquals(deserialized, asListHolder); } @@ -622,15 +622,15 @@ public void testJavaUtilArraysAsListString() throws Exception { @SuppressWarnings("unchecked") @Test(enabled = true) public void testJavaUtilArraysAsListEmail() throws Exception { - final Holder> asListHolder = new Holder>( - Arrays.asList(new Email("foo", "foo@example.org"))); + final Holder> asListHolder = + new Holder>(Arrays.asList(new Email("foo", "foo@example.org"))); final Holder> deserialized = deserialize(serialize(asListHolder), Holder.class); assertDeepEquals(deserialized, asListHolder); } @Test(enabled = true) public void testCopyJavaUtilArraysAsList() throws Exception { - final List list = Arrays. asList("foo", "bar"); + final List list = Arrays.asList("foo", "bar"); final List copy = _kryo.copy(list); assertDeepEquals(copy, list); } @@ -682,8 +682,8 @@ public void testSharedObjectIdentity_CounterHolder() throws Exception { @DataProvider(name = "sharedObjectIdentityProvider") protected Object[][] createSharedObjectIdentityProviderData() { - return new Object[][]{{AtomicInteger.class.getSimpleName(), new AtomicInteger(42)}, - {Email.class.getSimpleName(), new Email("foo bar", "foo.bar@example.com")}}; + return new Object[][] { { AtomicInteger.class.getSimpleName(), new AtomicInteger(42) }, + { Email.class.getSimpleName(), new Email("foo bar", "foo.bar@example.com") } }; } @SuppressWarnings("unchecked") @@ -712,22 +712,22 @@ public void testSharedObjectIdentity(final String name, final T sharedObject @DataProvider(name = "typesAsSessionAttributesProvider") protected Object[][] createTypesAsSessionAttributesData() { - return new Object[][]{{Boolean.class, Boolean.TRUE}, {String.class, "42"}, - {StringBuilder.class, new StringBuilder("42")}, {StringBuffer.class, new StringBuffer("42")}, - {Class.class, String.class}, {Long.class, new Long(42)}, {Integer.class, new Integer(42)}, - {Character.class, new Character('c')}, {Byte.class, new Byte("b".getBytes()[0])}, - {Double.class, new Double(42d)}, {Float.class, new Float(42f)}, - {Short.class, new Short((short) 42)}, {BigDecimal.class, new BigDecimal(42)}, - {AtomicInteger.class, new AtomicInteger(42)}, {AtomicLong.class, new AtomicLong(42)}, - {MutableInt.class, new MutableInt(42)}, {Integer[].class, new Integer[]{42}}, - {Date.class, new Date(System.currentTimeMillis() - 10000)}, - {Calendar.class, Calendar.getInstance()}, {Currency.class, Currency.getInstance("EUR")}, - {ArrayList.class, new ArrayList(Arrays.asList("foo"))}, {int[].class, new int[]{1, 2}}, - {long[].class, new long[]{1, 2}}, {short[].class, new short[]{1, 2}}, - {float[].class, new float[]{1, 2}}, {double[].class, new double[]{1, 2}}, - {int[].class, new int[]{1, 2}}, {byte[].class, "42".getBytes()}, - {char[].class, "42".toCharArray()}, {String[].class, new String[]{"23", "42"}}, - {Person[].class, new Person[]{createPerson("foo bar", Gender.MALE, 42)}}}; + return new Object[][] { { Boolean.class, Boolean.TRUE }, { String.class, "42" }, + { StringBuilder.class, new StringBuilder("42") }, { StringBuffer.class, new StringBuffer("42") }, + { Class.class, String.class }, { Long.class, new Long(42) }, { Integer.class, new Integer(42) }, + { Character.class, new Character('c') }, { Byte.class, new Byte("b".getBytes()[0]) }, + { Double.class, new Double(42d) }, { Float.class, new Float(42f) }, + { Short.class, new Short((short) 42) }, { BigDecimal.class, new BigDecimal(42) }, + { AtomicInteger.class, new AtomicInteger(42) }, { AtomicLong.class, new AtomicLong(42) }, + { MutableInt.class, new MutableInt(42) }, { Integer[].class, new Integer[] { 42 } }, + { Date.class, new Date(System.currentTimeMillis() - 10000) }, + { Calendar.class, Calendar.getInstance() }, { Currency.class, Currency.getInstance("EUR") }, + { ArrayList.class, new ArrayList(Arrays.asList("foo")) }, { int[].class, new int[] { 1, 2 } }, + { long[].class, new long[] { 1, 2 } }, { short[].class, new short[] { 1, 2 } }, + { float[].class, new float[] { 1, 2 } }, { double[].class, new double[] { 1, 2 } }, + { int[].class, new int[] { 1, 2 } }, { byte[].class, "42".getBytes() }, + { char[].class, "42".toCharArray() }, { String[].class, new String[] { "23", "42" } }, + { Person[].class, new Person[] { createPerson("foo bar", Gender.MALE, 42) } } }; } @Test(enabled = true, dataProvider = "typesAsSessionAttributesProvider") @@ -747,8 +747,8 @@ public void testTypesInContainerClass() throws Exception { @Test(enabled = true) public void testClassWithoutDefaultConstructor() throws Exception { final ClassWithoutDefaultConstructor obj = TestClasses.createClassWithoutDefaultConstructor("foo"); - final ClassWithoutDefaultConstructor deserialized = deserialize(serialize(obj), - ClassWithoutDefaultConstructor.class); + final ClassWithoutDefaultConstructor deserialized = + deserialize(serialize(obj), ClassWithoutDefaultConstructor.class); assertDeepEquals(deserialized, obj); } @@ -791,7 +791,7 @@ public static class EntityWithCollections { private final Map _bazens; public EntityWithCollections() { - _bars = new String[]{"foo", "bar"}; + _bars = new String[] { "foo", "bar" }; _foos = new ArrayList(Arrays.asList("foo", "bar")); _bazens = new HashMap(); _bazens.put("foo", 1); diff --git a/src/test/java/de/javakaffee/kryoserializers/SubListSerializersTest.java b/src/test/java/de/javakaffee/kryoserializers/SubListSerializersTest.java index 5957b6ef..93beced8 100644 --- a/src/test/java/de/javakaffee/kryoserializers/SubListSerializersTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/SubListSerializersTest.java @@ -40,6 +40,10 @@ public class SubListSerializersTest { private Kryo _kryo; + private static ArrayList arrayList(final T... items) { + return new ArrayList(Arrays.asList(items)); + } + @BeforeClass public void beforeClass() { _kryo = new KryoReflectionFactorySupport() { @@ -87,13 +91,15 @@ public void testCopySubList() throws Exception { @Test(enabled = true) public void testSubListSubList() throws Exception { - final List subList = new LinkedList(Arrays.asList(TestEnum.values())).subList(1, 3).subList(1, 2); + final List subList = + new LinkedList(Arrays.asList(TestEnum.values())).subList(1, 3).subList(1, 2); doTest(subList); } @Test(enabled = true) public void testCopySubListSubList() throws Exception { - final List subList = new LinkedList(Arrays.asList(TestEnum.values())).subList(1, 3).subList(1, 2); + final List subList = + new LinkedList(Arrays.asList(TestEnum.values())).subList(1, 3).subList(1, 2); doTestCopy(subList); } @@ -111,13 +117,15 @@ public void testCopyArrayListSubList() throws Exception { @Test(enabled = true) public void testArrayListSubListSubList() throws Exception { - final List subList = new ArrayList(Arrays.asList(TestEnum.values())).subList(1, 3).subList(1, 2); + final List subList = + new ArrayList(Arrays.asList(TestEnum.values())).subList(1, 3).subList(1, 2); doTest(subList); } @Test(enabled = true) public void testCopyArrayListSubListSubList() throws Exception { - final List subList = new ArrayList(Arrays.asList(TestEnum.values())).subList(1, 3).subList(1, 2); + final List subList = + new ArrayList(Arrays.asList(TestEnum.values())).subList(1, 3).subList(1, 2); doTestCopy(subList); } @@ -178,8 +186,4 @@ static enum TestEnum { ITEM3; } - private static ArrayList arrayList(final T... items) { - return new ArrayList(Arrays.asList(items)); - } - } diff --git a/src/test/java/de/javakaffee/kryoserializers/TestClasses.java b/src/test/java/de/javakaffee/kryoserializers/TestClasses.java index 0835dc99..9c8407d3 100644 --- a/src/test/java/de/javakaffee/kryoserializers/TestClasses.java +++ b/src/test/java/de/javakaffee/kryoserializers/TestClasses.java @@ -21,17 +21,7 @@ import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Calendar; -import java.util.Collection; -import java.util.Currency; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; @@ -61,7 +51,8 @@ static Person createPerson(final String name, final Gender gender, final String. return person; } - static Person createPerson(final String name, final Gender gender, final Integer age, final String... emailAddresses) { + static Person createPerson(final String name, final Gender gender, final Integer age, + final String... emailAddresses) { final Person person = new Person(); person.setName(name); person.setGender(gender); @@ -91,10 +82,14 @@ static Container createContainer() { static SomeInterface createProxy() { return (SomeInterface) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), - new Class[]{SomeInterface.class, Serializable.class}, + new Class[] { SomeInterface.class, Serializable.class }, new MyInvocationHandler(SomeInterfaceImpl.class)); } + static interface SomeInterface { + String hello(); + } + static class MyInvocationHandler implements InvocationHandler { private final Class _targetClazz; @@ -112,10 +107,6 @@ public Object invoke(final Object proxy, final Method method, final Object[] arg } } - static interface SomeInterface { - String hello(); - } - static class SomeInterfaceImpl implements SomeInterface { /** @@ -136,37 +127,32 @@ public Container() { _body = new Body(); } - class Body {} + class Body { + } } public static class Person implements Serializable { private static final long serialVersionUID = 1L; - - static enum Gender { - MALE, - FEMALE - } - + private final Collection _friends = new ArrayList(); private String _name; private Gender _gender; private Integer _age; private Map _props; - private final Collection _friends = new ArrayList(); public String getName() { return _name; } - public void addFriend(final Person p) { - _friends.add(p); - } - public void setName(final String name) { _name = name; } + public void addFriend(final Person p) { + _friends.add(p); + } + public Map getProps() { return _props; } @@ -208,21 +194,11 @@ private boolean flatEquals(final Collection c1, final Collection c2) { public int hashCode() { final int prime = 31; int result = 1; - result = prime * result + ((_age == null) - ? 0 - : _age.hashCode()); - result = prime * result + ((_friends == null) - ? 0 - : _friends.size()); - result = prime * result + ((_gender == null) - ? 0 - : _gender.hashCode()); - result = prime * result + ((_name == null) - ? 0 - : _name.hashCode()); - result = prime * result + ((_props == null) - ? 0 - : _props.hashCode()); + result = prime * result + ((_age == null) ? 0 : _age.hashCode()); + result = prime * result + ((_friends == null) ? 0 : _friends.size()); + result = prime * result + ((_gender == null) ? 0 : _gender.hashCode()); + result = prime * result + ((_name == null) ? 0 : _name.hashCode()); + result = prime * result + ((_props == null) ? 0 : _props.hashCode()); return result; } @@ -278,8 +254,13 @@ public boolean equals(final Object obj) { @Override public String toString() { - return "Person [_age=" + _age + ", _friends.size=" + _friends.size() + ", _gender=" + _gender + ", _name=" + _name - + ", _props=" + _props + "]"; + return "Person [_age=" + _age + ", _friends.size=" + _friends.size() + ", _gender=" + _gender + ", _name=" + + _name + ", _props=" + _props + "]"; + } + + static enum Gender { + MALE, + FEMALE } } @@ -291,7 +272,8 @@ public static class Email implements Serializable { private String _name; private String _email; - public Email() {} + public Email() { + } public Email(final String name, final String email) { super(); @@ -319,12 +301,8 @@ public void setEmail(final String email) { public int hashCode() { final int prime = 31; int result = 1; - result = prime * result + ((_email == null) - ? 0 - : _email.hashCode()); - result = prime * result + ((_name == null) - ? 0 - : _name.hashCode()); + result = prime * result + ((_email == null) ? 0 : _email.hashCode()); + result = prime * result + ((_name == null) ? 0 : _name.hashCode()); return result; } @@ -367,7 +345,8 @@ public String toString() { public static class PublicClass { PrivateClass privateClass; - public PublicClass() {} + public PublicClass() { + } public PublicClass(final PrivateClass protectedClass) { this.privateClass = protectedClass; @@ -377,9 +356,7 @@ public PublicClass(final PrivateClass protectedClass) { public int hashCode() { final int prime = 31; int result = 1; - result = prime * result + ((privateClass == null) - ? 0 - : privateClass.hashCode()); + result = prime * result + ((privateClass == null) ? 0 : privateClass.hashCode()); return result; } @@ -413,9 +390,7 @@ private static class PrivateClass { public int hashCode() { final int prime = 31; int result = 1; - result = prime * result + ((foo == null) - ? 0 - : foo.hashCode()); + result = prime * result + ((foo == null) ? 0 : foo.hashCode()); return result; } @@ -453,9 +428,7 @@ public ClassWithoutDefaultConstructor(final String value) { public int hashCode() { final int prime = 31; int result = 1; - result = prime * result + ((value == null) - ? 0 - : value.hashCode()); + result = prime * result + ((value == null) ? 0 : value.hashCode()); return result; } @@ -490,14 +463,17 @@ public String toString() { @SuppressWarnings("unused") public static class MyContainer { - private int _int; - private long _long; private final boolean _boolean; private final Boolean _Boolean; private final Class _Class; - private String _String; private final StringBuilder _StringBuilder; private final StringBuffer _StringBuffer; + private final Currency _Currency; + private final Set _HashSet; + private final Map _HashMap; + private int _int; + private long _long; + private String _String; private Long _Long; private Integer _Integer; private Character _Character; @@ -512,10 +488,7 @@ public static class MyContainer { private Integer[] _IntegerArray; private Date _Date; private Calendar _Calendar; - private final Currency _Currency; private List _ArrayList; - private final Set _HashSet; - private final Map _HashMap; private int[] _intArray; private long[] _longArray; private short[] _shortArray; @@ -547,7 +520,7 @@ public MyContainer() { _AtomicInteger = new AtomicInteger(10); _AtomicLong = new AtomicLong(11); _MutableInt = new MutableInt(12); - _IntegerArray = new Integer[]{13}; + _IntegerArray = new Integer[] { 13 }; _Date = new Date(System.currentTimeMillis() - 10000); _Calendar = Calendar.getInstance(); _Currency = Currency.getInstance("EUR"); @@ -559,15 +532,15 @@ public MyContainer() { _HashMap.put("foo", 23); _HashMap.put("bar", 42); - _intArray = new int[]{1, 2}; - _longArray = new long[]{1, 2}; - _shortArray = new short[]{1, 2}; - _floatArray = new float[]{1, 2}; - _doubleArray = new double[]{1, 2}; + _intArray = new int[] { 1, 2 }; + _longArray = new long[] { 1, 2 }; + _shortArray = new short[] { 1, 2 }; + _floatArray = new float[] { 1, 2 }; + _doubleArray = new double[] { 1, 2 }; _byteArray = "42".getBytes(); _charArray = "42".toCharArray(); - _StringArray = new String[]{"23", "42"}; - _PersonArray = new Person[]{createPerson("foo bar", Gender.MALE, 42)}; + _StringArray = new String[] { "23", "42" }; + _PersonArray = new Person[] { createPerson("foo bar", Gender.MALE, 42) }; } @@ -803,7 +776,8 @@ static class Holder { /** * Default constructor, added for kryo... */ - public Holder() {} + public Holder() { + } public Holder(final T item) { this.item = item; @@ -847,7 +821,8 @@ public static class HashMapWithIntConstructorOnly extends HashMap T createProxy(final T obj) { final Enhancer e = new Enhancer(); - e.setInterfaces(new Class[]{Serializable.class}); + e.setInterfaces(new Class[] { Serializable.class }); final Class class1 = obj.getClass(); e.setSuperclass(class1); e.setCallback(new DelegatingHandler(obj)); e.setNamingPolicy(new DefaultNamingPolicy() { @Override - public String getClassName(final String prefix, final String source, - final Object key, final Predicate names) { + public String getClassName(final String prefix, final String source, final Object key, + final Predicate names) { return super.getClassName("MSM_" + prefix, source, key, names); } }); @@ -207,6 +202,10 @@ public String getClassName(final String prefix, final String source, return (T) e.create(); } + public static interface MyService { + String sayHello(); + } + public static class DelegatingHandler implements InvocationHandler, Serializable { private static final long serialVersionUID = 1L; @@ -226,17 +225,17 @@ public static class ClassToProxy { private String _value; /** - * @param value the value to set + * @return the value */ - public void setValue(final String value) { - _value = value; + public String getValue() { + return _value; } /** - * @return the value + * @param value the value to set */ - public String getValue() { - return _value; + public void setValue(final String value) { + _value = value; } @Override @@ -271,10 +270,6 @@ public void setMyService(final MyService myService) { } - public static interface MyService { - String sayHello(); - } - public static class MyServiceImpl implements MyService { @Override diff --git a/src/test/java/de/javakaffee/kryoserializers/cglib/CustomClassLoader.java b/src/test/java/de/javakaffee/kryoserializers/cglib/CustomClassLoader.java index 2a9aec69..0b84bef0 100644 --- a/src/test/java/de/javakaffee/kryoserializers/cglib/CustomClassLoader.java +++ b/src/test/java/de/javakaffee/kryoserializers/cglib/CustomClassLoader.java @@ -33,17 +33,18 @@ * request to the parent. * * @see Java ClassLoader (2) – Write your own ClassLoader - * */ public class CustomClassLoader extends ClassLoader { + private final Set _definedClasses = new HashSet(); + /** * Parent ClassLoader passed to this constructor * will be used if this ClassLoader can not resolve a * particular class. * * @param parent Parent ClassLoader - * (may be from getClass().getClassLoader()) + * (may be from getClass().getClassLoader()) */ public CustomClassLoader(final ClassLoader parent) { super(parent); @@ -57,14 +58,12 @@ public CustomClassLoader(final ClassLoader parent) { * * @param name Full class name */ - private Class getClass(final String name) - throws ClassNotFoundException { + private Class getClass(final String name) throws ClassNotFoundException { // We are getting a name that looks like // javablogging.package.ClassToLoad // and we have to convert it into the .class file name // like javablogging/package/ClassToLoad.class - final String file = name.replace('.', File.separatorChar) - + ".class"; + final String file = name.replace('.', File.separatorChar) + ".class"; byte[] b = null; try { // This loads the byte code data from the file @@ -88,12 +87,10 @@ private Class getClass(final String name) * If not, it will use the super.loadClass() method * which in turn will pass the request to the parent. * - * @param name - * Full class name + * @param name Full class name */ @Override - public Class loadClass(final String name) - throws ClassNotFoundException { + public Class loadClass(final String name) throws ClassNotFoundException { System.out.println("loading class '" + name + "'"); if (name.startsWith(getClass().getPackage().getName()) && !_definedClasses.contains(name)) { System.out.println("-> custom loading class '" + name + "'"); @@ -103,8 +100,6 @@ public Class loadClass(final String name) return super.loadClass(name); } - private final Set _definedClasses = new HashSet(); - /** * Loads a given file (presumably .class) into a byte array. * The file should be accessible as a resource, for example @@ -113,12 +108,11 @@ public Class loadClass(final String name) * @param name File name to load * @return Byte array read from the file * @throws IOException Is thrown when there - * was some problem reading the file + * was some problem reading the file */ private byte[] loadClassData(final String name) throws IOException { // Opening the file - final InputStream stream = getClass().getClassLoader() - .getResourceAsStream(name); + final InputStream stream = getClass().getClassLoader().getResourceAsStream(name); final int size = stream.available(); final byte buff[] = new byte[size]; final DataInputStream in = new DataInputStream(stream); diff --git a/src/test/java/de/javakaffee/kryoserializers/dexx/ListSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/dexx/ListSerializerTest.java index 2034fcc4..6bc36ec4 100644 --- a/src/test/java/de/javakaffee/kryoserializers/dexx/ListSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/dexx/ListSerializerTest.java @@ -18,9 +18,7 @@ import static de.javakaffee.kryoserializers.KryoTest.deserialize; import static de.javakaffee.kryoserializers.KryoTest.serialize; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertSame; -import static org.testng.Assert.assertTrue; +import static org.testng.Assert.*; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; diff --git a/src/test/java/de/javakaffee/kryoserializers/dexx/MapSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/dexx/MapSerializerTest.java index c34ba928..0d635665 100644 --- a/src/test/java/de/javakaffee/kryoserializers/dexx/MapSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/dexx/MapSerializerTest.java @@ -28,7 +28,7 @@ import com.github.andrewoma.dexx.collection.Maps; /** -* Test for {@link MapSerializer} + * Test for {@link MapSerializer} */ public class MapSerializerTest { diff --git a/src/test/java/de/javakaffee/kryoserializers/guava/ArrayListMultimapSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/guava/ArrayListMultimapSerializerTest.java index 87aa3ec8..8e3882f0 100644 --- a/src/test/java/de/javakaffee/kryoserializers/guava/ArrayListMultimapSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/guava/ArrayListMultimapSerializerTest.java @@ -39,7 +39,8 @@ public void testMultimap(Object[] contents) { final ArrayListMultimap multimap = ArrayListMultimap.create(); populateMultimap(multimap, contents); final byte[] serialized = KryoTest.serialize(_kryo, multimap); - final ArrayListMultimap deserialized = KryoTest.deserialize(_kryo, serialized, ArrayListMultimap.class); + final ArrayListMultimap deserialized = + KryoTest.deserialize(_kryo, serialized, ArrayListMultimap.class); assertEqualMultimaps(false, true, deserialized, multimap); } } diff --git a/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableListSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableListSerializerTest.java index b6c89b45..1ec7996d 100644 --- a/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableListSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableListSerializerTest.java @@ -24,11 +24,7 @@ import org.testng.annotations.Test; import com.esotericsoftware.kryo.Kryo; -import com.google.common.collect.HashBasedTable; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableTable; -import com.google.common.collect.Lists; -import com.google.common.collect.Table; +import com.google.common.collect.*; /** * Test for {@link ImmutableListSerializer}. diff --git a/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableMapSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableMapSerializerTest.java index c37b019c..1db57e8b 100644 --- a/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableMapSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableMapSerializerTest.java @@ -33,13 +33,6 @@ */ public class ImmutableMapSerializerTest { - private enum Planet { - MERCURY, - VENUS, - EARTH, - MARS; - } - private Kryo _kryo; @BeforeTest @@ -87,8 +80,6 @@ public void testEnum() { assertEquals(deserialized, immutableObj); } - // Kryo#copy tests - @Test public void testCopyEmpty() { final ImmutableMap obj = ImmutableMap.of(); @@ -96,6 +87,8 @@ public void testCopyEmpty() { assertSame(copied, obj); } + // Kryo#copy tests + @Test public void testCopySingleton() { final ImmutableMap obj = ImmutableMap.of(1, 1); @@ -110,4 +103,11 @@ public void testCopyRegular() { assertSame(copied, obj); } + private enum Planet { + MERCURY, + VENUS, + EARTH, + MARS; + } + } diff --git a/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableSetSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableSetSerializerTest.java index 3aad9e6b..d64314ab 100644 --- a/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableSetSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableSetSerializerTest.java @@ -24,7 +24,7 @@ import org.testng.annotations.Test; import com.esotericsoftware.kryo.Kryo; -import com.google.common.collect.*; +import com.google.common.collect.ImmutableSet; /** * Test for {@link ImmutableSetSerializer}. diff --git a/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableSortedMapSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableSortedMapSerializerTest.java index a1df99ca..be2288bf 100644 --- a/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableSortedMapSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableSortedMapSerializerTest.java @@ -18,9 +18,7 @@ import static de.javakaffee.kryoserializers.KryoTest.deserialize; import static de.javakaffee.kryoserializers.KryoTest.serialize; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertSame; -import static org.testng.Assert.assertTrue; +import static org.testng.Assert.*; import java.util.EnumMap; @@ -32,13 +30,6 @@ public class ImmutableSortedMapSerializerTest { - private enum Planet { - MERCURY, - VENUS, - EARTH, - MARS; - } - private Kryo _kryo; @BeforeTest @@ -93,8 +84,6 @@ public void testEnum() { assertEquals(deserialized, immutableObj); } - // Kryo#copy tests - @Test public void testCopyEmpty() { final ImmutableSortedMap obj = ImmutableSortedMap.of(); @@ -102,6 +91,8 @@ public void testCopyEmpty() { assertSame(copied, obj); } + // Kryo#copy tests + @Test public void testCopySingleton() { final ImmutableSortedMap obj = ImmutableSortedMap.of(1, 1); @@ -116,4 +107,11 @@ public void testCopyRegular() { assertSame(copied, obj); } + private enum Planet { + MERCURY, + VENUS, + EARTH, + MARS; + } + } diff --git a/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableSortedSetSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableSortedSetSerializerTest.java index 0ec7b555..090f7fc4 100644 --- a/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableSortedSetSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/guava/ImmutableSortedSetSerializerTest.java @@ -18,9 +18,7 @@ import static de.javakaffee.kryoserializers.KryoTest.deserialize; import static de.javakaffee.kryoserializers.KryoTest.serialize; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertSame; -import static org.testng.Assert.assertTrue; +import static org.testng.Assert.*; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; diff --git a/src/test/java/de/javakaffee/kryoserializers/guava/LinkedHashMultimapSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/guava/LinkedHashMultimapSerializerTest.java index 12f82509..9924387f 100644 --- a/src/test/java/de/javakaffee/kryoserializers/guava/LinkedHashMultimapSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/guava/LinkedHashMultimapSerializerTest.java @@ -39,7 +39,8 @@ public void testMultimap(Object[] contents) { final LinkedHashMultimap multimap = LinkedHashMultimap.create(); populateMultimap(multimap, contents); final byte[] serialized = KryoTest.serialize(_kryo, multimap); - final LinkedHashMultimap deserialized = KryoTest.deserialize(_kryo, serialized, LinkedHashMultimap.class); + final LinkedHashMultimap deserialized = + KryoTest.deserialize(_kryo, serialized, LinkedHashMultimap.class); assertEqualMultimaps(true, true, deserialized, multimap); } } diff --git a/src/test/java/de/javakaffee/kryoserializers/guava/LinkedListMultimapSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/guava/LinkedListMultimapSerializerTest.java index 7ad92f2d..d6af8d3c 100644 --- a/src/test/java/de/javakaffee/kryoserializers/guava/LinkedListMultimapSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/guava/LinkedListMultimapSerializerTest.java @@ -39,7 +39,8 @@ public void testMultimap(Object[] contents) { final LinkedListMultimap multimap = LinkedListMultimap.create(); populateMultimap(multimap, contents); final byte[] serialized = KryoTest.serialize(_kryo, multimap); - final LinkedListMultimap deserialized = KryoTest.deserialize(_kryo, serialized, LinkedListMultimap.class); + final LinkedListMultimap deserialized = + KryoTest.deserialize(_kryo, serialized, LinkedListMultimap.class); assertEqualMultimaps(true, true, deserialized, multimap); } } diff --git a/src/test/java/de/javakaffee/kryoserializers/guava/MultimapSerializerTestBase.java b/src/test/java/de/javakaffee/kryoserializers/guava/MultimapSerializerTestBase.java index 7681c050..9f91c061 100644 --- a/src/test/java/de/javakaffee/kryoserializers/guava/MultimapSerializerTestBase.java +++ b/src/test/java/de/javakaffee/kryoserializers/guava/MultimapSerializerTestBase.java @@ -24,16 +24,17 @@ import com.google.common.collect.Multimap; +@SuppressWarnings("unchecked") public abstract class MultimapSerializerTestBase { protected void populateMultimap(Multimap multimap, Object[] contents) { - for (int index = 0; index < contents.length;) { + for (int index = 0; index < contents.length; ) { multimap.put((K) contents[index++], (V) contents[index++]); } } - protected void assertEqualMultimaps(boolean orderedKeys, boolean orderedValues, - Multimap actual, Multimap expected) { + protected void assertEqualMultimaps(boolean orderedKeys, boolean orderedValues, Multimap actual, + Multimap expected) { if (orderedKeys) { Assert.assertEquals(actual.keySet(), expected.keySet()); } else { @@ -50,19 +51,17 @@ protected void assertEqualMultimaps(boolean orderedKeys, boolean orderedV @DataProvider(name = "Google Guava multimaps") public Object[][][] getMultimaps() { - final Object[][] multimaps = new Object[][]{new Object[]{}, - new Object[]{"foo", "bar"}, - new Object[]{"foo", null}, - new Object[]{null, "bar"}, - new Object[]{null, null}, - new Object[]{"new", Thread.State.NEW, "run", Thread.State.RUNNABLE}, - new Object[]{1.0, "foo", null, "bar", 1.0, null, null, "baz", 1.0, "wibble"}, - new Object[]{'a', 1, 'b', 2, 'c', 3, 'a', 4, 'b', 5}, - new Object[]{'a', 1, 'b', 2, 'c', 3, 'a', 1, 'b', 2}}; + final Object[][] multimaps = + new Object[][] { new Object[] {}, new Object[] { "foo", "bar" }, new Object[] { "foo", null }, + new Object[] { null, "bar" }, new Object[] { null, null }, + new Object[] { "new", Thread.State.NEW, "run", Thread.State.RUNNABLE }, + new Object[] { 1.0, "foo", null, "bar", 1.0, null, null, "baz", 1.0, "wibble" }, + new Object[] { 'a', 1, 'b', 2, 'c', 3, 'a', 4, 'b', 5 }, + new Object[] { 'a', 1, 'b', 2, 'c', 3, 'a', 1, 'b', 2 } }; final Object[][][] toProvide = new Object[multimaps.length][][]; int index = 0; for (final Object[] multimap : multimaps) { - toProvide[index++] = new Object[][]{multimap}; + toProvide[index++] = new Object[][] { multimap }; } return toProvide; } diff --git a/src/test/java/de/javakaffee/kryoserializers/guava/TreeMultimapSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/guava/TreeMultimapSerializerTest.java index b4286ca2..f82b7115 100644 --- a/src/test/java/de/javakaffee/kryoserializers/guava/TreeMultimapSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/guava/TreeMultimapSerializerTest.java @@ -36,10 +36,11 @@ public void initializeKyroWithSerializer() { @Test(dataProvider = "Google Guava multimaps (no nulls)") public void testMultimap(Object[] contents) { - final TreeMultimap multimap = TreeMultimap. create(); + final TreeMultimap multimap = TreeMultimap.create(); populateMultimap(multimap, contents); final byte[] serialized = KryoTest.serialize(_kryo, multimap); - final TreeMultimap deserialized = KryoTest.deserialize(_kryo, serialized, TreeMultimap.class); + final TreeMultimap deserialized = + KryoTest.deserialize(_kryo, serialized, TreeMultimap.class); assertEqualMultimaps(true, true, deserialized, multimap); } } diff --git a/src/test/java/de/javakaffee/kryoserializers/guava/UnmodifiableNavigableSetSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/guava/UnmodifiableNavigableSetSerializerTest.java index ef476e46..f170abbb 100644 --- a/src/test/java/de/javakaffee/kryoserializers/guava/UnmodifiableNavigableSetSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/guava/UnmodifiableNavigableSetSerializerTest.java @@ -18,10 +18,7 @@ import static de.javakaffee.kryoserializers.KryoTest.deserialize; import static de.javakaffee.kryoserializers.KryoTest.serialize; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertFalse; -import static org.testng.Assert.assertTrue; -import static org.testng.Assert.fail; +import static org.testng.Assert.*; import java.util.NavigableSet; import java.util.TreeSet; @@ -36,11 +33,17 @@ /** * Test for {@link ImmutableSortedSetSerializer}. */ -@SuppressWarnings({"rawtypes", "unchecked"}) +@SuppressWarnings({ "rawtypes", "unchecked" }) public class UnmodifiableNavigableSetSerializerTest { + Class unmodifiableClass; + UnmodifiableNavigableSetSerializer forUnwrapping = new UnmodifiableNavigableSetSerializer(); private Kryo _kryo; + { + unmodifiableClass = (Class) Sets.unmodifiableNavigableSet(new TreeSet()).getClass(); + } + @BeforeTest public void setUp() { _kryo = new Kryo(); @@ -48,17 +51,8 @@ public void setUp() { UnmodifiableNavigableSetSerializer.registerSerializers(_kryo); } - Class unmodifiableClass; - { - unmodifiableClass = (Class) Sets.unmodifiableNavigableSet(new TreeSet()).getClass(); - } - - UnmodifiableNavigableSetSerializer forUnwrapping = new UnmodifiableNavigableSetSerializer(); - private void assertUnderlyingSet(NavigableSet deserialized, Class class1) { - assertEquals( - forUnwrapping.getDelegateFromUnmodifiableNavigableSet(deserialized).getClass(), - class1, + assertEquals(forUnwrapping.getDelegateFromUnmodifiableNavigableSet(deserialized).getClass(), class1, "Expected underlying class to match"); } @@ -74,7 +68,8 @@ public void testEmptyTreeSet() { try { deserialized.add("a"); fail("Should have been unable to add a field to an unmodifiable collection post deserialization"); - } catch (UnsupportedOperationException expected) {} + } catch (UnsupportedOperationException expected) { + } assertUnderlyingSet(deserialized, coreSet.getClass()); } @@ -90,7 +85,8 @@ public void testEmptySkipList() { try { deserialized.add("a"); fail("Should have been unable to add a field to an unmodifiable collection post deserialization"); - } catch (UnsupportedOperationException expected) {} + } catch (UnsupportedOperationException expected) { + } assertUnderlyingSet(deserialized, coreSet.getClass()); } @@ -111,7 +107,8 @@ public void testPopulatedTreeSet() { try { deserialized.add("a"); fail("Should have been unable to add a field to an unmodifiable collection post deserialization"); - } catch (UnsupportedOperationException expected) {} + } catch (UnsupportedOperationException expected) { + } assertUnderlyingSet(deserialized, coreSet.getClass()); } @@ -132,7 +129,8 @@ public void testPopulatedSkipList() { try { deserialized.add("a"); fail("Should have been unable to add a field to an unmodifiable collection post deserialization"); - } catch (UnsupportedOperationException expected) {} + } catch (UnsupportedOperationException expected) { + } assertUnderlyingSet(deserialized, coreSet.getClass()); } @@ -150,7 +148,8 @@ public void testCopyEmptyTreeSet() { try { copied.add("a"); fail("Should have been unable to add a field to an unmodifiable collection post deserialization"); - } catch (UnsupportedOperationException expected) {} + } catch (UnsupportedOperationException expected) { + } assertUnderlyingSet(copied, coreSet.getClass()); } @@ -166,7 +165,8 @@ public void testCopyEmptySkipList() { try { copied.add("a"); fail("Should have been unable to add a field to an unmodifiable collection post deserialization"); - } catch (UnsupportedOperationException expected) {} + } catch (UnsupportedOperationException expected) { + } assertUnderlyingSet(copied, coreSet.getClass()); } @@ -187,7 +187,8 @@ public void testCopyPopulatedTreeSet() { try { copied.add("a"); fail("Should have been unable to add a field to an unmodifiable collection post deserialization"); - } catch (UnsupportedOperationException expected) {} + } catch (UnsupportedOperationException expected) { + } assertUnderlyingSet(copied, coreSet.getClass()); } @@ -208,7 +209,8 @@ public void testCopyPopulatedSkipList() { try { copied.add("a"); fail("Should have been unable to add a field to an unmodifiable collection post deserialization"); - } catch (UnsupportedOperationException expected) {} + } catch (UnsupportedOperationException expected) { + } assertUnderlyingSet(copied, coreSet.getClass()); } } diff --git a/src/test/java/de/javakaffee/kryoserializers/jodatime/JodaIntervalSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/jodatime/JodaIntervalSerializerTest.java index 7702b895..38d1cc80 100644 --- a/src/test/java/de/javakaffee/kryoserializers/jodatime/JodaIntervalSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/jodatime/JodaIntervalSerializerTest.java @@ -30,7 +30,6 @@ /** * Test for {@link JodaIntervalSerializer}. - * */ public class JodaIntervalSerializerTest { diff --git a/src/test/java/de/javakaffee/kryoserializers/jodatime/JodaLocalTimeSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/jodatime/JodaLocalTimeSerializerTest.java index 45ebe699..af4c9c6f 100644 --- a/src/test/java/de/javakaffee/kryoserializers/jodatime/JodaLocalTimeSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/jodatime/JodaLocalTimeSerializerTest.java @@ -19,7 +19,9 @@ import static de.javakaffee.kryoserializers.KryoTest.deserialize; import static de.javakaffee.kryoserializers.KryoTest.serialize; -import org.joda.time.*; +import org.joda.time.Chronology; +import org.joda.time.DateTimeZone; +import org.joda.time.LocalTime; import org.joda.time.chrono.GregorianChronology; import org.testng.Assert; import org.testng.annotations.BeforeTest; diff --git a/src/test/java/de/javakaffee/kryoserializers/protobuf/ProtobufSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/protobuf/ProtobufSerializerTest.java index 47c64c9d..7d4058cc 100644 --- a/src/test/java/de/javakaffee/kryoserializers/protobuf/ProtobufSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/protobuf/ProtobufSerializerTest.java @@ -31,22 +31,23 @@ import de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA; import de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB; +@SuppressWarnings("unchecked") public class ProtobufSerializerTest { private Kryo _kryo; @BeforeTest - public void setUp() throws Exception { + public void setUp() { _kryo = new Kryo(); _kryo.register(SampleProtoA.class, new ProtobufSerializer()); _kryo.register(SampleProtoB.class, new ProtobufSerializer()); } - @Test /** * Verifies that the Serializer works over a single Protobuf object */ - public void testSerializerWithProtoA() throws Exception { + @Test + public void testSerializerWithProtoA() { Integer expectedMessageId = 12332; String expectedName = "Esteban"; @@ -59,18 +60,19 @@ public void testSerializerWithProtoA() throws Exception { // Attempt to deserialize Input i = new Input(new ByteArrayInputStream(outStream.toByteArray()), 4096); - SampleProtoA verifyProtoA = (SampleProtoA) _kryo.getSerializer(protoA.getClass()).read(_kryo, i, SampleProtoA.class); + SampleProtoA verifyProtoA = + (SampleProtoA) _kryo.getSerializer(protoA.getClass()).read(_kryo, i, SampleProtoA.class); // Verify it - assertEquals((Integer) expectedMessageId, (Integer) verifyProtoA.getMessageId(), "MessageId is correct"); - assertEquals((String) expectedName, (String) verifyProtoA.getName(), "Name is correct"); + assertEquals(expectedMessageId, (Integer) verifyProtoA.getMessageId(), "MessageId is correct"); + assertEquals(expectedName, verifyProtoA.getName(), "Name is correct"); } - @Test /** * Verifies that the Serializer works back to back with multiple protobufs instances of the same type (SampleProtoA) */ - public void testSerializerWithMultipleInstances() throws Exception { + @Test + public void testSerializerWithMultipleInstances() { // Create first instance Integer expectedMessageId1 = 12332; String expectedName1 = "Esteban"; @@ -95,26 +97,28 @@ public void testSerializerWithMultipleInstances() throws Exception { // Attempt to deserialize instance 1 Input i = new Input(new ByteArrayInputStream(serializedProtoA1), 4096); - SampleProtoA testProtoA1 = (SampleProtoA) _kryo.getSerializer(protoA1.getClass()).read(_kryo, i, SampleProtoA.class); + SampleProtoA testProtoA1 = + (SampleProtoA) _kryo.getSerializer(protoA1.getClass()).read(_kryo, i, SampleProtoA.class); // Attempt to deserialize instance 2 i = new Input(new ByteArrayInputStream(serializedProtoA2), 4096); - SampleProtoA testProtoA2 = (SampleProtoA) _kryo.getSerializer(protoA1.getClass()).read(_kryo, i, SampleProtoA.class); + SampleProtoA testProtoA2 = + (SampleProtoA) _kryo.getSerializer(protoA1.getClass()).read(_kryo, i, SampleProtoA.class); // Verify instance 1 - assertEquals((Integer) expectedMessageId1, (Integer) testProtoA1.getMessageId(), "MessageId is correct"); - assertEquals((String) expectedName1, (String) testProtoA1.getName(), "Name is correct"); + assertEquals(expectedMessageId1, (Integer) testProtoA1.getMessageId(), "MessageId is correct"); + assertEquals(expectedName1, testProtoA1.getName(), "Name is correct"); // Verify instance 2 - assertEquals((Integer) expectedMessageId2, (Integer) testProtoA2.getMessageId(), "MessageId is correct"); - assertEquals((String) expectedName2, (String) testProtoA2.getName(), "Name is correct"); + assertEquals(expectedMessageId2, (Integer) testProtoA2.getMessageId(), "MessageId is correct"); + assertEquals(expectedName2, testProtoA2.getName(), "Name is correct"); } - @Test /** * Verifies that the Serializer works back to back with multiple protobufs instances of different types (SampleProtoA and SampleProtoB) */ - public void testSerializerWithMultipleInstancesDifferentTypes() throws Exception { + @Test + public void testSerializerWithMultipleInstancesDifferentTypes() { // Create first instance Integer expectedMessageId = 12332; String expectedName = "Esteban"; @@ -135,47 +139,47 @@ public void testSerializerWithMultipleInstancesDifferentTypes() throws Exception // Attempt to serialize instance 2 outStream = new ByteArrayOutputStream(); o = new Output(outStream, 4096); - ProtobufSerializer protoBSerializer = new ProtobufSerializer(); _kryo.getSerializer(protoB.getClass()).write(_kryo, o, protoB); byte[] serializedProtoB = outStream.toByteArray(); // Attempt to deserialize instance 1 Input i = new Input(new ByteArrayInputStream(serializedProtoA), 4096); - SampleProtoA testProtoA = (SampleProtoA) _kryo.getSerializer(protoA.getClass()).read(_kryo, i, SampleProtoA.class); + SampleProtoA testProtoA = + (SampleProtoA) _kryo.getSerializer(protoA.getClass()).read(_kryo, i, SampleProtoA.class); // Attempt to deserialize instance 2 i = new Input(new ByteArrayInputStream(serializedProtoB), 4096); - SampleProtoB testProtoB = (SampleProtoB) _kryo.getSerializer(protoB.getClass()).read(_kryo, i, SampleProtoB.class); + SampleProtoB testProtoB = + (SampleProtoB) _kryo.getSerializer(protoB.getClass()).read(_kryo, i, SampleProtoB.class); // Verify instance 1 - assertEquals((Integer) expectedMessageId, (Integer) testProtoA.getMessageId(), "MessageId is correct"); - assertEquals((String) expectedName, (String) testProtoA.getName(), "Name is correct"); + assertEquals(expectedMessageId, (Integer) testProtoA.getMessageId(), "MessageId is correct"); + assertEquals(expectedName, testProtoA.getName(), "Name is correct"); // Verify instance 2 - assertEquals((Integer) expectedIdentifier, (Integer) testProtoB.getIdentifier(), "Identifier is correct"); - assertEquals((String) expectedCity, (String) testProtoB.getCity(), "City is correct"); - assertEquals((String) expectedState, (String) testProtoB.getState(), "State is correct"); + assertEquals(expectedIdentifier, (Integer) testProtoB.getIdentifier(), "Identifier is correct"); + assertEquals(expectedCity, testProtoB.getCity(), "City is correct"); + assertEquals(expectedState, testProtoB.getState(), "State is correct"); } @Test - public void testGetAcceptsNull() throws Exception { + public void testGetAcceptsNull() { ProtobufSerializer serializer = new ProtobufSerializer(); assertTrue(serializer.getAcceptsNull(), "Accepts null"); } @Test public void testNull() { - SampleProtoA sampleProtoA = null; - // Attempt to serialize null ByteArrayOutputStream outStream = new ByteArrayOutputStream(); Output o = new Output(outStream, 4096); - _kryo.getSerializer(SampleProtoA.class).write(_kryo, o, sampleProtoA); + _kryo.getSerializer(SampleProtoA.class).write(_kryo, o, null); byte[] serializedNullValue = outStream.toByteArray(); // Attempt to deserialize Input i = new Input(new ByteArrayInputStream(serializedNullValue), 4096); - SampleProtoA testNullProto = (SampleProtoA) _kryo.getSerializer(SampleProtoA.class).read(_kryo, i, SampleProtoA.class); + SampleProtoA testNullProto = + (SampleProtoA) _kryo.getSerializer(SampleProtoA.class).read(_kryo, i, SampleProtoA.class); assertNull(testNullProto); } diff --git a/src/test/java/de/javakaffee/kryoserializers/protobuf/SampleProtoAOuterClass.java b/src/test/java/de/javakaffee/kryoserializers/protobuf/SampleProtoAOuterClass.java deleted file mode 100644 index 19667eec..00000000 --- a/src/test/java/de/javakaffee/kryoserializers/protobuf/SampleProtoAOuterClass.java +++ /dev/null @@ -1,652 +0,0 @@ -/* - * Copyright 2018 Martin Grotzke - * - * 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 - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package de.javakaffee.kryoserializers.protobuf; - -public final class SampleProtoAOuterClass { - private SampleProtoAOuterClass() {} - - public static void registerAllExtensions( - com.google.protobuf.ExtensionRegistry registry) {} - - public interface SampleProtoAOrBuilder extends - // @@protoc_insertion_point(interface_extends:ProtocolBuffers.SampleProtoA) - com.google.protobuf.MessageOrBuilder { - - /** - * optional string name = 1; - */ - boolean hasName(); - - /** - * optional string name = 1; - */ - java.lang.String getName(); - - /** - * optional string name = 1; - */ - com.google.protobuf.ByteString getNameBytes(); - - /** - * optional uint32 message_id = 2; - */ - boolean hasMessageId(); - - /** - * optional uint32 message_id = 2; - */ - int getMessageId(); - } - - /** - * Protobuf type {@code ProtocolBuffers.SampleProtoA} - */ - public static final class SampleProtoA extends - com.google.protobuf.GeneratedMessage implements - // @@protoc_insertion_point(message_implements:ProtocolBuffers.SampleProtoA) - SampleProtoAOrBuilder { - // Use SampleProtoA.newBuilder() to construct. - private SampleProtoA(com.google.protobuf.GeneratedMessage.Builder builder) { - super(builder); - this.unknownFields = builder.getUnknownFields(); - } - - private SampleProtoA(boolean noInit) { - this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); - } - - private static final SampleProtoA defaultInstance; - - public static SampleProtoA getDefaultInstance() { - return defaultInstance; - } - - public SampleProtoA getDefaultInstanceForType() { - return defaultInstance; - } - - private final com.google.protobuf.UnknownFieldSet unknownFields; - - @java.lang.Override - public final com.google.protobuf.UnknownFieldSet getUnknownFields() { - return this.unknownFields; - } - - private SampleProtoA( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - initFields(); - int mutable_bitField0_ = 0; - com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder(); - try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch (tag) { - case 0: - done = true; - break; - default: { - if (!parseUnknownField(input, unknownFields, - extensionRegistry, tag)) { - done = true; - } - break; - } - case 10: { - com.google.protobuf.ByteString bs = input.readBytes(); - bitField0_ |= 0x00000001; - name_ = bs; - break; - } - case 16: { - bitField0_ |= 0x00000002; - messageId_ = input.readUInt32(); - break; - } - } - } - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(this); - } catch (java.io.IOException e) { - throw new com.google.protobuf.InvalidProtocolBufferException( - e.getMessage()).setUnfinishedMessage(this); - } finally { - this.unknownFields = unknownFields.build(); - makeExtensionsImmutable(); - } - } - - public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { - return de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.internal_static_ProtocolBuffers_SampleProtoA_descriptor; - } - - protected com.google.protobuf.GeneratedMessage.FieldAccessorTable internalGetFieldAccessorTable() { - return de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.internal_static_ProtocolBuffers_SampleProtoA_fieldAccessorTable - .ensureFieldAccessorsInitialized( - de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA.class, de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA.Builder.class); - } - - public static com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() { - public SampleProtoA parsePartialFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return new SampleProtoA(input, extensionRegistry); - } - }; - - @java.lang.Override - public com.google.protobuf.Parser getParserForType() { - return PARSER; - } - - private int bitField0_; - public static final int NAME_FIELD_NUMBER = 1; - private java.lang.Object name_; - - /** - * optional string name = 1; - */ - public boolean hasName() { - return ((bitField0_ & 0x00000001) == 0x00000001); - } - - /** - * optional string name = 1; - */ - public java.lang.String getName() { - java.lang.Object ref = name_; - if (ref instanceof java.lang.String) { - return (java.lang.String) ref; - } else { - com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; - java.lang.String s = bs.toStringUtf8(); - if (bs.isValidUtf8()) { - name_ = s; - } - return s; - } - } - - /** - * optional string name = 1; - */ - public com.google.protobuf.ByteString getNameBytes() { - java.lang.Object ref = name_; - if (ref instanceof java.lang.String) { - com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8( - (java.lang.String) ref); - name_ = b; - return b; - } else { - return (com.google.protobuf.ByteString) ref; - } - } - - public static final int MESSAGE_ID_FIELD_NUMBER = 2; - private int messageId_; - - /** - * optional uint32 message_id = 2; - */ - public boolean hasMessageId() { - return ((bitField0_ & 0x00000002) == 0x00000002); - } - - /** - * optional uint32 message_id = 2; - */ - public int getMessageId() { - return messageId_; - } - - private void initFields() { - name_ = ""; - messageId_ = 0; - } - - private byte memoizedIsInitialized = -1; - - public final boolean isInitialized() { - byte isInitialized = memoizedIsInitialized; - if (isInitialized == 1) - return true; - if (isInitialized == 0) - return false; - - memoizedIsInitialized = 1; - return true; - } - - public void writeTo(com.google.protobuf.CodedOutputStream output) - throws java.io.IOException { - getSerializedSize(); - if (((bitField0_ & 0x00000001) == 0x00000001)) { - output.writeBytes(1, getNameBytes()); - } - if (((bitField0_ & 0x00000002) == 0x00000002)) { - output.writeUInt32(2, messageId_); - } - getUnknownFields().writeTo(output); - } - - private int memoizedSerializedSize = -1; - - public int getSerializedSize() { - int size = memoizedSerializedSize; - if (size != -1) - return size; - - size = 0; - if (((bitField0_ & 0x00000001) == 0x00000001)) { - size += com.google.protobuf.CodedOutputStream - .computeBytesSize(1, getNameBytes()); - } - if (((bitField0_ & 0x00000002) == 0x00000002)) { - size += com.google.protobuf.CodedOutputStream - .computeUInt32Size(2, messageId_); - } - size += getUnknownFields().getSerializedSize(); - memoizedSerializedSize = size; - return size; - } - - private static final long serialVersionUID = 0L; - - @java.lang.Override - protected java.lang.Object writeReplace() - throws java.io.ObjectStreamException { - return super.writeReplace(); - } - - public static de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA parseFrom( - com.google.protobuf.ByteString data) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data); - } - - public static de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA parseFrom( - com.google.protobuf.ByteString data, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data, extensionRegistry); - } - - public static de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA parseFrom(byte[] data) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data); - } - - public static de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA parseFrom( - byte[] data, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data, extensionRegistry); - } - - public static de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA parseFrom(java.io.InputStream input) - throws java.io.IOException { - return PARSER.parseFrom(input); - } - - public static de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA parseFrom( - java.io.InputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseFrom(input, extensionRegistry); - } - - public static de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA parseDelimitedFrom(java.io.InputStream input) - throws java.io.IOException { - return PARSER.parseDelimitedFrom(input); - } - - public static de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA parseDelimitedFrom( - java.io.InputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseDelimitedFrom(input, extensionRegistry); - } - - public static de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA parseFrom( - com.google.protobuf.CodedInputStream input) - throws java.io.IOException { - return PARSER.parseFrom(input); - } - - public static de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA parseFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseFrom(input, extensionRegistry); - } - - public static Builder newBuilder() { - return Builder.create(); - } - - public Builder newBuilderForType() { - return newBuilder(); - } - - public static Builder newBuilder(de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA prototype) { - return newBuilder().mergeFrom(prototype); - } - - public Builder toBuilder() { - return newBuilder(this); - } - - @java.lang.Override - protected Builder newBuilderForType( - com.google.protobuf.GeneratedMessage.BuilderParent parent) { - Builder builder = new Builder(parent); - return builder; - } - - /** - * Protobuf type {@code ProtocolBuffers.SampleProtoA} - */ - public static final class Builder extends - com.google.protobuf.GeneratedMessage.Builder implements - // @@protoc_insertion_point(builder_implements:ProtocolBuffers.SampleProtoA) - de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoAOrBuilder { - public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { - return de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.internal_static_ProtocolBuffers_SampleProtoA_descriptor; - } - - protected com.google.protobuf.GeneratedMessage.FieldAccessorTable internalGetFieldAccessorTable() { - return de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.internal_static_ProtocolBuffers_SampleProtoA_fieldAccessorTable - .ensureFieldAccessorsInitialized( - de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA.class, de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA.Builder.class); - } - - // Construct using de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA.newBuilder() - private Builder() { - maybeForceBuilderInitialization(); - } - - private Builder( - com.google.protobuf.GeneratedMessage.BuilderParent parent) { - super(parent); - maybeForceBuilderInitialization(); - } - - private void maybeForceBuilderInitialization() { - if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {} - } - - private static Builder create() { - return new Builder(); - } - - public Builder clear() { - super.clear(); - name_ = ""; - bitField0_ = (bitField0_ & ~0x00000001); - messageId_ = 0; - bitField0_ = (bitField0_ & ~0x00000002); - return this; - } - - public Builder clone() { - return create().mergeFrom(buildPartial()); - } - - public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { - return de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.internal_static_ProtocolBuffers_SampleProtoA_descriptor; - } - - public de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA getDefaultInstanceForType() { - return de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA.getDefaultInstance(); - } - - public de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA build() { - de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA result = buildPartial(); - if (!result.isInitialized()) { - throw newUninitializedMessageException(result); - } - return result; - } - - public de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA buildPartial() { - de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA result = new de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA(this); - int from_bitField0_ = bitField0_; - int to_bitField0_ = 0; - if (((from_bitField0_ & 0x00000001) == 0x00000001)) { - to_bitField0_ |= 0x00000001; - } - result.name_ = name_; - if (((from_bitField0_ & 0x00000002) == 0x00000002)) { - to_bitField0_ |= 0x00000002; - } - result.messageId_ = messageId_; - result.bitField0_ = to_bitField0_; - onBuilt(); - return result; - } - - public Builder mergeFrom(com.google.protobuf.Message other) { - if (other instanceof de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA) { - return mergeFrom((de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA) other); - } else { - super.mergeFrom(other); - return this; - } - } - - public Builder mergeFrom(de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA other) { - if (other == de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA.getDefaultInstance()) - return this; - if (other.hasName()) { - bitField0_ |= 0x00000001; - name_ = other.name_; - onChanged(); - } - if (other.hasMessageId()) { - setMessageId(other.getMessageId()); - } - this.mergeUnknownFields(other.getUnknownFields()); - return this; - } - - public final boolean isInitialized() { - return true; - } - - public Builder mergeFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA parsedMessage = null; - try { - parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - parsedMessage = (de.javakaffee.kryoserializers.protobuf.SampleProtoAOuterClass.SampleProtoA) e.getUnfinishedMessage(); - throw e; - } finally { - if (parsedMessage != null) { - mergeFrom(parsedMessage); - } - } - return this; - } - - private int bitField0_; - - private java.lang.Object name_ = ""; - - /** - * optional string name = 1; - */ - public boolean hasName() { - return ((bitField0_ & 0x00000001) == 0x00000001); - } - - /** - * optional string name = 1; - */ - public java.lang.String getName() { - java.lang.Object ref = name_; - if (!(ref instanceof java.lang.String)) { - com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; - java.lang.String s = bs.toStringUtf8(); - if (bs.isValidUtf8()) { - name_ = s; - } - return s; - } else { - return (java.lang.String) ref; - } - } - - /** - * optional string name = 1; - */ - public com.google.protobuf.ByteString getNameBytes() { - java.lang.Object ref = name_; - if (ref instanceof String) { - com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8( - (java.lang.String) ref); - name_ = b; - return b; - } else { - return (com.google.protobuf.ByteString) ref; - } - } - - /** - * optional string name = 1; - */ - public Builder setName( - java.lang.String value) { - if (value == null) { - throw new NullPointerException(); - } - bitField0_ |= 0x00000001; - name_ = value; - onChanged(); - return this; - } - - /** - * optional string name = 1; - */ - public Builder clearName() { - bitField0_ = (bitField0_ & ~0x00000001); - name_ = getDefaultInstance().getName(); - onChanged(); - return this; - } - - /** - * optional string name = 1; - */ - public Builder setNameBytes( - com.google.protobuf.ByteString value) { - if (value == null) { - throw new NullPointerException(); - } - bitField0_ |= 0x00000001; - name_ = value; - onChanged(); - return this; - } - - private int messageId_; - - /** - * optional uint32 message_id = 2; - */ - public boolean hasMessageId() { - return ((bitField0_ & 0x00000002) == 0x00000002); - } - - /** - * optional uint32 message_id = 2; - */ - public int getMessageId() { - return messageId_; - } - - /** - * optional uint32 message_id = 2; - */ - public Builder setMessageId(int value) { - bitField0_ |= 0x00000002; - messageId_ = value; - onChanged(); - return this; - } - - /** - * optional uint32 message_id = 2; - */ - public Builder clearMessageId() { - bitField0_ = (bitField0_ & ~0x00000002); - messageId_ = 0; - onChanged(); - return this; - } - - // @@protoc_insertion_point(builder_scope:ProtocolBuffers.SampleProtoA) - } - - static { - defaultInstance = new SampleProtoA(true); - defaultInstance.initFields(); - } - - // @@protoc_insertion_point(class_scope:ProtocolBuffers.SampleProtoA) - } - - private static final com.google.protobuf.Descriptors.Descriptor internal_static_ProtocolBuffers_SampleProtoA_descriptor; - private static com.google.protobuf.GeneratedMessage.FieldAccessorTable internal_static_ProtocolBuffers_SampleProtoA_fieldAccessorTable; - - public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() { - return descriptor; - } - - private static com.google.protobuf.Descriptors.FileDescriptor descriptor; - static { - java.lang.String[] descriptorData = { - "\n\022SampleProtoA.proto\022\017ProtocolBuffers\"0\n" + - "\014SampleProtoA\022\014\n\004name\030\001 \001(\t\022\022\n\nmessage_i" + - "d\030\002 \001(\rB@\n&de.javakaffee.kryoserializers" + - ".protobufB\026SampleProtoAOuterClass" - }; - com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { - public com.google.protobuf.ExtensionRegistry assignDescriptors( - com.google.protobuf.Descriptors.FileDescriptor root) { - descriptor = root; - return null; - } - }; - com.google.protobuf.Descriptors.FileDescriptor - .internalBuildGeneratedFileFrom(descriptorData, - new com.google.protobuf.Descriptors.FileDescriptor[]{ - }, assigner); - internal_static_ProtocolBuffers_SampleProtoA_descriptor = getDescriptor().getMessageTypes().get(0); - internal_static_ProtocolBuffers_SampleProtoA_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( - internal_static_ProtocolBuffers_SampleProtoA_descriptor, - new java.lang.String[]{"Name", "MessageId",}); - } - - // @@protoc_insertion_point(outer_class_scope) -} diff --git a/src/test/java/de/javakaffee/kryoserializers/protobuf/SampleProtoBOuterClass.java b/src/test/java/de/javakaffee/kryoserializers/protobuf/SampleProtoBOuterClass.java deleted file mode 100644 index 10d13a5d..00000000 --- a/src/test/java/de/javakaffee/kryoserializers/protobuf/SampleProtoBOuterClass.java +++ /dev/null @@ -1,838 +0,0 @@ -/* - * Copyright 2018 Martin Grotzke - * - * 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 - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package de.javakaffee.kryoserializers.protobuf; - -public final class SampleProtoBOuterClass { - private SampleProtoBOuterClass() {} - - public static void registerAllExtensions( - com.google.protobuf.ExtensionRegistry registry) {} - - public interface SampleProtoBOrBuilder extends - // @@protoc_insertion_point(interface_extends:ProtocolBuffers.SampleProtoB) - com.google.protobuf.MessageOrBuilder { - - /** - * required uint32 identifier = 1; - */ - boolean hasIdentifier(); - - /** - * required uint32 identifier = 1; - */ - int getIdentifier(); - - /** - * required string state = 2; - */ - boolean hasState(); - - /** - * required string state = 2; - */ - java.lang.String getState(); - - /** - * required string state = 2; - */ - com.google.protobuf.ByteString getStateBytes(); - - /** - * required string city = 3; - */ - boolean hasCity(); - - /** - * required string city = 3; - */ - java.lang.String getCity(); - - /** - * required string city = 3; - */ - com.google.protobuf.ByteString getCityBytes(); - } - - /** - * Protobuf type {@code ProtocolBuffers.SampleProtoB} - */ - public static final class SampleProtoB extends - com.google.protobuf.GeneratedMessage implements - // @@protoc_insertion_point(message_implements:ProtocolBuffers.SampleProtoB) - SampleProtoBOrBuilder { - // Use SampleProtoB.newBuilder() to construct. - private SampleProtoB(com.google.protobuf.GeneratedMessage.Builder builder) { - super(builder); - this.unknownFields = builder.getUnknownFields(); - } - - private SampleProtoB(boolean noInit) { - this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); - } - - private static final SampleProtoB defaultInstance; - - public static SampleProtoB getDefaultInstance() { - return defaultInstance; - } - - public SampleProtoB getDefaultInstanceForType() { - return defaultInstance; - } - - private final com.google.protobuf.UnknownFieldSet unknownFields; - - @java.lang.Override - public final com.google.protobuf.UnknownFieldSet getUnknownFields() { - return this.unknownFields; - } - - private SampleProtoB( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - initFields(); - int mutable_bitField0_ = 0; - com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder(); - try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch (tag) { - case 0: - done = true; - break; - default: { - if (!parseUnknownField(input, unknownFields, - extensionRegistry, tag)) { - done = true; - } - break; - } - case 8: { - bitField0_ |= 0x00000001; - identifier_ = input.readUInt32(); - break; - } - case 18: { - com.google.protobuf.ByteString bs = input.readBytes(); - bitField0_ |= 0x00000002; - state_ = bs; - break; - } - case 26: { - com.google.protobuf.ByteString bs = input.readBytes(); - bitField0_ |= 0x00000004; - city_ = bs; - break; - } - } - } - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(this); - } catch (java.io.IOException e) { - throw new com.google.protobuf.InvalidProtocolBufferException( - e.getMessage()).setUnfinishedMessage(this); - } finally { - this.unknownFields = unknownFields.build(); - makeExtensionsImmutable(); - } - } - - public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { - return de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.internal_static_ProtocolBuffers_SampleProtoB_descriptor; - } - - protected com.google.protobuf.GeneratedMessage.FieldAccessorTable internalGetFieldAccessorTable() { - return de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.internal_static_ProtocolBuffers_SampleProtoB_fieldAccessorTable - .ensureFieldAccessorsInitialized( - de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB.class, de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB.Builder.class); - } - - public static com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() { - public SampleProtoB parsePartialFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return new SampleProtoB(input, extensionRegistry); - } - }; - - @java.lang.Override - public com.google.protobuf.Parser getParserForType() { - return PARSER; - } - - private int bitField0_; - public static final int IDENTIFIER_FIELD_NUMBER = 1; - private int identifier_; - - /** - * required uint32 identifier = 1; - */ - public boolean hasIdentifier() { - return ((bitField0_ & 0x00000001) == 0x00000001); - } - - /** - * required uint32 identifier = 1; - */ - public int getIdentifier() { - return identifier_; - } - - public static final int STATE_FIELD_NUMBER = 2; - private java.lang.Object state_; - - /** - * required string state = 2; - */ - public boolean hasState() { - return ((bitField0_ & 0x00000002) == 0x00000002); - } - - /** - * required string state = 2; - */ - public java.lang.String getState() { - java.lang.Object ref = state_; - if (ref instanceof java.lang.String) { - return (java.lang.String) ref; - } else { - com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; - java.lang.String s = bs.toStringUtf8(); - if (bs.isValidUtf8()) { - state_ = s; - } - return s; - } - } - - /** - * required string state = 2; - */ - public com.google.protobuf.ByteString getStateBytes() { - java.lang.Object ref = state_; - if (ref instanceof java.lang.String) { - com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8( - (java.lang.String) ref); - state_ = b; - return b; - } else { - return (com.google.protobuf.ByteString) ref; - } - } - - public static final int CITY_FIELD_NUMBER = 3; - private java.lang.Object city_; - - /** - * required string city = 3; - */ - public boolean hasCity() { - return ((bitField0_ & 0x00000004) == 0x00000004); - } - - /** - * required string city = 3; - */ - public java.lang.String getCity() { - java.lang.Object ref = city_; - if (ref instanceof java.lang.String) { - return (java.lang.String) ref; - } else { - com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; - java.lang.String s = bs.toStringUtf8(); - if (bs.isValidUtf8()) { - city_ = s; - } - return s; - } - } - - /** - * required string city = 3; - */ - public com.google.protobuf.ByteString getCityBytes() { - java.lang.Object ref = city_; - if (ref instanceof java.lang.String) { - com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8( - (java.lang.String) ref); - city_ = b; - return b; - } else { - return (com.google.protobuf.ByteString) ref; - } - } - - private void initFields() { - identifier_ = 0; - state_ = ""; - city_ = ""; - } - - private byte memoizedIsInitialized = -1; - - public final boolean isInitialized() { - byte isInitialized = memoizedIsInitialized; - if (isInitialized == 1) - return true; - if (isInitialized == 0) - return false; - - if (!hasIdentifier()) { - memoizedIsInitialized = 0; - return false; - } - if (!hasState()) { - memoizedIsInitialized = 0; - return false; - } - if (!hasCity()) { - memoizedIsInitialized = 0; - return false; - } - memoizedIsInitialized = 1; - return true; - } - - public void writeTo(com.google.protobuf.CodedOutputStream output) - throws java.io.IOException { - getSerializedSize(); - if (((bitField0_ & 0x00000001) == 0x00000001)) { - output.writeUInt32(1, identifier_); - } - if (((bitField0_ & 0x00000002) == 0x00000002)) { - output.writeBytes(2, getStateBytes()); - } - if (((bitField0_ & 0x00000004) == 0x00000004)) { - output.writeBytes(3, getCityBytes()); - } - getUnknownFields().writeTo(output); - } - - private int memoizedSerializedSize = -1; - - public int getSerializedSize() { - int size = memoizedSerializedSize; - if (size != -1) - return size; - - size = 0; - if (((bitField0_ & 0x00000001) == 0x00000001)) { - size += com.google.protobuf.CodedOutputStream - .computeUInt32Size(1, identifier_); - } - if (((bitField0_ & 0x00000002) == 0x00000002)) { - size += com.google.protobuf.CodedOutputStream - .computeBytesSize(2, getStateBytes()); - } - if (((bitField0_ & 0x00000004) == 0x00000004)) { - size += com.google.protobuf.CodedOutputStream - .computeBytesSize(3, getCityBytes()); - } - size += getUnknownFields().getSerializedSize(); - memoizedSerializedSize = size; - return size; - } - - private static final long serialVersionUID = 0L; - - @java.lang.Override - protected java.lang.Object writeReplace() - throws java.io.ObjectStreamException { - return super.writeReplace(); - } - - public static de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB parseFrom( - com.google.protobuf.ByteString data) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data); - } - - public static de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB parseFrom( - com.google.protobuf.ByteString data, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data, extensionRegistry); - } - - public static de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB parseFrom(byte[] data) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data); - } - - public static de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB parseFrom( - byte[] data, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data, extensionRegistry); - } - - public static de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB parseFrom(java.io.InputStream input) - throws java.io.IOException { - return PARSER.parseFrom(input); - } - - public static de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB parseFrom( - java.io.InputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseFrom(input, extensionRegistry); - } - - public static de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB parseDelimitedFrom(java.io.InputStream input) - throws java.io.IOException { - return PARSER.parseDelimitedFrom(input); - } - - public static de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB parseDelimitedFrom( - java.io.InputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseDelimitedFrom(input, extensionRegistry); - } - - public static de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB parseFrom( - com.google.protobuf.CodedInputStream input) - throws java.io.IOException { - return PARSER.parseFrom(input); - } - - public static de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB parseFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseFrom(input, extensionRegistry); - } - - public static Builder newBuilder() { - return Builder.create(); - } - - public Builder newBuilderForType() { - return newBuilder(); - } - - public static Builder newBuilder(de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB prototype) { - return newBuilder().mergeFrom(prototype); - } - - public Builder toBuilder() { - return newBuilder(this); - } - - @java.lang.Override - protected Builder newBuilderForType( - com.google.protobuf.GeneratedMessage.BuilderParent parent) { - Builder builder = new Builder(parent); - return builder; - } - - /** - * Protobuf type {@code ProtocolBuffers.SampleProtoB} - */ - public static final class Builder extends - com.google.protobuf.GeneratedMessage.Builder implements - // @@protoc_insertion_point(builder_implements:ProtocolBuffers.SampleProtoB) - de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoBOrBuilder { - public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { - return de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.internal_static_ProtocolBuffers_SampleProtoB_descriptor; - } - - protected com.google.protobuf.GeneratedMessage.FieldAccessorTable internalGetFieldAccessorTable() { - return de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.internal_static_ProtocolBuffers_SampleProtoB_fieldAccessorTable - .ensureFieldAccessorsInitialized( - de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB.class, de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB.Builder.class); - } - - // Construct using de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB.newBuilder() - private Builder() { - maybeForceBuilderInitialization(); - } - - private Builder( - com.google.protobuf.GeneratedMessage.BuilderParent parent) { - super(parent); - maybeForceBuilderInitialization(); - } - - private void maybeForceBuilderInitialization() { - if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {} - } - - private static Builder create() { - return new Builder(); - } - - public Builder clear() { - super.clear(); - identifier_ = 0; - bitField0_ = (bitField0_ & ~0x00000001); - state_ = ""; - bitField0_ = (bitField0_ & ~0x00000002); - city_ = ""; - bitField0_ = (bitField0_ & ~0x00000004); - return this; - } - - public Builder clone() { - return create().mergeFrom(buildPartial()); - } - - public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { - return de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.internal_static_ProtocolBuffers_SampleProtoB_descriptor; - } - - public de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB getDefaultInstanceForType() { - return de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB.getDefaultInstance(); - } - - public de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB build() { - de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB result = buildPartial(); - if (!result.isInitialized()) { - throw newUninitializedMessageException(result); - } - return result; - } - - public de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB buildPartial() { - de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB result = new de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB(this); - int from_bitField0_ = bitField0_; - int to_bitField0_ = 0; - if (((from_bitField0_ & 0x00000001) == 0x00000001)) { - to_bitField0_ |= 0x00000001; - } - result.identifier_ = identifier_; - if (((from_bitField0_ & 0x00000002) == 0x00000002)) { - to_bitField0_ |= 0x00000002; - } - result.state_ = state_; - if (((from_bitField0_ & 0x00000004) == 0x00000004)) { - to_bitField0_ |= 0x00000004; - } - result.city_ = city_; - result.bitField0_ = to_bitField0_; - onBuilt(); - return result; - } - - public Builder mergeFrom(com.google.protobuf.Message other) { - if (other instanceof de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB) { - return mergeFrom((de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB) other); - } else { - super.mergeFrom(other); - return this; - } - } - - public Builder mergeFrom(de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB other) { - if (other == de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB.getDefaultInstance()) - return this; - if (other.hasIdentifier()) { - setIdentifier(other.getIdentifier()); - } - if (other.hasState()) { - bitField0_ |= 0x00000002; - state_ = other.state_; - onChanged(); - } - if (other.hasCity()) { - bitField0_ |= 0x00000004; - city_ = other.city_; - onChanged(); - } - this.mergeUnknownFields(other.getUnknownFields()); - return this; - } - - public final boolean isInitialized() { - if (!hasIdentifier()) { - - return false; - } - if (!hasState()) { - - return false; - } - if (!hasCity()) { - - return false; - } - return true; - } - - public Builder mergeFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB parsedMessage = null; - try { - parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - parsedMessage = (de.javakaffee.kryoserializers.protobuf.SampleProtoBOuterClass.SampleProtoB) e.getUnfinishedMessage(); - throw e; - } finally { - if (parsedMessage != null) { - mergeFrom(parsedMessage); - } - } - return this; - } - - private int bitField0_; - - private int identifier_; - - /** - * required uint32 identifier = 1; - */ - public boolean hasIdentifier() { - return ((bitField0_ & 0x00000001) == 0x00000001); - } - - /** - * required uint32 identifier = 1; - */ - public int getIdentifier() { - return identifier_; - } - - /** - * required uint32 identifier = 1; - */ - public Builder setIdentifier(int value) { - bitField0_ |= 0x00000001; - identifier_ = value; - onChanged(); - return this; - } - - /** - * required uint32 identifier = 1; - */ - public Builder clearIdentifier() { - bitField0_ = (bitField0_ & ~0x00000001); - identifier_ = 0; - onChanged(); - return this; - } - - private java.lang.Object state_ = ""; - - /** - * required string state = 2; - */ - public boolean hasState() { - return ((bitField0_ & 0x00000002) == 0x00000002); - } - - /** - * required string state = 2; - */ - public java.lang.String getState() { - java.lang.Object ref = state_; - if (!(ref instanceof java.lang.String)) { - com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; - java.lang.String s = bs.toStringUtf8(); - if (bs.isValidUtf8()) { - state_ = s; - } - return s; - } else { - return (java.lang.String) ref; - } - } - - /** - * required string state = 2; - */ - public com.google.protobuf.ByteString getStateBytes() { - java.lang.Object ref = state_; - if (ref instanceof String) { - com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8( - (java.lang.String) ref); - state_ = b; - return b; - } else { - return (com.google.protobuf.ByteString) ref; - } - } - - /** - * required string state = 2; - */ - public Builder setState( - java.lang.String value) { - if (value == null) { - throw new NullPointerException(); - } - bitField0_ |= 0x00000002; - state_ = value; - onChanged(); - return this; - } - - /** - * required string state = 2; - */ - public Builder clearState() { - bitField0_ = (bitField0_ & ~0x00000002); - state_ = getDefaultInstance().getState(); - onChanged(); - return this; - } - - /** - * required string state = 2; - */ - public Builder setStateBytes( - com.google.protobuf.ByteString value) { - if (value == null) { - throw new NullPointerException(); - } - bitField0_ |= 0x00000002; - state_ = value; - onChanged(); - return this; - } - - private java.lang.Object city_ = ""; - - /** - * required string city = 3; - */ - public boolean hasCity() { - return ((bitField0_ & 0x00000004) == 0x00000004); - } - - /** - * required string city = 3; - */ - public java.lang.String getCity() { - java.lang.Object ref = city_; - if (!(ref instanceof java.lang.String)) { - com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; - java.lang.String s = bs.toStringUtf8(); - if (bs.isValidUtf8()) { - city_ = s; - } - return s; - } else { - return (java.lang.String) ref; - } - } - - /** - * required string city = 3; - */ - public com.google.protobuf.ByteString getCityBytes() { - java.lang.Object ref = city_; - if (ref instanceof String) { - com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8( - (java.lang.String) ref); - city_ = b; - return b; - } else { - return (com.google.protobuf.ByteString) ref; - } - } - - /** - * required string city = 3; - */ - public Builder setCity( - java.lang.String value) { - if (value == null) { - throw new NullPointerException(); - } - bitField0_ |= 0x00000004; - city_ = value; - onChanged(); - return this; - } - - /** - * required string city = 3; - */ - public Builder clearCity() { - bitField0_ = (bitField0_ & ~0x00000004); - city_ = getDefaultInstance().getCity(); - onChanged(); - return this; - } - - /** - * required string city = 3; - */ - public Builder setCityBytes( - com.google.protobuf.ByteString value) { - if (value == null) { - throw new NullPointerException(); - } - bitField0_ |= 0x00000004; - city_ = value; - onChanged(); - return this; - } - - // @@protoc_insertion_point(builder_scope:ProtocolBuffers.SampleProtoB) - } - - static { - defaultInstance = new SampleProtoB(true); - defaultInstance.initFields(); - } - - // @@protoc_insertion_point(class_scope:ProtocolBuffers.SampleProtoB) - } - - private static final com.google.protobuf.Descriptors.Descriptor internal_static_ProtocolBuffers_SampleProtoB_descriptor; - private static com.google.protobuf.GeneratedMessage.FieldAccessorTable internal_static_ProtocolBuffers_SampleProtoB_fieldAccessorTable; - - public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() { - return descriptor; - } - - private static com.google.protobuf.Descriptors.FileDescriptor descriptor; - static { - java.lang.String[] descriptorData = { - "\n\022SampleProtoB.proto\022\017ProtocolBuffers\"?\n" + - "\014SampleProtoB\022\022\n\nidentifier\030\001 \002(\r\022\r\n\005sta" + - "te\030\002 \002(\t\022\014\n\004city\030\003 \002(\tB@\n&de.javakaffee." + - "kryoserializers.protobufB\026SampleProtoBOu" + - "terClass" - }; - com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { - public com.google.protobuf.ExtensionRegistry assignDescriptors( - com.google.protobuf.Descriptors.FileDescriptor root) { - descriptor = root; - return null; - } - }; - com.google.protobuf.Descriptors.FileDescriptor - .internalBuildGeneratedFileFrom(descriptorData, - new com.google.protobuf.Descriptors.FileDescriptor[]{ - }, assigner); - internal_static_ProtocolBuffers_SampleProtoB_descriptor = getDescriptor().getMessageTypes().get(0); - internal_static_ProtocolBuffers_SampleProtoB_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( - internal_static_ProtocolBuffers_SampleProtoB_descriptor, - new java.lang.String[]{"Identifier", "State", "City",}); - } - - // @@protoc_insertion_point(outer_class_scope) -} diff --git a/src/test/java/de/javakaffee/kryoserializers/wicket/MiniMapSerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/wicket/MiniMapSerializerTest.java index 18a5747c..1d4a101c 100644 --- a/src/test/java/de/javakaffee/kryoserializers/wicket/MiniMapSerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/wicket/MiniMapSerializerTest.java @@ -87,8 +87,8 @@ public void testMiniMapAddEntriesAfterDeserialization() { deserialized.put("bar", "baz"); try { deserialized.put("this should", "fail"); - Assert.fail("We told the orig MiniMap to accept 2 entries at max," + - " therefore we should not be allowed to put more."); + Assert.fail("We told the orig MiniMap to accept 2 entries at max," + + " therefore we should not be allowed to put more."); } catch (final RuntimeException e) { // this is expected - didn't use @Test.expectedExceptions // as this would tie us to the exactly thrown exception diff --git a/src/test/resources/SampleProtoA.proto b/src/test/proto/SampleProtoA.proto similarity index 65% rename from src/test/resources/SampleProtoA.proto rename to src/test/proto/SampleProtoA.proto index fbdfb538..6779ca82 100644 --- a/src/test/resources/SampleProtoA.proto +++ b/src/test/proto/SampleProtoA.proto @@ -1,4 +1,6 @@ -package ProtocolBuffers; // the namespace for the compiled classes +syntax = "proto2"; + +package de.javakaffee.kryoserializers.protobuf; // the namespace for the compiled classes option java_package = "de.javakaffee.kryoserializers.protobuf"; option java_outer_classname = "SampleProtoAOuterClass"; diff --git a/src/test/resources/SampleProtoB.proto b/src/test/proto/SampleProtoB.proto similarity index 68% rename from src/test/resources/SampleProtoB.proto rename to src/test/proto/SampleProtoB.proto index a5612ba0..537823ab 100644 --- a/src/test/resources/SampleProtoB.proto +++ b/src/test/proto/SampleProtoB.proto @@ -1,4 +1,6 @@ -package ProtocolBuffers; // the namespace for the compiled classes +syntax = "proto2"; + +package de.javakaffee.kryoserializers.protobuf; // the namespace for the compiled classes option java_package = "de.javakaffee.kryoserializers.protobuf"; option java_outer_classname = "SampleProtoBOuterClass"; From e2d20d27483ad9224a899623cbbbfc97fe7d7646 Mon Sep 17 00:00:00 2001 From: Mitchell Skaggs Date: Thu, 1 Feb 2018 20:27:47 -0600 Subject: [PATCH 09/13] Added code coverage checking and updated .travis.yml --- .travis.yml | 18 ++++++++++++------ build.gradle | 30 +++++++++++++++++++++--------- 2 files changed, 33 insertions(+), 15 deletions(-) diff --git a/.travis.yml b/.travis.yml index 9a64bf3c..74d2ffca 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,19 +1,25 @@ +sudo: false language: java jdk: - openjdk7 - oraclejdk8 -cache: - directories: - - $HOME/.m2 +script: + - ./gradlew check after_success: - - mvn cobertura:cobertura coveralls:report + - ./gradlew cobertura coveralls env: global: - secure: VowI35vSogCpbHhqkStwHdU3A9+0g3x3v4RiE6Ps6RH5Y4E0F5mD9MzrYloRGIWpbeLgw0azRVsM2nDufUIJgogWIOnxKxi4AqSo23VKcY6z/tN0kRgIfD+QuMbRmaUU6yIXaws3xjOXCHbLsBFBHeu0pGkB9e3qiMeJatj9bDo= + # Must also set COVERALLS_REPO_TOKEN env variable in Travis CI to push Coveralls reports -# use container -sudo: false +before_cache: + - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock + - rm -fr $HOME/.gradle/caches/*/plugin-resolution/ +cache: + directories: + - $HOME/.gradle/caches/ + - $HOME/.gradle/wrapper/ diff --git a/build.gradle b/build.gradle index aaa132c6..69e80f8c 100644 --- a/build.gradle +++ b/build.gradle @@ -4,16 +4,17 @@ plugins { id 'maven-publish' id 'com.diffplug.gradle.spotless' version '3.8.0' id 'com.github.ben-manes.versions' version '0.17.0' - id "com.google.protobuf" version "0.8.4" + id 'com.google.protobuf' version "0.8.4" + id 'net.saliman.cobertura' version '2.5.4' + id 'com.github.kt3k.coveralls' version '2.8.2' } -group = 'de.javakaffee' -version = '0.43-SNAPSHOT' - description = 'Extra Kryo Serializers' -sourceCompatibility = JavaVersion.VERSION_1_8 -targetCompatibility = JavaVersion.VERSION_1_8 +sourceCompatibility = JavaVersion.VERSION_1_7 +targetCompatibility = JavaVersion.VERSION_1_7 + +cobertura { coverageFormats = ['html', 'xml'] } task sourcesJar(type: Jar) { from sourceSets.main.allJava @@ -51,9 +52,16 @@ protobuf { protoc { artifact = 'com.google.protobuf:protoc:3.5.1-1' } } publishing { publications { maven(MavenPublication) { - from components.java - artifact sourcesJar - artifact javadocJar + (it as MavenPublication).with { + from components['java'] + + groupId 'de.javakaffee' + artifactId 'kryo-serializers' + version '0.43-SNAPSHOT' + + artifact sourcesJar + artifact javadocJar + } } } } @@ -121,3 +129,7 @@ spotless { } } } + +afterEvaluate { + check.dependsOn(tasks['cobertura']) +} From 0f1ce93c34fbf02a6bcf0d0b94941db293d43978 Mon Sep 17 00:00:00 2001 From: Mitchell Skaggs Date: Thu, 1 Feb 2018 20:32:23 -0600 Subject: [PATCH 10/13] Made gradlew have executable permission --- gradlew | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 gradlew diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 From 35ea068846fd3bdffbb49610bea353a274751b60 Mon Sep 17 00:00:00 2001 From: Mitchell Skaggs Date: Thu, 1 Feb 2018 20:40:56 -0600 Subject: [PATCH 11/13] Remove OpenJDK7 as Gradle 4.5 does not support it --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 74d2ffca..93b7dce4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,6 @@ sudo: false language: java jdk: - - openjdk7 - oraclejdk8 script: From 502908a50b33648f8d9ac482395b256a285d5402 Mon Sep 17 00:00:00 2001 From: Mitchell Skaggs Date: Fri, 2 Feb 2018 09:47:49 -0600 Subject: [PATCH 12/13] Added FindBugs and fixed warnings/errors --- build.gradle | 23 +- findbugs-exclude.xml | 5 + .../FieldAnnotationAwareSerializer.java | 2 +- .../SynchronizedCollectionsSerializer.java | 1 - .../UnmodifiableCollectionsSerializer.java | 1 - .../guava/ArrayListMultimapSerializer.java | 3 +- .../guava/ImmutableSortedMapSerializer.java | 57 ++-- .../guava/LinkedHashMultimapSerializer.java | 3 +- .../guava/LinkedListMultimapSerializer.java | 3 +- .../guava/TreeMultimapSerializer.java | 3 +- .../UnmodifiableNavigableSetSerializer.java | 3 +- .../jodatime/JodaLocalTimeSerializer.java | 4 +- .../javakaffee/kryoserializers/KryoTest.java | 281 +++++++++--------- .../kryoserializers/TestClasses.java | 102 +++---- .../cglib/CGLibProxySerializerTest.java | 7 +- 15 files changed, 254 insertions(+), 244 deletions(-) create mode 100644 findbugs-exclude.xml diff --git a/build.gradle b/build.gradle index 69e80f8c..e494267b 100644 --- a/build.gradle +++ b/build.gradle @@ -2,6 +2,7 @@ plugins { id 'idea' id 'java-library' id 'maven-publish' + id 'findbugs' id 'com.diffplug.gradle.spotless' version '3.8.0' id 'com.github.ben-manes.versions' version '0.17.0' id 'com.google.protobuf' version "0.8.4" @@ -9,12 +10,30 @@ plugins { id 'com.github.kt3k.coveralls' version '2.8.2' } -description = 'Extra Kryo Serializers' +description = 'Additional Kryo serializers for standard JDK types (e.g. currency, JDK proxies) and some for external libs (e.g. joda time, cglib proxies, wicket)' sourceCompatibility = JavaVersion.VERSION_1_7 targetCompatibility = JavaVersion.VERSION_1_7 -cobertura { coverageFormats = ['html', 'xml'] } +cobertura { + coverageFormats = [ + 'html', + 'xml' + ] +} + +tasks.withType(FindBugs) { + reports { + xml.enabled false + html.enabled true + } +} + +findbugs { + effort = "max" + reportLevel = "high" + excludeFilter = file("findbugs-exclude.xml") +} task sourcesJar(type: Jar) { from sourceSets.main.allJava diff --git a/findbugs-exclude.xml b/findbugs-exclude.xml new file mode 100644 index 00000000..2b06f2bb --- /dev/null +++ b/findbugs-exclude.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/src/main/java/de/javakaffee/kryoserializers/FieldAnnotationAwareSerializer.java b/src/main/java/de/javakaffee/kryoserializers/FieldAnnotationAwareSerializer.java index f7bb20a1..2f5a62fa 100644 --- a/src/main/java/de/javakaffee/kryoserializers/FieldAnnotationAwareSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/FieldAnnotationAwareSerializer.java @@ -82,7 +82,7 @@ public FieldAnnotationAwareSerializer(final Kryo kryo, final Class type, final Collection> marked, final boolean disregarding) { super(kryo, type); this.disregarding = disregarding; - this.marked = new HashSet>(marked); + this.marked = new HashSet<>(marked); rebuildCachedFields(); } diff --git a/src/main/java/de/javakaffee/kryoserializers/SynchronizedCollectionsSerializer.java b/src/main/java/de/javakaffee/kryoserializers/SynchronizedCollectionsSerializer.java index 518d18c5..2a19d004 100644 --- a/src/main/java/de/javakaffee/kryoserializers/SynchronizedCollectionsSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/SynchronizedCollectionsSerializer.java @@ -65,7 +65,6 @@ public class SynchronizedCollectionsSerializer extends Serializer { */ public static void registerSerializers(final Kryo kryo) { final SynchronizedCollectionsSerializer serializer = new SynchronizedCollectionsSerializer(); - SynchronizedCollection.values(); for (final SynchronizedCollection item : SynchronizedCollection.values()) { kryo.register(item.type, serializer); } diff --git a/src/main/java/de/javakaffee/kryoserializers/UnmodifiableCollectionsSerializer.java b/src/main/java/de/javakaffee/kryoserializers/UnmodifiableCollectionsSerializer.java index 8d5e16dc..dca78f26 100644 --- a/src/main/java/de/javakaffee/kryoserializers/UnmodifiableCollectionsSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/UnmodifiableCollectionsSerializer.java @@ -65,7 +65,6 @@ public class UnmodifiableCollectionsSerializer extends Serializer { */ public static void registerSerializers(final Kryo kryo) { final UnmodifiableCollectionsSerializer serializer = new UnmodifiableCollectionsSerializer(); - UnmodifiableCollection.values(); for (final UnmodifiableCollection item : UnmodifiableCollection.values()) { kryo.register(item.type, serializer); } diff --git a/src/main/java/de/javakaffee/kryoserializers/guava/ArrayListMultimapSerializer.java b/src/main/java/de/javakaffee/kryoserializers/guava/ArrayListMultimapSerializer.java index abb82b2b..89e02413 100644 --- a/src/main/java/de/javakaffee/kryoserializers/guava/ArrayListMultimapSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/guava/ArrayListMultimapSerializer.java @@ -53,7 +53,8 @@ public void write(Kryo kryo, Output output, ArrayListMultimap mu } @Override - public ArrayListMultimap read(Kryo kryo, Input input, Class> type) { + public ArrayListMultimap read(Kryo kryo, Input input, + Class> type) { final ArrayListMultimap multimap = ArrayListMultimap.create(); readMultimap(kryo, input, multimap); return multimap; diff --git a/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableSortedMapSerializer.java b/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableSortedMapSerializer.java index 6f18c92d..72601666 100644 --- a/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableSortedMapSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableSortedMapSerializer.java @@ -18,6 +18,7 @@ import java.util.EnumMap; import java.util.Map; +import java.util.Objects; import java.util.TreeMap; import com.esotericsoftware.kryo.Kryo; @@ -30,7 +31,7 @@ /** * A kryo {@link Serializer} for guava-libraries {@link ImmutableSortedMap}. */ -public class ImmutableSortedMapSerializer extends Serializer> { +public class ImmutableSortedMapSerializer extends Serializer> { private static final boolean DOES_NOT_ACCEPT_NULL = true; private static final boolean IMMUTABLE = true; @@ -52,25 +53,16 @@ public static void registerSerializers(final Kryo kryo) { kryo.register(ImmutableSortedMap.class, serializer); kryo.register(ImmutableSortedMap.of().getClass(), serializer); - final Comparable k1 = new Comparable() { - @Override - public int compareTo(Object o) { - return o == this ? 0 : -1; - } - }; - final Comparable k2 = new Comparable() { - @Override - public int compareTo(Object o) { - return o == this ? 0 : 1; - } - }; + final DummyComparable k1 = new DummyComparable(1); + final DummyComparable k2 = new DummyComparable(0); + final Object v1 = new Object(); final Object v2 = new Object(); kryo.register(ImmutableSortedMap.of(k1, v1).getClass(), serializer); kryo.register(ImmutableSortedMap.of(k1, v1, k2, v2).getClass(), serializer); - Map enumMap = new EnumMap(DummyEnum.class); + Map enumMap = new EnumMap<>(DummyEnum.class); for (DummyEnum e : DummyEnum.values()) { enumMap.put(e, v1); } @@ -79,20 +71,47 @@ public int compareTo(Object o) { } @Override - public void write(Kryo kryo, Output output, ImmutableSortedMap immutableMap) { + public void write(Kryo kryo, Output output, ImmutableSortedMap immutableMap) { kryo.writeObject(output, Maps.newTreeMap(immutableMap)); } @SuppressWarnings("unchecked") @Override - public ImmutableSortedMap read(Kryo kryo, Input input, - Class> type) { + public ImmutableSortedMap read(Kryo kryo, Input input, Class> type) { Map map = kryo.readObject(input, TreeMap.class); return ImmutableSortedMap.copyOf(map); } private enum DummyEnum { - VALUE1, - VALUE2 + VALUE_1, + VALUE_2 + } + + private static class DummyComparable implements Comparable { + private final int ordering; + + private DummyComparable(int ordering) { + this.ordering = ordering; + } + + @Override + public int compareTo(DummyComparable o) { + return Integer.compare(ordering, o.ordering); + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + DummyComparable that = (DummyComparable) o; + return ordering == that.ordering; + } + + @Override + public int hashCode() { + return Objects.hash(ordering); + } } } diff --git a/src/main/java/de/javakaffee/kryoserializers/guava/LinkedHashMultimapSerializer.java b/src/main/java/de/javakaffee/kryoserializers/guava/LinkedHashMultimapSerializer.java index 8b43b206..9bcca48b 100644 --- a/src/main/java/de/javakaffee/kryoserializers/guava/LinkedHashMultimapSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/guava/LinkedHashMultimapSerializer.java @@ -53,7 +53,8 @@ public void write(Kryo kryo, Output output, LinkedHashMultimap m } @Override - public LinkedHashMultimap read(Kryo kryo, Input input, Class> type) { + public LinkedHashMultimap read(Kryo kryo, Input input, + Class> type) { final LinkedHashMultimap multimap = LinkedHashMultimap.create(); readMultimap(kryo, input, multimap); return multimap; diff --git a/src/main/java/de/javakaffee/kryoserializers/guava/LinkedListMultimapSerializer.java b/src/main/java/de/javakaffee/kryoserializers/guava/LinkedListMultimapSerializer.java index 7a956e15..a375b68d 100644 --- a/src/main/java/de/javakaffee/kryoserializers/guava/LinkedListMultimapSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/guava/LinkedListMultimapSerializer.java @@ -53,7 +53,8 @@ public void write(Kryo kryo, Output output, LinkedListMultimap m } @Override - public LinkedListMultimap read(Kryo kryo, Input input, Class> type) { + public LinkedListMultimap read(Kryo kryo, Input input, + Class> type) { final LinkedListMultimap multimap = LinkedListMultimap.create(); readMultimap(kryo, input, multimap); return multimap; diff --git a/src/main/java/de/javakaffee/kryoserializers/guava/TreeMultimapSerializer.java b/src/main/java/de/javakaffee/kryoserializers/guava/TreeMultimapSerializer.java index 9023605a..68e3b2e4 100644 --- a/src/main/java/de/javakaffee/kryoserializers/guava/TreeMultimapSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/guava/TreeMultimapSerializer.java @@ -55,7 +55,8 @@ public void write(Kryo kryo, Output output, TreeMultimap } @Override - public TreeMultimap read(Kryo kryo, Input input, Class> type) { + public TreeMultimap read(Kryo kryo, Input input, + Class> type) { final TreeMultimap multimap = TreeMultimap.create(); readMultimap(kryo, input, multimap); return multimap; diff --git a/src/main/java/de/javakaffee/kryoserializers/guava/UnmodifiableNavigableSetSerializer.java b/src/main/java/de/javakaffee/kryoserializers/guava/UnmodifiableNavigableSetSerializer.java index 16b0542e..036b96c8 100644 --- a/src/main/java/de/javakaffee/kryoserializers/guava/UnmodifiableNavigableSetSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/guava/UnmodifiableNavigableSetSerializer.java @@ -92,6 +92,7 @@ public NavigableSet read(Kryo kryo, Input input, Class> type) @Override public NavigableSet copy(Kryo kryo, NavigableSet original) { - return Sets.unmodifiableNavigableSet((NavigableSet) kryo.copy(getDelegateFromUnmodifiableNavigableSet(original))); + return Sets.unmodifiableNavigableSet( + (NavigableSet) kryo.copy(getDelegateFromUnmodifiableNavigableSet(original))); } } diff --git a/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaLocalTimeSerializer.java b/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaLocalTimeSerializer.java index c9c1af60..2160c314 100644 --- a/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaLocalTimeSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/jodatime/JodaLocalTimeSerializer.java @@ -48,7 +48,7 @@ public class JodaLocalTimeSerializer extends Serializer { @Override public void write(Kryo kryo, Output output, LocalTime object) { final int time = object.getMillisOfDay(); - output.writeInt(time, true); + output.writeLong(time, true); //LocalTime always converts the internal DateTimeZone to UTC so there is no need to serialize it. final String chronologyId = IdentifiableChronology.getChronologyId(object.getChronology()); @@ -57,7 +57,7 @@ public void write(Kryo kryo, Output output, LocalTime object) { @Override public LocalTime read(Kryo kryo, Input input, Class type) { - final int time = input.readInt(true); + final long time = input.readLong(true); final Chronology chronology = IdentifiableChronology.readChronology(input); //LocalTime always converts the internal DateTimeZone to UTC. diff --git a/src/test/java/de/javakaffee/kryoserializers/KryoTest.java b/src/test/java/de/javakaffee/kryoserializers/KryoTest.java index 1e5b5d56..855e4d67 100644 --- a/src/test/java/de/javakaffee/kryoserializers/KryoTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/KryoTest.java @@ -43,6 +43,7 @@ import com.esotericsoftware.kryo.io.Output; import com.esotericsoftware.kryo.serializers.DefaultSerializers.BigDecimalSerializer; import com.esotericsoftware.kryo.serializers.DefaultSerializers.BigIntegerSerializer; +import com.google.common.base.Charsets; import de.javakaffee.kryoserializers.TestClasses.*; import de.javakaffee.kryoserializers.TestClasses.Person.Gender; @@ -57,7 +58,7 @@ public class KryoTest { private Kryo _kryo; public static void assertDeepEquals(final Object one, final Object another) throws Exception { - assertDeepEquals(one, another, new IdentityHashMap()); + assertDeepEquals(one, another, new IdentityHashMap<>()); } private static void assertDeepEquals(final Object one, final Object another, @@ -106,7 +107,7 @@ private static void assertDeepEquals(final Object one, final Object another, Assert.assertEquals(currency1.getDefaultFractionDigits(), currency2.getDefaultFractionDigits()); } - Class clazz = one.getClass(); + Class clazz = one.getClass(); while (clazz != null) { assertEqualDeclaredFields(clazz, one, another, alreadyChecked); clazz = clazz.getSuperclass(); @@ -114,8 +115,8 @@ private static void assertDeepEquals(final Object one, final Object another, } - private static void assertEqualDeclaredFields(final Class clazz, final Object one, - final Object another, final Map alreadyChecked) throws Exception, IllegalAccessException { + private static void assertEqualDeclaredFields(final Class clazz, final Object one, final Object another, + final Map alreadyChecked) throws Exception { for (final Field field : clazz.getDeclaredFields()) { field.setAccessible(true); if (!Modifier.isTransient(field.getModifiers())) { @@ -140,6 +141,7 @@ public static T deserialize(final Kryo kryo, final byte[] in, final Class return kryo.readObject(input, clazz); } + @SuppressWarnings("ArraysAsListWithZeroOrOneArgument") @BeforeTest protected void beforeTest() { _kryo = new KryoReflectionFactorySupport() { @@ -185,49 +187,49 @@ public Serializer getDefaultSerializer(final Class type) { SynchronizedCollectionsSerializer.registerSerializers(_kryo); } - @Test(enabled = true) + @Test() public void testSingletonList() throws Exception { final List obj = Collections.singletonList("foo"); final List deserialized = deserialize(serialize(obj), obj.getClass()); assertDeepEquals(deserialized, obj); } - @Test(enabled = true) + @Test() public void testCopySingletonList() throws Exception { final List obj = Collections.singletonList("foo"); final List copy = _kryo.copy(obj); assertDeepEquals(copy, obj); } - @Test(enabled = true) + @Test() public void testSingletonSet() throws Exception { final Set obj = Collections.singleton("foo"); final Set deserialized = deserialize(serialize(obj), obj.getClass()); assertDeepEquals(deserialized, obj); } - @Test(enabled = true) + @Test() public void testCopySingletonSet() throws Exception { final Set obj = Collections.singleton("foo"); final Set copy = _kryo.copy(obj); assertDeepEquals(copy, obj); } - @Test(enabled = true) + @Test() public void testSingletonMap() throws Exception { final Map obj = Collections.singletonMap("foo", "bar"); final Map deserialized = deserialize(serialize(obj), obj.getClass()); assertDeepEquals(deserialized, obj); } - @Test(enabled = true) + @Test() public void testCopySingletonMap() throws Exception { final Map obj = Collections.singletonMap("foo", "bar"); final Map copy = _kryo.copy(obj); assertDeepEquals(copy, obj); } - @Test(enabled = true) + @Test() public void testEnumSet() throws Exception { final EnumSet set = EnumSet.allOf(Gender.class); final EnumSet deserialized = deserialize(serialize(set), set.getClass()); @@ -241,9 +243,9 @@ public void testCopyEnumSet() throws Exception { assertDeepEquals(copy, set); } - @Test(enabled = true) + @Test() public void testEnumMap() throws Exception { - final EnumMap map = new EnumMap(Gender.class); + final EnumMap map = new EnumMap<>(Gender.class); final String value = "foo"; map.put(Gender.FEMALE, value); // Another entry with the same value - to check reference handling @@ -255,7 +257,7 @@ public void testEnumMap() throws Exception { @Test public void testCopyEnumMap() throws Exception { - final EnumMap map = new EnumMap(Gender.class); + final EnumMap map = new EnumMap<>(Gender.class); final String value = "foo"; map.put(Gender.FEMALE, value); final EnumMap copy = _kryo.copy(map); @@ -265,12 +267,10 @@ public void testCopyEnumMap() throws Exception { /** * Test that linked hash map is serialized correctly with the {@link CopyForIterateMapSerializer}: * test that insertion order is retained. - * - * @throws Exception */ - @Test(enabled = true) + @Test() public void testCopyForIterateMapSerializer() throws Exception { - final Map map = new LinkedHashMap(); + final Map map = new LinkedHashMap<>(); // use doubles as e.g. integers hash to the value... for (int i = 0; i < 10; i++) { map.put(Double.valueOf(String.valueOf(i) + "." + Math.abs(i)), "value: " + i); @@ -280,9 +280,9 @@ public void testCopyForIterateMapSerializer() throws Exception { assertDeepEquals(deserialized, map); } - @Test(enabled = true) + @Test() public void testGregorianCalendar() throws Exception { - final Holder cal = new Holder(Calendar.getInstance(Locale.ENGLISH)); + final Holder cal = new Holder<>(Calendar.getInstance(Locale.ENGLISH)); @SuppressWarnings("unchecked") final Holder deserialized = deserialize(serialize(cal), Holder.class); assertDeepEquals(deserialized, cal); @@ -294,9 +294,9 @@ public void testGregorianCalendar() throws Exception { assertEquals(deserialized.item.isLenient(), cal.item.isLenient()); } - @Test(enabled = true) + @Test() public void testCopyGregorianCalendar() throws Exception { - final Holder cal = new Holder(Calendar.getInstance(Locale.ENGLISH)); + final Holder cal = new Holder<>(Calendar.getInstance(Locale.ENGLISH)); final Holder copy = _kryo.copy(cal); assertDeepEquals(copy, cal); @@ -307,86 +307,86 @@ public void testCopyGregorianCalendar() throws Exception { assertEquals(copy.item.isLenient(), cal.item.isLenient()); } - @Test(enabled = true) + @Test() public void testJavaUtilDate() throws Exception { - final Holder cal = new Holder(new Date(System.currentTimeMillis())); + final Holder cal = new Holder<>(new Date(System.currentTimeMillis())); @SuppressWarnings("unchecked") final Holder deserialized = deserialize(serialize(cal), Holder.class); assertDeepEquals(deserialized, cal); assertEquals(deserialized.item.getTime(), cal.item.getTime()); } - @Test(enabled = true) + @Test() public void testCopyJavaUtilDate() throws Exception { - final Holder cal = new Holder(new Date(System.currentTimeMillis())); + final Holder cal = new Holder<>(new Date(System.currentTimeMillis())); final Holder copy = _kryo.copy(cal); assertDeepEquals(copy, cal); assertEquals(copy.item.getTime(), cal.item.getTime()); } - @Test(enabled = true) + @Test() public void testJavaSqlTimestamp() throws Exception { - final Holder cal = new Holder(new Timestamp(System.currentTimeMillis())); + final Holder cal = new Holder<>(new Timestamp(System.currentTimeMillis())); @SuppressWarnings("unchecked") final Holder deserialized = deserialize(serialize(cal), Holder.class); assertDeepEquals(deserialized, cal); assertEquals(deserialized.item.getTime(), cal.item.getTime()); } - @Test(enabled = true) + @Test() public void testCopyJavaSqlTimestamp() throws Exception { - final Holder cal = new Holder(new Timestamp(System.currentTimeMillis())); + final Holder cal = new Holder<>(new Timestamp(System.currentTimeMillis())); final Holder copy = _kryo.copy(cal); assertDeepEquals(copy, cal); assertEquals(copy.item.getTime(), cal.item.getTime()); } - @Test(enabled = true) + @Test() public void testJavaSqlDate() throws Exception { - final Holder date = new Holder(new java.sql.Date(System.currentTimeMillis())); + final Holder date = new Holder<>(new java.sql.Date(System.currentTimeMillis())); @SuppressWarnings("unchecked") final Holder deserialized = deserialize(serialize(date), Holder.class); assertDeepEquals(deserialized, date); assertEquals(deserialized.item.getTime(), date.item.getTime()); } - @Test(enabled = true) + @Test() public void testCopyJavaSqlDate() throws Exception { - final Holder date = new Holder(new java.sql.Date(System.currentTimeMillis())); + final Holder date = new Holder<>(new java.sql.Date(System.currentTimeMillis())); final Holder copy = _kryo.copy(date); assertDeepEquals(copy, date); assertEquals(copy.item.getTime(), date.item.getTime()); } - @Test(enabled = true) + @Test() public void testJavaSqlTime() throws Exception { - final Holder time = new Holder(new java.sql.Time(System.currentTimeMillis())); + final Holder time = new Holder<>(new java.sql.Time(System.currentTimeMillis())); @SuppressWarnings("unchecked") final Holder deserialized = deserialize(serialize(time), Holder.class); assertDeepEquals(deserialized, time); assertEquals(deserialized.item.getTime(), time.item.getTime()); } - @Test(enabled = true) + @Test() public void testCopyJavaSqlTime() throws Exception { - final Holder time = new Holder(new java.sql.Time(System.currentTimeMillis())); + final Holder time = new Holder<>(new java.sql.Time(System.currentTimeMillis())); final Holder copy = _kryo.copy(time); assertDeepEquals(copy, time); assertEquals(copy.item.getTime(), time.item.getTime()); } - @Test(enabled = true) + @Test() public void testBitSet() throws Exception { final BitSet bitSet = new BitSet(10); bitSet.flip(2); bitSet.flip(4); - final Holder holder = new Holder(bitSet); + final Holder holder = new Holder<>(bitSet); @SuppressWarnings("unchecked") final Holder deserialized = deserialize(serialize(holder), Holder.class); assertDeepEquals(deserialized, holder); } - @Test(enabled = true) + @Test() public void testCopyBitSet() throws Exception { final BitSet bitSet = new BitSet(10); bitSet.flip(2); @@ -395,63 +395,63 @@ public void testCopyBitSet() throws Exception { assertDeepEquals(copy, bitSet); } - @Test(enabled = true) + @Test() public void testURI() throws Exception { - final Holder uri = new Holder(new URI("http://www.google.com")); + final Holder uri = new Holder<>(new URI("http://www.google.com")); @SuppressWarnings("unchecked") final Holder deserialized = deserialize(serialize(uri), Holder.class); assertDeepEquals(deserialized, uri); } - @Test(enabled = true) + @Test() public void testCopyURI() throws Exception { - final Holder uri = new Holder(new URI("http://www.google.com")); + final Holder uri = new Holder<>(new URI("http://www.google.com")); final Holder copy = _kryo.copy(uri); assertDeepEquals(copy, uri); } - @Test(enabled = true) + @Test() public void testUUID() throws Exception { - final Holder uuid = new Holder(UUID.randomUUID()); + final Holder uuid = new Holder<>(UUID.randomUUID()); @SuppressWarnings("unchecked") final Holder deserialized = deserialize(serialize(uuid), Holder.class); assertDeepEquals(deserialized, uuid); } - @Test(enabled = true) + @Test() public void testCopyUUID() throws Exception { - final Holder uuid = new Holder(UUID.randomUUID()); + final Holder uuid = new Holder<>(UUID.randomUUID()); final Holder copy = _kryo.copy(uuid); assertDeepEquals(copy, uuid); } - @Test(enabled = true) + @Test() public void testRegex() throws Exception { - final Holder pattern = new Holder(Pattern.compile("regex")); + final Holder pattern = new Holder<>(Pattern.compile("regex")); @SuppressWarnings("unchecked") final Holder deserialized = deserialize(serialize(pattern), Holder.class); assertDeepEquals(deserialized, pattern); final Holder patternWithFlags = - new Holder(Pattern.compile("\n", Pattern.MULTILINE | Pattern.CASE_INSENSITIVE)); + new Holder<>(Pattern.compile("\n", Pattern.MULTILINE | Pattern.CASE_INSENSITIVE)); @SuppressWarnings("unchecked") final Holder deserializedWithFlags = deserialize(serialize(patternWithFlags), Holder.class); assertDeepEquals(deserializedWithFlags, patternWithFlags); } - @Test(enabled = true) + @Test() public void testCopyRegex() throws Exception { - final Holder pattern = new Holder(Pattern.compile("regex")); + final Holder pattern = new Holder<>(Pattern.compile("regex")); final Holder copy = _kryo.copy(pattern); assertDeepEquals(copy, pattern); final Holder patternWithFlags = - new Holder(Pattern.compile("\n", Pattern.MULTILINE | Pattern.CASE_INSENSITIVE)); + new Holder<>(Pattern.compile("\n", Pattern.MULTILINE | Pattern.CASE_INSENSITIVE)); final Holder copyWithFlags = _kryo.copy(patternWithFlags); assertDeepEquals(copyWithFlags, patternWithFlags); } - @Test(enabled = true) + @Test() public void testStringBuffer() throws Exception { final StringBuffer stringBuffer = new StringBuffer("with some content \n& some lines..."); @@ -459,7 +459,7 @@ public void testStringBuffer() throws Exception { assertDeepEquals(deserialized, stringBuffer); } - @Test(enabled = true) + @Test() public void testStringBuilder() throws Exception { final StringBuilder stringBuilder = new StringBuilder("with some content \n& some lines..."); @@ -467,7 +467,7 @@ public void testStringBuilder() throws Exception { assertDeepEquals(deserialized, stringBuilder); } - @Test(enabled = true) + @Test() public void testMapWithIntConstructorOnly() throws Exception { final HashMapWithIntConstructorOnly map = new HashMapWithIntConstructorOnly(5); final HashMapWithIntConstructorOnly deserialized = @@ -476,7 +476,7 @@ public void testMapWithIntConstructorOnly() throws Exception { } - @Test(enabled = true) + @Test() public void testCurrency() throws Exception { final Currency currency = Currency.getInstance("EUR"); final Currency deserialized = deserialize(serialize(currency), Currency.class); @@ -489,119 +489,116 @@ public void testCurrency() throws Exception { @DataProvider public Object[][] unmodifiableCollections() { - final HashMap m = new HashMap(); + final HashMap m = new HashMap<>(); m.put("foo", "bar"); - return new Object[][] { { Collections.unmodifiableList(new ArrayList(Arrays.asList("foo", "bar"))) }, - { Collections.unmodifiableSet(new HashSet(Arrays.asList("foo", "bar"))) }, + return new Object[][] { { Collections.unmodifiableList(new ArrayList<>(Arrays.asList("foo", "bar"))) }, + { Collections.unmodifiableSet(new HashSet<>(Arrays.asList("foo", "bar"))) }, { Collections.unmodifiableMap(m) }, }; } @SuppressWarnings("unchecked") - @Test(enabled = true, dataProvider = "unmodifiableCollections") + @Test(dataProvider = "unmodifiableCollections") public void testUnmodifiableCollections(final Object collection) throws Exception { - final Holder holder = new Holder(collection); + final Holder holder = new Holder<>(collection); final Holder deserialized = deserialize(serialize(holder), Holder.class); assertDeepEquals(deserialized, holder); } - @Test(enabled = true, dataProvider = "unmodifiableCollections") + @Test(dataProvider = "unmodifiableCollections") public void testCopyUnmodifiableCollections(final Object collection) throws Exception { - final Holder unmodifiableCollection = new Holder(collection); + final Holder unmodifiableCollection = new Holder<>(collection); final Holder copy = _kryo.copy(unmodifiableCollection); assertDeepEquals(copy, unmodifiableCollection); } @DataProvider public Object[][] synchronizedCollections() { - final HashMap m = new HashMap(); + final HashMap m = new HashMap<>(); m.put("foo", "bar"); - return new Object[][] { { Collections.synchronizedList(new ArrayList(Arrays.asList("foo", "bar"))) }, - { Collections.synchronizedSet(new HashSet(Arrays.asList("foo", "bar"))) }, + return new Object[][] { { Collections.synchronizedList(new ArrayList<>(Arrays.asList("foo", "bar"))) }, + { Collections.synchronizedSet(new HashSet<>(Arrays.asList("foo", "bar"))) }, { Collections.synchronizedMap(m) }, }; } @SuppressWarnings("unchecked") - @Test(enabled = true, dataProvider = "synchronizedCollections") + @Test(dataProvider = "synchronizedCollections") public void testSynchronizedCollections(final Object collection) throws Exception { - final Holder holder = new Holder(collection); + final Holder holder = new Holder<>(collection); final Holder deserialized = deserialize(serialize(holder), Holder.class); assertDeepEquals(deserialized, holder); } - @Test(enabled = true, dataProvider = "synchronizedCollections") + @Test(dataProvider = "synchronizedCollections") public void testCopySynchronizedCollections(final Object collection) throws Exception { - final Holder synchronizedCollection = new Holder(collection); + final Holder synchronizedCollection = new Holder<>(collection); final Holder copy = _kryo.copy(synchronizedCollection); assertDeepEquals(copy, synchronizedCollection); } @SuppressWarnings("unchecked") - @Test(enabled = true) + @Test() public void testJavaUtilCollectionsEmptyList() throws Exception { - final Holder> emptyList = new Holder>(Collections.emptyList()); + final Holder> emptyList = new Holder<>(Collections.emptyList()); final Holder> deserialized = deserialize(serialize(emptyList), Holder.class); assertDeepEquals(deserialized, emptyList); } - @Test(enabled = true) + @Test() public void testCopyJavaUtilCollectionsEmptyList() throws Exception { - final Holder> emptyList = new Holder>(Collections.emptyList()); + final Holder> emptyList = new Holder<>(Collections.emptyList()); final Holder> copy = _kryo.copy(emptyList); assertDeepEquals(copy, emptyList); } @SuppressWarnings("unchecked") - @Test(enabled = true) + @Test() public void testJavaUtilCollectionsEmptySet() throws Exception { - final Holder> emptyList = new Holder>(Collections.emptySet()); + final Holder> emptyList = new Holder<>(Collections.emptySet()); final Holder> deserialized = deserialize(serialize(emptyList), Holder.class); assertDeepEquals(deserialized, emptyList); } - @Test(enabled = true) + @Test() public void testCopyJavaUtilCollectionsEmptySet() throws Exception { - final Holder> emptyList = new Holder>(Collections.emptySet()); + final Holder> emptyList = new Holder<>(Collections.emptySet()); final Holder> copy = _kryo.copy(emptyList); assertDeepEquals(copy, emptyList); } @SuppressWarnings("unchecked") - @Test(enabled = true) + @Test() public void testJavaUtilCollectionsEmptyMap() throws Exception { - final Holder> emptyMap = - new Holder>(Collections.emptyMap()); + final Holder> emptyMap = new Holder<>(Collections.emptyMap()); final Holder> deserialized = deserialize(serialize(emptyMap), Holder.class); assertDeepEquals(deserialized, emptyMap); } - @Test(enabled = true) + @Test() public void testCopyJavaUtilCollectionsEmptyMap() throws Exception { - final Holder> emptyMap = - new Holder>(Collections.emptyMap()); + final Holder> emptyMap = new Holder<>(Collections.emptyMap()); final Holder> copy = _kryo.copy(emptyMap); assertDeepEquals(copy, emptyMap); } - @SuppressWarnings("unchecked") - @Test(enabled = true) + @SuppressWarnings({ "unchecked", "ArraysAsListWithZeroOrOneArgument" }) + @Test() public void testJavaUtilArraysAsListEmpty() throws Exception { - final Holder> asListHolder = new Holder>(Arrays.asList()); + final Holder> asListHolder = new Holder<>(Arrays.asList()); final Holder> deserialized = deserialize(serialize(asListHolder), Holder.class); assertDeepEquals(deserialized, asListHolder); } @SuppressWarnings("unchecked") - @Test(enabled = true) + @Test() public void testJavaUtilArraysAsListPrimitiveArrayElement() throws Exception { final int[] values = { 1, 2 }; - @SuppressWarnings("rawtypes") - final Holder> asListHolder = new Holder(Arrays.asList(values)); - final Holder> deserialized = deserialize(serialize(asListHolder), Holder.class); + final Holder> asListHolder = new Holder(Arrays.asList(new Object[] { values })); + final Holder> deserialized = deserialize(serialize(asListHolder), Holder.class); assertDeepEquals(deserialized, asListHolder); } @SuppressWarnings("unchecked") - @Test(enabled = true) + @Test() public void testJavaUtilArraysAsListBoxedPrimitives() throws Exception { final Integer[] values = { 1, 2 }; final List list = Arrays.asList(values); @@ -612,45 +609,44 @@ public void testJavaUtilArraysAsListBoxedPrimitives() throws Exception { } @SuppressWarnings("unchecked") - @Test(enabled = true) + @Test() public void testJavaUtilArraysAsListString() throws Exception { - final Holder> asListHolder = new Holder>(Arrays.asList("foo", "bar")); + final Holder> asListHolder = new Holder<>(Arrays.asList("foo", "bar")); final Holder> deserialized = deserialize(serialize(asListHolder), Holder.class); assertDeepEquals(deserialized, asListHolder); } - @SuppressWarnings("unchecked") - @Test(enabled = true) + @SuppressWarnings({ "unchecked", "ArraysAsListWithZeroOrOneArgument" }) + @Test() public void testJavaUtilArraysAsListEmail() throws Exception { - final Holder> asListHolder = - new Holder>(Arrays.asList(new Email("foo", "foo@example.org"))); + final Holder> asListHolder = new Holder<>(Arrays.asList(new Email("foo", "foo@example.org"))); final Holder> deserialized = deserialize(serialize(asListHolder), Holder.class); assertDeepEquals(deserialized, asListHolder); } - @Test(enabled = true) + @Test() public void testCopyJavaUtilArraysAsList() throws Exception { - final List list = Arrays.asList("foo", "bar"); + final List list = Arrays.asList("foo", "bar"); final List copy = _kryo.copy(list); assertDeepEquals(copy, list); } - @Test(enabled = true) + @Test() public void testJdkProxy() throws Exception { - final Holder bean = new Holder(TestClasses.createProxy()); + final Holder bean = new Holder<>(TestClasses.createProxy()); @SuppressWarnings("unchecked") final Holder deserialized = deserialize(serialize(bean), Holder.class); assertDeepEquals(deserialized, bean); } - @Test(enabled = true) + @Test() public void testCopyJdkProxy() throws Exception { - final Holder bean = new Holder(TestClasses.createProxy()); + final Holder bean = new Holder<>(TestClasses.createProxy()); final Holder copy = _kryo.copy(bean); assertDeepEquals(copy, bean); } - @Test(enabled = true) + @Test() public void testClassSerializer() throws Exception { final Holder> clazz = new Holder>(String.class); @SuppressWarnings("unchecked") @@ -658,7 +654,7 @@ public void testClassSerializer() throws Exception { assertDeepEquals(deserialized, clazz); } - @Test(enabled = true) + @Test() public void testInnerClass() throws Exception { // seems to be related to #15 final Container container = TestClasses.createContainer(); @@ -666,8 +662,8 @@ public void testInnerClass() throws Exception { assertDeepEquals(deserialized, container); } - @Test(enabled = true) - public void testSharedObjectIdentity_CounterHolder() throws Exception { + @Test() + public void testSharedObjectIdentity_CounterHolder() throws Exception { final AtomicInteger sharedObject = new AtomicInteger(42); final CounterHolder holder1 = new CounterHolder(sharedObject); @@ -676,7 +672,7 @@ public void testSharedObjectIdentity_CounterHolder() throws Exception { final CounterHolderArray deserialized = deserialize(serialize(holderHolder), CounterHolderArray.class); assertDeepEquals(deserialized, holderHolder); - Assert.assertTrue(deserialized.holders[0].item == deserialized.holders[1].item); + Assert.assertTrue(deserialized.holders[0].item.equals(deserialized.holders[1].item)); } @@ -687,11 +683,11 @@ protected Object[][] createSharedObjectIdentityProviderData() { } @SuppressWarnings("unchecked") - @Test(enabled = true, dataProvider = "sharedObjectIdentityProvider") + @Test(dataProvider = "sharedObjectIdentityProvider") public void testSharedObjectIdentityWithArray(final String name, final T sharedObject) throws Exception { - final Holder holder1 = new Holder(sharedObject); - final Holder holder2 = new Holder(sharedObject); - final HolderArray holderHolder = new HolderArray(holder1, holder2); + final Holder holder1 = new Holder<>(sharedObject); + final Holder holder2 = new Holder<>(sharedObject); + final HolderArray holderHolder = new HolderArray<>(holder1, holder2); final HolderArray deserialized = deserialize(serialize(holderHolder), HolderArray.class); assertDeepEquals(deserialized, holderHolder); @@ -699,52 +695,49 @@ public void testSharedObjectIdentityWithArray(final String name, final T sha } @SuppressWarnings("unchecked") - @Test(enabled = true, dataProvider = "sharedObjectIdentityProvider") + @Test(dataProvider = "sharedObjectIdentityProvider") public void testSharedObjectIdentity(final String name, final T sharedObject) throws Exception { - final Holder holder1 = new Holder(sharedObject); - final Holder holder2 = new Holder(sharedObject); - final HolderList holderHolder = new HolderList(new ArrayList>(Arrays.asList(holder1, holder2))); + final Holder holder1 = new Holder<>(sharedObject); + final Holder holder2 = new Holder<>(sharedObject); + final HolderList holderHolder = new HolderList<>(new ArrayList<>(Arrays.asList(holder1, holder2))); final HolderList deserialized = deserialize(serialize(holderHolder), HolderList.class); assertDeepEquals(deserialized, holderHolder); Assert.assertTrue(deserialized.holders.get(0).item == deserialized.holders.get(1).item); } + @SuppressWarnings("ArraysAsListWithZeroOrOneArgument") @DataProvider(name = "typesAsSessionAttributesProvider") protected Object[][] createTypesAsSessionAttributesData() { - return new Object[][] { { Boolean.class, Boolean.TRUE }, { String.class, "42" }, - { StringBuilder.class, new StringBuilder("42") }, { StringBuffer.class, new StringBuffer("42") }, - { Class.class, String.class }, { Long.class, new Long(42) }, { Integer.class, new Integer(42) }, - { Character.class, new Character('c') }, { Byte.class, new Byte("b".getBytes()[0]) }, - { Double.class, new Double(42d) }, { Float.class, new Float(42f) }, - { Short.class, new Short((short) 42) }, { BigDecimal.class, new BigDecimal(42) }, - { AtomicInteger.class, new AtomicInteger(42) }, { AtomicLong.class, new AtomicLong(42) }, + return new Object[][] { { Boolean.class, Boolean.TRUE }, { String.class, "42" }, { StringBuilder.class, new StringBuilder("42") }, { StringBuffer.class, new StringBuffer("42") }, + { Class.class, String.class }, { Long.class, 42L }, { Integer.class, 42 }, { Character.class, 'c' }, + { Byte.class, "b".getBytes(Charsets.UTF_8)[0] }, { Double.class, 42d }, { Float.class, 42f }, + { Short.class, (short) 42 }, { BigDecimal.class, new BigDecimal(42) }, { AtomicInteger.class, new AtomicInteger(42) }, { AtomicLong.class, new AtomicLong(42) }, { MutableInt.class, new MutableInt(42) }, { Integer[].class, new Integer[] { 42 } }, - { Date.class, new Date(System.currentTimeMillis() - 10000) }, - { Calendar.class, Calendar.getInstance() }, { Currency.class, Currency.getInstance("EUR") }, - { ArrayList.class, new ArrayList(Arrays.asList("foo")) }, { int[].class, new int[] { 1, 2 } }, + { Date.class, new Date(System.currentTimeMillis() - 10000) }, { Calendar.class, Calendar.getInstance() }, { Currency.class, Currency.getInstance("EUR") }, + { ArrayList.class, new ArrayList<>(Arrays.asList("foo")) }, { int[].class, new int[] { 1, 2 } }, { long[].class, new long[] { 1, 2 } }, { short[].class, new short[] { 1, 2 } }, { float[].class, new float[] { 1, 2 } }, { double[].class, new double[] { 1, 2 } }, - { int[].class, new int[] { 1, 2 } }, { byte[].class, "42".getBytes() }, + { int[].class, new int[] { 1, 2 } }, { byte[].class, "42".getBytes(Charsets.UTF_8) }, { char[].class, "42".toCharArray() }, { String[].class, new String[] { "23", "42" } }, { Person[].class, new Person[] { createPerson("foo bar", Gender.MALE, 42) } } }; } - @Test(enabled = true, dataProvider = "typesAsSessionAttributesProvider") + @Test(dataProvider = "typesAsSessionAttributesProvider") public void testTypesAsSessionAttributes(final Class type, final T instance) throws Exception { @SuppressWarnings("unchecked") final T deserialized = (T) deserialize(serialize(instance), instance.getClass()); assertDeepEquals(deserialized, instance); } - @Test(enabled = true) + @Test() public void testTypesInContainerClass() throws Exception { final MyContainer myContainer = new MyContainer(); final MyContainer deserialized = deserialize(serialize(myContainer), MyContainer.class); assertDeepEquals(deserialized, myContainer); } - @Test(enabled = true) + @Test() public void testClassWithoutDefaultConstructor() throws Exception { final ClassWithoutDefaultConstructor obj = TestClasses.createClassWithoutDefaultConstructor("foo"); final ClassWithoutDefaultConstructor deserialized = @@ -752,21 +745,21 @@ public void testClassWithoutDefaultConstructor() throws Exception { assertDeepEquals(deserialized, obj); } - @Test(enabled = true) + @Test() public void testPrivateClass() throws Exception { final Holder holder = new Holder(TestClasses.createPrivateClass("foo")); final Holder deserialized = deserialize(serialize(holder), Holder.class); assertDeepEquals(deserialized, holder); } - @Test(enabled = true) + @Test() public void testCollections() throws Exception { final EntityWithCollections obj = new EntityWithCollections(); final EntityWithCollections deserialized = deserialize(serialize(obj), EntityWithCollections.class); assertDeepEquals(deserialized, obj); } - @Test(enabled = true) + @Test() public void testCyclicDependencies() throws Exception { final Person p1 = createPerson("foo bar", Gender.MALE, 42, "foo.bar@example.org", "foo.bar@example.com"); final Person p2 = createPerson("bar baz", Gender.FEMALE, 42, "bar.baz@example.org", "bar.baz@example.com"); @@ -792,8 +785,8 @@ public static class EntityWithCollections { public EntityWithCollections() { _bars = new String[] { "foo", "bar" }; - _foos = new ArrayList(Arrays.asList("foo", "bar")); - _bazens = new HashMap(); + _foos = new ArrayList<>(Arrays.asList("foo", "bar")); + _bazens = new HashMap<>(); _bazens.put("foo", 1); _bazens.put("bar", 2); } @@ -831,13 +824,9 @@ public boolean equals(final Object obj) { return false; } if (_foos == null) { - if (other._foos != null) { - return false; - } - } else if (!_foos.equals(other._foos)) { - return false; - } - return true; + return other._foos == null; + } else + return _foos.equals(other._foos); } } diff --git a/src/test/java/de/javakaffee/kryoserializers/TestClasses.java b/src/test/java/de/javakaffee/kryoserializers/TestClasses.java index 9c8407d3..96534bcd 100644 --- a/src/test/java/de/javakaffee/kryoserializers/TestClasses.java +++ b/src/test/java/de/javakaffee/kryoserializers/TestClasses.java @@ -27,13 +27,16 @@ import org.apache.commons.lang3.mutable.MutableInt; +import com.google.common.base.Charsets; + import de.javakaffee.kryoserializers.TestClasses.Person.Gender; /** - * Test for {@link JavolutionTranscoder} + * Test utilities * * @author Martin Grotzke */ +@SuppressWarnings({ "SameParameterValue", "WeakerAccess", "unused" }) public class TestClasses { static Person createPerson(final String name, final Gender gender, final String... emailAddresses) { @@ -41,7 +44,7 @@ static Person createPerson(final String name, final Gender gender, final String. person.setName(name); person.setGender(gender); if (emailAddresses != null) { - final HashMap props = new HashMap(); + final HashMap props = new HashMap<>(); for (int i = 0; i < emailAddresses.length; i++) { final String emailAddress = emailAddresses[i]; props.put("email" + i, new Email(name, emailAddress)); @@ -57,7 +60,7 @@ static Person createPerson(final String name, final Gender gender, final Integer person.setName(name); person.setGender(gender); person.setAge(age); - final HashMap props = new HashMap(); + final HashMap props = new HashMap<>(); for (int i = 0; i < emailAddresses.length; i++) { final String emailAddress = emailAddresses[i]; props.put("email" + i, new Email(name, emailAddress)); @@ -86,7 +89,7 @@ static SomeInterface createProxy() { new MyInvocationHandler(SomeInterfaceImpl.class)); } - static interface SomeInterface { + interface SomeInterface { String hello(); } @@ -135,7 +138,7 @@ class Body { public static class Person implements Serializable { private static final long serialVersionUID = 1L; - private final Collection _friends = new ArrayList(); + private final Collection _friends = new ArrayList<>(); private String _name; private Gender _gender; private Integer _age; @@ -181,11 +184,6 @@ public Collection getFriends() { return _friends; } - /** - * @param friends - * @param friends2 - * @return - */ private boolean flatEquals(final Collection c1, final Collection c2) { return c1 == c2 || c1 != null && c2 != null && c1.size() == c2.size(); } @@ -195,7 +193,7 @@ public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((_age == null) ? 0 : _age.hashCode()); - result = prime * result + ((_friends == null) ? 0 : _friends.size()); + result = prime * result + _friends.size(); result = prime * result + ((_gender == null) ? 0 : _gender.hashCode()); result = prime * result + ((_name == null) ? 0 : _name.hashCode()); result = prime * result + ((_props == null) ? 0 : _props.hashCode()); @@ -221,11 +219,7 @@ public boolean equals(final Object obj) { } else if (!_age.equals(other._age)) { return false; } - if (_friends == null) { - if (other._friends != null) { - return false; - } - } else if (!flatEquals(_friends, other._friends)) { + if (!flatEquals(_friends, other._friends)) { return false; } if (_gender == null) { @@ -243,13 +237,9 @@ public boolean equals(final Object obj) { return false; } if (_props == null) { - if (other._props != null) { - return false; - } - } else if (!_props.equals(other._props)) { - return false; - } - return true; + return other._props == null; + } else + return _props.equals(other._props); } @Override @@ -258,7 +248,7 @@ public String toString() { + _name + ", _props=" + _props + "]"; } - static enum Gender { + enum Gender { MALE, FEMALE } @@ -326,13 +316,9 @@ public boolean equals(final Object obj) { return false; } if (_name == null) { - if (other._name != null) { - return false; - } - } else if (!_name.equals(other._name)) { - return false; - } - return true; + return other._name == null; + } else + return _name.equals(other._name); } @Override @@ -373,13 +359,9 @@ public boolean equals(final Object obj) { } final PublicClass other = (PublicClass) obj; if (privateClass == null) { - if (other.privateClass != null) { - return false; - } - } else if (!privateClass.equals(other.privateClass)) { - return false; - } - return true; + return other.privateClass == null; + } else + return privateClass.equals(other.privateClass); } } @@ -407,13 +389,9 @@ public boolean equals(final Object obj) { } final PrivateClass other = (PrivateClass) obj; if (foo == null) { - if (other.foo != null) { - return false; - } - } else if (!foo.equals(other.foo)) { - return false; - } - return true; + return other.foo == null; + } else + return foo.equals(other.foo); } } @@ -445,13 +423,9 @@ public boolean equals(final Object obj) { } final ClassWithoutDefaultConstructor other = (ClassWithoutDefaultConstructor) obj; if (value == null) { - if (other.value != null) { - return false; - } - } else if (!value.equals(other.value)) { - return false; - } - return true; + return other.value == null; + } else + return value.equals(other.value); } @Override @@ -499,6 +473,7 @@ public static class MyContainer { private String[] _StringArray; private Person[] _PersonArray; + @SuppressWarnings("ArraysAsListWithZeroOrOneArgument") public MyContainer() { _int = 1; @@ -509,13 +484,13 @@ public MyContainer() { _String = "3"; _StringBuffer = new StringBuffer("foo"); _StringBuilder = new StringBuilder("foo"); - _Long = new Long(4); - _Integer = new Integer(5); - _Character = new Character('c'); - _Byte = new Byte("b".getBytes()[0]); - _Double = new Double(6d); - _Float = new Float(7f); - _Short = new Short((short) 8); + _Long = 4L; + _Integer = 5; + _Character = 'c'; + _Byte = "b".getBytes(Charsets.UTF_8)[0]; + _Double = 6d; + _Float = 7f; + _Short = (short) 8; _BigDecimal = new BigDecimal(9); _AtomicInteger = new AtomicInteger(10); _AtomicLong = new AtomicLong(11); @@ -524,11 +499,11 @@ public MyContainer() { _Date = new Date(System.currentTimeMillis() - 10000); _Calendar = Calendar.getInstance(); _Currency = Currency.getInstance("EUR"); - _ArrayList = new ArrayList(Arrays.asList("foo")); - _HashSet = new HashSet(); + _ArrayList = new ArrayList<>(Arrays.asList("foo")); + _HashSet = new HashSet<>(); _HashSet.add("14"); - _HashMap = new HashMap(); + _HashMap = new HashMap<>(); _HashMap.put("foo", 23); _HashMap.put("bar", 42); @@ -537,7 +512,7 @@ public MyContainer() { _shortArray = new short[] { 1, 2 }; _floatArray = new float[] { 1, 2 }; _doubleArray = new double[] { 1, 2 }; - _byteArray = "42".getBytes(); + _byteArray = "42".getBytes(Charsets.UTF_8); _charArray = "42".toCharArray(); _StringArray = new String[] { "23", "42" }; _PersonArray = new Person[] { createPerson("foo bar", Gender.MALE, 42) }; @@ -811,6 +786,7 @@ public CounterHolderArray(final CounterHolder... holders) { static class HolderArray { Holder[] holders; + @SafeVarargs public HolderArray(final Holder... holders) { this.holders = holders; } diff --git a/src/test/java/de/javakaffee/kryoserializers/cglib/CGLibProxySerializerTest.java b/src/test/java/de/javakaffee/kryoserializers/cglib/CGLibProxySerializerTest.java index daff26f8..0014381f 100644 --- a/src/test/java/de/javakaffee/kryoserializers/cglib/CGLibProxySerializerTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/cglib/CGLibProxySerializerTest.java @@ -38,7 +38,6 @@ import com.esotericsoftware.kryo.io.Output; import com.esotericsoftware.kryo.util.DefaultClassResolver; import com.esotericsoftware.kryo.util.MapReferenceResolver; -import com.esotericsoftware.minlog.Log; import de.javakaffee.kryoserializers.ArraysAsListSerializer; @@ -48,7 +47,7 @@ import net.sf.cglib.proxy.InvocationHandler; /** - * Test for {@link CGLibProxyFormat}. + * Test for {@link CGLibProxySerializer}. * * @author Martin Grotzke */ @@ -96,7 +95,7 @@ public Serializer getDefaultSerializer(final Class type) { @Test(enabled = false) public void testProxiesFromFileWrite() throws Exception { - Log.TRACE = true; + //Log.TRACE = true; final ClassToProxy obj = new ClassToProxy(); obj._value = "foo"; final ClassToProxy proxy1 = createProxy(obj); @@ -116,7 +115,7 @@ public void testProxiesFromFileWrite() throws Exception { @SuppressWarnings("unchecked") @Test(enabled = true) public void testProxiesFromFileRead() throws Exception { - Log.TRACE = true; + //Log.TRACE = true; final InputStream in = new FileInputStream(new File(getClass().getResource("/cglib-data-1.ser").toURI())); final Input input = new Input(in); final List proxies = (List) _kryo.readClassAndObject(input); From fe7e34fd466732df6f979e3a93647e31a3503dc0 Mon Sep 17 00:00:00 2001 From: Mitchell Skaggs Date: Fri, 2 Feb 2018 12:24:30 -0600 Subject: [PATCH 13/13] Deduplicated some SubListSerializer code --- .../kryoserializers/SubListSerializers.java | 67 +++++++------- .../SubListSerializersTest.java | 90 +++++++++---------- 2 files changed, 81 insertions(+), 76 deletions(-) diff --git a/src/main/java/de/javakaffee/kryoserializers/SubListSerializers.java b/src/main/java/de/javakaffee/kryoserializers/SubListSerializers.java index eafc0cd8..0c784a51 100644 --- a/src/main/java/de/javakaffee/kryoserializers/SubListSerializers.java +++ b/src/main/java/de/javakaffee/kryoserializers/SubListSerializers.java @@ -84,6 +84,34 @@ public static Kryo addDefaultSerializers(Kryo kryo) { return kryo; } + private static List subListRead(Kryo kryo, Input input) { + kryo.reference(FAKE_REFERENCE); + final List list = (List) kryo.readClassAndObject(input); + final int fromIndex = input.readInt(true); + final int toIndex = input.readInt(true); + return list.subList(fromIndex, toIndex); + } + + private static List subListCopy(Kryo kryo, List originalList, int parentOffset, int size) { + final int toIndex = parentOffset + size; + return kryo.copy(originalList).subList(parentOffset, toIndex); + } + + private static void subListWrite(Kryo kryo, Output output, Object originalList, int fromIndex, int size) { + try { + kryo.writeClassAndObject(output, originalList); + output.writeInt(fromIndex, true); + final int toIndex = fromIndex + size; + output.writeInt(toIndex, true); + } catch (final RuntimeException e) { + // Don't eat and wrap RuntimeExceptions because the ObjectBuffer.write... + // handles SerializationException specifically (resizing the buffer)... + throw e; + } catch (final Exception e) { + throw new RuntimeException(e); + } + } + /** * Supports sublists created via {@link ArrayList#subList(int, int)} since java7 (oracle jdk, * represented by java.util.ArrayList$SubList). @@ -128,22 +156,14 @@ public static Kryo addDefaultSerializer(Kryo kryo) { @Override public List read(final Kryo kryo, final Input input, final Class> clazz) { - kryo.reference(FAKE_REFERENCE); - final List list = (List) kryo.readClassAndObject(input); - final int fromIndex = input.readInt(true); - final int toIndex = input.readInt(true); - return list.subList(fromIndex, toIndex); + return subListRead(kryo, input); } @Override public void write(final Kryo kryo, final Output output, final List obj) { try { - kryo.writeClassAndObject(output, _parentField.get(obj)); - final int parentOffset = _parentOffsetField.getInt(obj); - final int fromIndex = parentOffset; - output.writeInt(fromIndex, true); - final int toIndex = fromIndex + _sizeField.getInt(obj); - output.writeInt(toIndex, true); + subListWrite(kryo, output, _parentField.get(obj), _parentOffsetField.getInt(obj), + _sizeField.getInt(obj)); } catch (final RuntimeException e) { // Don't eat and wrap RuntimeExceptions because the ObjectBuffer.write... // handles SerializationException specifically (resizing the buffer)... @@ -157,11 +177,8 @@ public void write(final Kryo kryo, final Output output, final List obj) { public List copy(final Kryo kryo, final List original) { kryo.reference(FAKE_REFERENCE); try { - final List list = (List) _parentField.get(original); - final int parentOffset = _parentOffsetField.getInt(original); - final int fromIndex = parentOffset; - final int toIndex = fromIndex + _sizeField.getInt(original); - return kryo.copy(list).subList(fromIndex, toIndex); + return subListCopy(kryo, (List) _parentField.get(original), _parentOffsetField.getInt(original), + _sizeField.getInt(original)); } catch (final Exception e) { throw new RuntimeException(e); } @@ -212,21 +229,13 @@ public static Kryo addDefaultSerializer(Kryo kryo) { @Override public List read(final Kryo kryo, final Input input, final Class> clazz) { - kryo.reference(FAKE_REFERENCE); - final List list = (List) kryo.readClassAndObject(input); - final int fromIndex = input.readInt(true); - final int toIndex = input.readInt(true); - return list.subList(fromIndex, toIndex); + return subListRead(kryo, input); } @Override public void write(final Kryo kryo, final Output output, final List obj) { try { - kryo.writeClassAndObject(output, _listField.get(obj)); - final int fromIndex = _offsetField.getInt(obj); - output.writeInt(fromIndex, true); - final int toIndex = fromIndex + _sizeField.getInt(obj); - output.writeInt(toIndex, true); + subListWrite(kryo, output, _listField.get(obj), _offsetField.getInt(obj), _sizeField.getInt(obj)); } catch (final RuntimeException e) { // Don't eat and wrap RuntimeExceptions because the ObjectBuffer.write... // handles SerializationException specifically (resizing the buffer)... @@ -240,10 +249,8 @@ public void write(final Kryo kryo, final Output output, final List obj) { public List copy(final Kryo kryo, final List obj) { kryo.reference(FAKE_REFERENCE); try { - final List list = (List) _listField.get(obj); - final int fromIndex = _offsetField.getInt(obj); - final int toIndex = fromIndex + _sizeField.getInt(obj); - return kryo.copy(list).subList(fromIndex, toIndex); + return subListCopy(kryo, (List) _listField.get(obj), _offsetField.getInt(obj), + _sizeField.getInt(obj)); } catch (final Exception e) { throw new RuntimeException(e); } diff --git a/src/test/java/de/javakaffee/kryoserializers/SubListSerializersTest.java b/src/test/java/de/javakaffee/kryoserializers/SubListSerializersTest.java index 93beced8..0489964a 100644 --- a/src/test/java/de/javakaffee/kryoserializers/SubListSerializersTest.java +++ b/src/test/java/de/javakaffee/kryoserializers/SubListSerializersTest.java @@ -40,8 +40,9 @@ public class SubListSerializersTest { private Kryo _kryo; + @SafeVarargs private static ArrayList arrayList(final T... items) { - return new ArrayList(Arrays.asList(items)); + return new ArrayList<>(Arrays.asList(items)); } @BeforeClass @@ -77,60 +78,56 @@ private void doTestCopy(final List subList) { assertEquals(copy.remove(0), subList.remove(0)); } - @Test(enabled = true) - public void testSubList() throws Exception { - final List subList = new LinkedList(Arrays.asList(TestEnum.values())).subList(1, 2); + @Test() + public void testSubList() { + final List subList = new LinkedList<>(Arrays.asList(TestEnum.values())).subList(1, 2); doTest(subList); } - @Test(enabled = true) - public void testCopySubList() throws Exception { - final List subList = new LinkedList(Arrays.asList(TestEnum.values())).subList(1, 2); + @Test() + public void testCopySubList() { + final List subList = new LinkedList<>(Arrays.asList(TestEnum.values())).subList(1, 2); doTestCopy(subList); } - @Test(enabled = true) - public void testSubListSubList() throws Exception { - final List subList = - new LinkedList(Arrays.asList(TestEnum.values())).subList(1, 3).subList(1, 2); + @Test() + public void testSubListSubList() { + final List subList = new LinkedList<>(Arrays.asList(TestEnum.values())).subList(1, 3).subList(1, 2); doTest(subList); } - @Test(enabled = true) - public void testCopySubListSubList() throws Exception { - final List subList = - new LinkedList(Arrays.asList(TestEnum.values())).subList(1, 3).subList(1, 2); + @Test() + public void testCopySubListSubList() { + final List subList = new LinkedList<>(Arrays.asList(TestEnum.values())).subList(1, 3).subList(1, 2); doTestCopy(subList); } - @Test(enabled = true) - public void testArrayListSubList() throws Exception { - final List subList = new ArrayList(Arrays.asList(TestEnum.values())).subList(1, 2); + @Test() + public void testArrayListSubList() { + final List subList = new ArrayList<>(Arrays.asList(TestEnum.values())).subList(1, 2); doTest(subList); } - @Test(enabled = true) - public void testCopyArrayListSubList() throws Exception { - final List subList = new ArrayList(Arrays.asList(TestEnum.values())).subList(1, 2); + @Test() + public void testCopyArrayListSubList() { + final List subList = new ArrayList<>(Arrays.asList(TestEnum.values())).subList(1, 2); doTestCopy(subList); } - @Test(enabled = true) - public void testArrayListSubListSubList() throws Exception { - final List subList = - new ArrayList(Arrays.asList(TestEnum.values())).subList(1, 3).subList(1, 2); + @Test() + public void testArrayListSubListSubList() { + final List subList = new ArrayList<>(Arrays.asList(TestEnum.values())).subList(1, 3).subList(1, 2); doTest(subList); } - @Test(enabled = true) - public void testCopyArrayListSubListSubList() throws Exception { - final List subList = - new ArrayList(Arrays.asList(TestEnum.values())).subList(1, 3).subList(1, 2); + @Test() + public void testCopyArrayListSubListSubList() { + final List subList = new ArrayList<>(Arrays.asList(TestEnum.values())).subList(1, 3).subList(1, 2); doTestCopy(subList); } - @Test(enabled = true) - public void testArrayListSubListWithSharedItems() throws Exception { + @Test() + public void testArrayListSubListWithSharedItems() { final List mylist = arrayList("1", "1", "2", "1", "1"); final List subList = mylist.subList(0, 5); @@ -142,18 +139,19 @@ public void testArrayListSubListWithSharedItems() throws Exception { assertEquals(deserialized, mylist); } - @Test(enabled = true) - @SuppressWarnings("unchecked") - public void testNestedArrayListSubListWithSharedItems_1() throws Exception { - final List l1 = arrayList("1", "1", "2"); - final List l1s1 = l1.subList(0, 3); + @Test() + @SuppressWarnings({ "unchecked", "Duplicates" }) + public void testNestedArrayListSubListWithSharedItems_1() { + final List list1 = arrayList("1", "1", "2"); + final List list1SubList1 = list1.subList(0, 3); - final List l1s2 = l1.subList(1, 3); + final List list1SubList2 = list1.subList(1, 3); - final List l2 = arrayList("1", "2", "3"); - final List l2s1 = l2.subList(0, 3); + final List list2 = arrayList("1", "2", "3"); + final List list2SubList1 = list2.subList(0, 3); - final List> lists = new ArrayList>(Arrays.asList(l1s1, l1s2, l2s1, l1, l2)); + final List> lists = + new ArrayList<>(Arrays.asList(list1SubList1, list1SubList2, list2SubList1, list1, list2)); final byte[] serialized = serialize(_kryo, lists); final List> deserialized = deserialize(_kryo, serialized, lists.getClass()); @@ -161,9 +159,9 @@ public void testNestedArrayListSubListWithSharedItems_1() throws Exception { assertEquals(deserialized, lists); } - @Test(enabled = true) - @SuppressWarnings("unchecked") - public void testNestedArrayListSubListWithSharedItems_2() throws Exception { + @Test() + @SuppressWarnings({ "unchecked", "Duplicates" }) + public void testNestedArrayListSubListWithSharedItems_2() { final List l1 = arrayList("1", "1", "2"); final List l1s1 = l1.subList(0, 3); @@ -172,7 +170,7 @@ public void testNestedArrayListSubListWithSharedItems_2() throws Exception { final List l2 = arrayList("1", "2", "3"); final List l2s1 = l2.subList(0, 3); - final List> lists = new ArrayList>(Arrays.asList(l1, l2, l1s1, l1s2, l2s1)); + final List> lists = new ArrayList<>(Arrays.asList(l1, l2, l1s1, l1s2, l2s1)); final byte[] serialized = serialize(_kryo, lists); final List> deserialized = deserialize(_kryo, serialized, lists.getClass()); @@ -180,10 +178,10 @@ public void testNestedArrayListSubListWithSharedItems_2() throws Exception { assertEquals(deserialized, lists); } - static enum TestEnum { + enum TestEnum { ITEM1, ITEM2, - ITEM3; + ITEM3 } }