Pluto doesn't support character encoding !!

Amit Jain <[email protected]> Thu, 26 Dec 2013 12:25:49 +0530
Newsgroups gmane.comp.jakarta.pluto.user
Message-ID <CA+er_5Gw+ntF8K9cvz9YWJ=m0rESRs_2r=sx8QvQRDOZT67uYQ@mail.gmail.com>
--001a11c2f3ecbabf4304ee6a77d0
Content-Type: multipart/alternative; boundary=001a11c2f3ecbabf3704ee6a77ce

--001a11c2f3ecbabf3704ee6a77ce
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

Hi Pluto Team,



*Background: *

           We are developing an application using Pluto v1.0.7 with Struts
v2.0.9 MVC.



*Problem Description: *

Adding a business name with Greek characters =E2=80=98=CE=91=CF=85=CF=84=CF=
=8C=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=CE=BC=CE=B9=CE=B1=CE=B4=CE=BF=CE=BA=CE=B9=
=CE=BC=CE=AE=E2=80=99 is
rendered as =E2=80=98=C3=8E=E2=80=98=C3=8F=E2=80=A6=C3=8F=E2=80=9E=C3=8F=C5=
=92=C3=8E=C2=B5=C3=8E=C2=AF=C3=8E=C2=BD=C3=8E=C2=B1=C3=8E=C2=B9=C3=8E=C2=BC=
=C3=8E=C2=B9=C3=8E=C2=B1=C3=8E=C2=B4=C3=8E=C2=BF=C3=8E=C2=BA=C3=8E=C2=B9=C3=
=8E=C2=BC=C3=8E=C2=AE=E2=80=99



*Root Cause:*

Our Portlet is executing in render phase and we found that it doesn=E2=80=
=99t
supports the character set encoding option. Other Portlet execution (like
=E2=80=98event phase=E2=80=99 & =E2=80=98regular servlet result=E2=80=99) d=
o support character set
encoding. Portlet those are executing in render phase uses =E2=80=98RenderR=
esponse=E2=80=99
(RenderResponseImpl) object which implicitly uses
PrintWriterServletOutputStream object which don=E2=80=99t consider characte=
r set
encoding specified with the configuration.



*Solution: *

To get the expected result we have modified =E2=80=98
*org.apache.pluto.util.PrintWriterServletOutputStream*=E2=80=99 as below,
reference<http://svn.apache.org/repos/asf/portals/applications/gems/tags/ap=
a-gems-1.0/src/main/java/org/apache/portals/gems/util/PrintWriterServletOut=
putStream.java>
:



*public void write(byte[] pBuf, int pOffset, int pLength)*

*    throws IOException {*

*    String strValue =3D null;*

*    if(characterEncoding !=3D null && !"".equals(characterEncoding)) {*

*       strValue =3D new String(pBuf, pOffset, pLength,
characterEncoding);           *

*    }*

*    if(strValue =3D=3D null) {*

*        strValue =3D new String(pBuf, pOffset, pLength);*

*    }*

*    mPrintWriter.write(strValue);*

*}*



*PS: *
Below are the list of configuration which we used to specify the character
set encoding which don=E2=80=99t help us hence we modified the
PrintWriterServletOutputStream class to support specified character sets.
See the attachment for the same suggestion.

--001a11c2f3ecbabf3704ee6a77ce
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><p class=3D"MsoNormal">Hi Pluto Team,</p>

<p class=3D"MsoNormal">=C2=A0</p>

<p class=3D""><b><u>Background: </u></b></p>

<p class=3D"MsoNormal">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0We are deve=
loping an application using Pluto v1.0.7 with
Struts v2.0.9 MVC.</p>

<p class=3D"MsoNormal">=C2=A0</p>

<p class=3D"MsoNormal"><b><i><u>Problem Description: </u></i></b></p>

<p class=3D"" style=3D"margin-left:0.5in">Adding a business name with
Greek characters =E2=80=98=CE=91=CF=85=CF=84=CF=8C=CE=B5=CE=AF=CE=BD=CE=B1=
=CE=B9=CE=BC=CE=B9=CE=B1=CE=B4=CE=BF=CE=BA=CE=B9=CE=BC=CE=AE=E2=80=99 is re=
ndered as =E2=80=98=C3=8E=E2=80=98=C3=8F=E2=80=A6=C3=8F=E2=80=9E=C3=8F=C5=
=92=C3=8E=C2=B5=C3=8E=C2=AF=C3=8E=C2=BD=C3=8E=C2=B1=C3=8E=C2=B9=C3=8E=C2=BC=
=C3=8E=C2=B9=C3=8E=C2=B1=C3=8E=C2=B4=C3=8E=C2=BF=C3=8E=C2=BA=C3=8E=C2=B9=C3=
=8E=C2=BC=C3=8E=C2=AE=E2=80=99</p>

<p class=3D"">=C2=A0</p>

<p class=3D""><b><i><u>Root Cause:</u></i></b></p>

<p class=3D"" style=3D"margin-left:0.5in">Our Portlet is executing in
render phase and we found that it doesn=E2=80=99t supports the character se=
t encoding
option. Other Portlet execution (like =E2=80=98event phase=E2=80=99 &amp; =
=E2=80=98regular servlet
result=E2=80=99) do support character set encoding. Portlet those are execu=
ting in
render phase uses =E2=80=98RenderResponse=E2=80=99 (RenderResponseImpl) obj=
ect which implicitly
uses PrintWriterServletOutputStream object which don=E2=80=99t consider cha=
racter set
encoding specified with the configuration.</p>

<p class=3D"">=C2=A0</p>

<p class=3D""><b><i><u>Solution: </u></i></b></p>

<p class=3D"" style=3D"margin-left:0.5in">To get the expected result we
have modified =E2=80=98<b><i>org.apache.pluto.util.PrintWriterServletOutput=
Stream</i></b>=E2=80=99
as below, <a href=3D"http://svn.apache.org/repos/asf/portals/applications/g=
ems/tags/apa-gems-1.0/src/main/java/org/apache/portals/gems/util/PrintWrite=
rServletOutputStream.java">reference</a>:</p>

<p class=3D"MsoNormal" style=3D"margin-left:0.5in">=C2=A0</p>

<p class=3D"MsoNormal" style=3D"margin-left:1in"><i><span style=3D"backgrou=
nd-color:silver">public void write(byte[] pBuf, int pOffset, int pLength)</=
span></i></p>

<p class=3D"MsoNormal" style=3D"margin-left:1in"><i><span style=3D"backgrou=
nd-color:silver">=C2=A0=C2=A0=C2=A0 throws IOException {</span></i></p>

<p class=3D"MsoNormal" style=3D"margin-left:1in"><i><span style=3D"backgrou=
nd-color:silver">=C2=A0=C2=A0=C2=A0 String strValue =3D null;</span></i></p=
>

<p class=3D"MsoNormal" style=3D"margin-left:1in"><i><span style=3D"backgrou=
nd-color:silver">=C2=A0=C2=A0=C2=A0 if(characterEncoding !=3D null
&amp;&amp; !&quot;&quot;.equals(</span><b><span style=3D"background-color:y=
ellow">characterEncoding</span></b><span style=3D"background-color:silver">=
)) {</span></i></p>

<p class=3D"MsoNormal" style=3D"margin-left:1in"><i><span style=3D"backgrou=
nd-color:silver">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 strValue =3D new
String(pBuf, pOffset, pLength, </span><b><span style=3D"background-color:ye=
llow">characterEncoding</span></b><span style=3D"background-color:silver">)=
;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0
</span></i></p>

<p class=3D"MsoNormal" style=3D"margin-left:1in"><i><span style=3D"backgrou=
nd-color:silver">=C2=A0=C2=A0=C2=A0=C2=A0}</span></i></p>

<p class=3D"MsoNormal" style=3D"margin-left:1in"><i><span style=3D"backgrou=
nd-color:silver">=C2=A0=C2=A0=C2=A0 if(strValue =3D=3D null) {</span></i></=
p>

<p class=3D"MsoNormal" style=3D"margin-left:1in"><i><span style=3D"backgrou=
nd-color:silver">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 strValue =3D ne=
w
String(pBuf, pOffset, pLength);</span></i></p>

<p class=3D"MsoNormal" style=3D"margin-left:1in"><i><span style=3D"backgrou=
nd-color:silver">=C2=A0=C2=A0=C2=A0 }</span></i></p>

<p class=3D"MsoNormal" style=3D"margin-left:1in"><i><span style=3D"backgrou=
nd-color:silver">=C2=A0=C2=A0=C2=A0 mPrintWriter.write(strValue);</span></i=
></p>

<p class=3D"" style=3D"margin-left:1in"><i><span style=3D"background-color:=
silver">}</span></i></p>

<p class=3D"">=C2=A0</p>

<p class=3D""><b><i><u>PS: </u></i></b></p>

<font face=3D"Calibri, sans-serif"><span style=3D"font-size:11pt">Below are=
 the list of configuration which we
used to specify the character set encoding which don=E2=80=99t help us henc=
e we
modified the PrintWriterServletOutputStream class to support specified
character sets. See the=C2=A0</span><span style=3D"font-size:15px">attachme=
nt</span><span style=3D"font-size:11pt">=C2=A0for the same suggestion.</spa=
n></font><br></div>

--001a11c2f3ecbabf3704ee6a77ce--
--001a11c2f3ecbabf4304ee6a77d0
Content-Type: application/octet-stream; name="PortletResponseImpl.java"
Content-Disposition: attachment; filename="PortletResponseImpl.java"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_hpnnq6xi0

LyoKICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVu
ZGVyIG9uZSBvciBtb3JlCiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0
aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAogKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9u
YWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCiAqIFRoZSBBU0Yg
bGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNp
b24gMi4wCiAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNl
cHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBj
b3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xp
Y2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxh
dyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIg
dGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9V
VCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9y
IGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdv
dmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2Uu
CiAqLwpwYWNrYWdlIG9yZy5hcGFjaGUucGx1dG8uaW50ZXJuYWwuaW1wbDsKCmltcG9ydCBqYXZh
LmlvLklPRXhjZXB0aW9uOwppbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKCmltcG9ydCBqYXZh
eC5wb3J0bGV0LlBvcnRsZXRSZXNwb25zZTsKaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldE91
dHB1dFN0cmVhbTsKaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7
CmltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKaW1wb3J0IGph
dmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlcjsKCmltcG9ydCBvcmcu
YXBhY2hlLnBsdXRvLlBvcnRsZXRDb250YWluZXI7CmltcG9ydCBvcmcuYXBhY2hlLnBsdXRvLlJl
cXVpcmVkQ29udGFpbmVyU2VydmljZXM7CmltcG9ydCBvcmcuYXBhY2hlLnBsdXRvLmludGVybmFs
LkludGVybmFsUG9ydGxldFJlc3BvbnNlOwppbXBvcnQgb3JnLmFwYWNoZS5wbHV0by5pbnRlcm5h
bC5JbnRlcm5hbFBvcnRsZXRXaW5kb3c7CmltcG9ydCBvcmcuYXBhY2hlLnBsdXRvLnNwaS5Qb3J0
YWxDYWxsYmFja1NlcnZpY2U7CmltcG9ydCBvcmcuYXBhY2hlLnBsdXRvLnNwaS5SZXNvdXJjZVVS
TFByb3ZpZGVyOwppbXBvcnQgb3JnLmFwYWNoZS5wbHV0by51dGlsLkFyZ3VtZW50VXRpbGl0eTsK
aW1wb3J0IG9yZy5hcGFjaGUucGx1dG8udXRpbC5QcmludFdyaXRlclNlcnZsZXRPdXRwdXRTdHJl
YW07CgovKioKICogQWJzdHJhY3QgPGNvZGU+amF2YXgucG9ydGxldC5Qb3J0bGV0UmVzcG9uc2U8
L2NvZGU+IGltcGxlbWVudGF0aW9uLgogKiBUaGlzIGNsYXNzIGFsc28gaW1wbGVtZW50cyBJbnRl
cm5hbFBvcnRsZXRSZXNwb25zZS4KICoKICovCnB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQb3J0bGV0
UmVzcG9uc2VJbXBsIGV4dGVuZHMgSHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIKaW1wbGVtZW50
cyBQb3J0bGV0UmVzcG9uc2UsIEludGVybmFsUG9ydGxldFJlc3BvbnNlIHsKCgkvLyBQcml2YXRl
IE1lbWJlciBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tCgoJLyoqIFRoZSBwb3J0bGV0IGNvbnRhaW5lci4gKi8KICAgIHByaXZhdGUgZmlu
YWwgUG9ydGxldENvbnRhaW5lciBjb250YWluZXI7CgogICAgLyoqIFRoZSBpbnRlcm5hbCBwb3J0
bGV0IHdpbmRvdy4gKi8KICAgIHByaXZhdGUgZmluYWwgSW50ZXJuYWxQb3J0bGV0V2luZG93IGlu
dGVybmFsUG9ydGxldFdpbmRvdzsKCiAgICAvKiogVGhlIHNlcnZsZXQgcmVxdWVzdCBvZiB0aGUg
dGFyZ2V0L3BvcnRsZXQncyB3ZWIgbW9kdWxlLiAqLwogICAgcHJpdmF0ZSBmaW5hbCBIdHRwU2Vy
dmxldFJlcXVlc3QgaHR0cFNlcnZsZXRSZXF1ZXN0OwoKICAgIHByaXZhdGUgYm9vbGVhbiB1c2lu
Z1dyaXRlcjsKICAgIHByaXZhdGUgYm9vbGVhbiB1c2luZ1N0cmVhbTsKCiAgICBwcml2YXRlIFNl
cnZsZXRPdXRwdXRTdHJlYW0gd3JhcHBlZFdyaXRlcjsKCgogICAgLy8gQ29uc3RydWN0b3IgLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LQoKICAgIHB1YmxpYyBQb3J0bGV0UmVzcG9uc2VJbXBsKFBvcnRsZXRDb250YWluZXIgY29udGFp
bmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJuYWxQb3J0bGV0V2luZG93
IGludGVybmFsUG9ydGxldFdpbmRvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0
dHBTZXJ2bGV0UmVxdWVzdCBzZXJ2bGV0UmVxdWVzdCwKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2Ugc2VydmxldFJlc3BvbnNlKSB7CiAgICAgICAgc3Vw
ZXIoc2VydmxldFJlc3BvbnNlKTsKICAgICAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsK
ICAgICAgICB0aGlzLmh0dHBTZXJ2bGV0UmVxdWVzdCA9IHNlcnZsZXRSZXF1ZXN0OwogICAgICAg
IHRoaXMuaW50ZXJuYWxQb3J0bGV0V2luZG93ID0gaW50ZXJuYWxQb3J0bGV0V2luZG93OwogICAg
fQoKCiAgICAvLyBQb3J0bGV0UmVzcG9uc2UgSW1wbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgcHVibGljIHZvaWQgYWRkUHJvcGVydHko
U3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewogICAgCUFyZ3VtZW50VXRpbGl0eS52YWxpZGF0
ZU5vdE51bGwoInByb3BlcnR5TmFtZSIsIG5hbWUpOwogICAgICAgIGNvbnRhaW5lci5nZXRSZXF1
aXJlZENvbnRhaW5lclNlcnZpY2VzKCkKICAgICAgICAJCS5nZXRQb3J0YWxDYWxsYmFja1NlcnZp
Y2UoKQogICAgICAgIAkJLmFkZFJlc3BvbnNlUHJvcGVydHkoCiAgICAgICAgCQkJCWdldEh0dHBT
ZXJ2bGV0UmVxdWVzdCgpLAogICAgICAgIAkJCQlpbnRlcm5hbFBvcnRsZXRXaW5kb3csCiAgICAg
ICAgCQkJCW5hbWUsIHZhbHVlKTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShT
dHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CiAgICAJQXJndW1lbnRVdGlsaXR5LnZhbGlkYXRl
Tm90TnVsbCgicHJvcGVydHlOYW1lIiwgbmFtZSk7CiAgICAgICAgY29udGFpbmVyLmdldFJlcXVp
cmVkQ29udGFpbmVyU2VydmljZXMoKQogICAgICAgICAgICAgICAgLmdldFBvcnRhbENhbGxiYWNr
U2VydmljZSgpCiAgICAgICAgICAgICAgICAuc2V0UmVzcG9uc2VQcm9wZXJ0eSgKICAgICAgICAg
ICAgICAgICAgICAgICAgZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCksCiAgICAgICAgICAgICAgICAg
ICAgICAgIGludGVybmFsUG9ydGxldFdpbmRvdywKICAgICAgICAgICAgICAgICAgICAgICAgbmFt
ZSwgdmFsdWUpOwogICAgfQoKICAgIHB1YmxpYyBTdHJpbmcgZW5jb2RlVVJMKFN0cmluZyBwYXRo
KSB7CiAgICAgICAgCiAgICAgICAgaWYgKCBwYXRoID09IG51bGwgKSB7CiAgICAgICAgICAgIHRo
cm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJBcmd1bWVudCB0byBlbmNvZGVVUkwg
bXVzdCBub3QgYmUgbnVsbC4iICk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGZpbmFsIFN0
cmluZyB3c3JwUmV3cml0ZVRva2VuID0gIndzcnBfcmV3cml0ZT8iOyAgICAgICAgCiAgICAgICAg
CiAgICAgICAgaWYgKCAocGF0aC5pbmRleE9mKCI6Ly8iKSA9PSAtMSAmJiAhcGF0aC5zdGFydHNX
aXRoKCIvIikpICYmIAogICAgICAgICAgICAgICAgIXBhdGguc3RhcnRzV2l0aCggd3NycFJld3Jp
dGVUb2tlbiApICkgewogICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0
aW9uKAogICAgICAgICAgICAgICAgIm9ubHkgYWJzb2x1dGUgVVJMcyBvciBmdWxsIHBhdGggVVJJ
cyBhcmUgYWxsb3dlZCIpOwogICAgICAgIH0KCiAgICAgICAgUmVzb3VyY2VVUkxQcm92aWRlciBw
cm92aWRlciA9IGdldENvbnRhaW5lcigpCiAgICAgICAgCQkuZ2V0UmVxdWlyZWRDb250YWluZXJT
ZXJ2aWNlcygpCiAgICAgICAgCQkuZ2V0UG9ydGFsQ2FsbGJhY2tTZXJ2aWNlKCkKICAgICAgICAJ
CS5nZXRSZXNvdXJjZVVSTFByb3ZpZGVyKAogICAgICAgIAkJCQlodHRwU2VydmxldFJlcXVlc3Qs
CiAgICAgICAgCQkJCWludGVybmFsUG9ydGxldFdpbmRvdyk7CgogICAgICAgIGlmIChpc0Fic29s
dXRlKHBhdGgpKSB7ICAgICAgICAgICAgCiAgICAgICAgICAgIHByb3ZpZGVyLnNldEFic29sdXRl
VVJMKHBhdGgpOwogICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgCiAgICAgICAgICAgIHByb3Zp
ZGVyLnNldEZ1bGxQYXRoKHBhdGgpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGdldEh0dHBT
ZXJ2bGV0UmVzcG9uc2UoKS5lbmNvZGVVUkwocHJvdmlkZXIudG9TdHJpbmcoKSk7CiAgICB9CgoK
ICAgIC8vIEludGVybmFsUG9ydGxldFJlc3BvbnNlIGltcGwgLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICBwdWJsaWMgSW50ZXJuYWxQb3J0bGV0V2luZG93
IGdldEludGVybmFsUG9ydGxldFdpbmRvdygpIHsKICAgICAgICByZXR1cm4gaW50ZXJuYWxQb3J0
bGV0V2luZG93OwogICAgfQoKCiAgICAvLyBJbnRlcm5hbCBNZXRob2RzIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgLyoqCiAgICAg
KiBSZXR1cm5zIHRoZSBwb3J0bGV0IGNvbnRhaW5lci4KICAgICAqIEByZXR1cm4gdGhlIHBvcnRs
ZXQgY29udGFpbmVyLgogICAgICovCiAgICBwcm90ZWN0ZWQgUG9ydGxldENvbnRhaW5lciBnZXRD
b250YWluZXIoKSB7CiAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjsKICAgIH0KCiAgICAvKioKICAg
ICAqIFJldHVybnMgdGhlIG5lc3RlZCBIdHRwU2VydmxldFJlcXVlc3QgaW5zdGFuY2UuCiAgICAg
KiBAcmV0dXJuIHRoZSBuZXN0ZWQgSHR0cFNlcnZsZXRSZXF1ZXN0IGluc3RhbmNlLgogICAgICov
CiAgICBwcm90ZWN0ZWQgSHR0cFNlcnZsZXRSZXF1ZXN0IGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgp
IHsKICAgICAgICByZXR1cm4gaHR0cFNlcnZsZXRSZXF1ZXN0OwogICAgfQogICAgCiAgICAvKioK
ICAgICAqIERldGVybWluZXMgaWYgdGhlIHN1cHBsaWVkIHBhdGggc2hvdWxkIGJlIHRyZWF0ZWQg
YXMgYW4KICAgICAqIGFic29sdXRlIFVSTC4gIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBj
b25zaWRlcnMgdGhlCiAgICAgKiBmb2xsb3dpbmcgY29uZGl0aW9ucyB3aGVuIGV2YWx1YXRpbmcg
dGhlIHBhdGg6CiAgICAgKiA8b2w+CiAgICAgKiAgIDxsaT5JZiB0aGUgcGF0aCBpcyBudWxsLCBy
ZXR1cm4gZmFsc2U8L2xpPgogICAgICogICA8bGk+SWYgdGhlIHBhdGggY29udGFpbnMgdGhlIHN0
cmluZyAiOi8vIiwgdGhlbiByZXR1cm4gdHJ1ZTwvbGk+CiAgICAgKiAgIDxsaT5JZiB0aGUgcGF0
aCBzdGFydHMgd2l0aCB0aGUgc3RyaW5nICJ3c3JwLXJld3JpdGU/IiB0aGVuCiAgICAgKiAgICAg
IHJldHVybiB0cnVlPC9saT4KICAgICAqICAgPGxpPklmIG5vbmUgb2YgdGhlIHByZXZpb3VzIGNv
bmRpdGlvbnMgaG9sZCB0cnVlLCByZXR1cm4gZmFsc2U8L2xpPgogICAgICogPC9vbD4KICAgICAq
IDxwLz4KICAgICAqIElmIHRoZSBwYXRoIGlzIGNvbnNpZGVyZWQgYWJzb2x1dGUsIHRoZW4gUmVz
b3VyY2VVUkwgcHJvdmlkZXJzCiAgICAgKiAoZS5nLiBSZXNvdXJjZVVSTFByb3ZpZGVyIGltcGxl
bWVudGF0aW9ucykgc2hvdWxkIHBlcmZvcm0gbGl0dGxlLCAKICAgICAqIGlmIGFueSwgbWFuaXB1
bGF0aW9uIG9mIHRoZSBwYXRoLgogICAgICogPHAvPgogICAgICogSWYgdGhlIHBhdGggaXMgbm90
IGNvbnNpZGVyZWQgYWJzb2x1dGUsIHRoZW4gdGhlIFJlc291cmNlVVJMIHByb3ZpZGVyCiAgICAg
KiBtYXkgbW9kaWZ5IGl0IHRvIGJlIGFic29sdXRlIGFjY29yZGluZyB0byB0aGUgCiAgICAgKiA8
Y29kZT5SZXNvdXJjZVVSTFByb3ZpZGVyLnRvU3RyaW5nKCk8L2NvZGU+IGNvbnRyYWN0LiAgRm9y
IGV4YW1wbGUsCiAgICAgKiB0aGV5IG1heSBwcmUtcGVuZCBhIHNjaGVtZSBhbmQgaG9zdCB0byB0
aGUgc3VwcGxpZWQgcGF0aC4KICAgICAqIAogICAgICogQHBhcmFtIHBhdGggYSBzdHJpbmcgcmVw
cmVzZW50aW5nIGEgcmVzb3VyY2UgcGF0aAogICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZXNv
dXJjZSBwYXRoIHNob3VsZCBiZSBjb25zaWRlcmVkIGFic29sdXRlCiAgICAgKi8KICAgIHByb3Rl
Y3RlZCBib29sZWFuIGlzQWJzb2x1dGUoU3RyaW5nIHBhdGgpIHsKICAgICAgICBmaW5hbCBTdHJp
bmcgd3NycFRva2VuID0gIndzcnBfcmV3cml0ZT8iOwogICAgICAgIGZpbmFsIFN0cmluZyBzY2hl
bWVUb2tlbiA9ICI6Ly8iOwogICAgICAgIAogICAgICAgIGlmICggcGF0aCA9PSBudWxsICkgewog
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmICgg
cGF0aC5pbmRleE9mKCBzY2hlbWVUb2tlbiApICE9IC0xICkgewogICAgICAgICAgICByZXR1cm4g
dHJ1ZTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKCBwYXRoLnN0YXJ0c1dpdGgoIHdz
cnBUb2tlbiApICkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAg
CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUg
bmVzdGVkIEh0dHBTZXJ2bGV0UmVzcG9uc2UgaW5zdGFuY2UuCiAgICAgKiBAcmV0dXJuIHRoZSBu
ZXN0ZWQgSHR0cFNlcnZsZXRSZXNwb25zZSBpbnN0YW5jZS4KICAgICAqLwogICAgcHVibGljIEh0
dHBTZXJ2bGV0UmVzcG9uc2UgZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpIHsKICAgICAgICByZXR1
cm4gKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIHN1cGVyLmdldFJlc3BvbnNlKCk7CiAgICB9CgoKICAg
IC8vIEh0dHBTZXJ2bGV0UmVzcG9uc2UgTWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICBwdWJsaWMgU3RyaW5nIGVuY29kZVVybChTdHJpbmcg
dXJsKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlVVJMKHVybCk7CiAgICB9CgogICAgLyoq
CiAgICAgKiBUT0RPOiBqYXZhZG9jIGFib3V0IHdoeSB3ZSBhcmUgdXNpbmcgYSB3cmFwcGVkIHdy
aXRlciBoZXJlLgogICAgICogQHNlZSBvcmcuYXBhY2hlLnBsdXRvLnV0aWwuUHJpbnRXcml0ZXJT
ZXJ2bGV0T3V0cHV0U3RyZWFtCiAgICAgKi8KICAgIHB1YmxpYyBTZXJ2bGV0T3V0cHV0U3RyZWFt
IGdldE91dHB1dFN0cmVhbSgpCiAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJT0V4
Y2VwdGlvbiB7CiAgICAgICAgaWYgKHVzaW5nV3JpdGVyKSB7CiAgICAgICAgICAgIHRocm93IG5l
dyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCiAgICAgICAgICAgIAkJImdldFBvcnRsZXRPdXRwdXRT
dHJlYW0gY2FuJ3QgYmUgdXNlZCAiCiAgICAgICAgICAgIAkJKyAiYWZ0ZXIgZ2V0V3JpdGVyIHdh
cyBpbnZva2VkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAod3JhcHBlZFdyaXRlciA9PSBudWxs
KSB7CiAgICAgICAgICAgIHdyYXBwZWRXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXJTZXJ2bGV0T3V0
cHV0U3RyZWFtKAogICAgICAgICAgICAJCWdldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKS5nZXRXcml0
ZXIoKSwgZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLmdldENoYXJhY3RlckVuY29kaW5nKCkpOwog
ICAgICAgIH0KICAgICAgICB1c2luZ1N0cmVhbSA9IHRydWU7CiAgICAgICAgcmV0dXJuIHdyYXBw
ZWRXcml0ZXI7CiAgICB9CgogICAgcHVibGljIFByaW50V3JpdGVyIGdldFdyaXRlcigpCiAgICB0
aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAgICAgICAgaWYgKHVz
aW5nU3RyZWFtKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24o
CiAgICAgICAgICAgIAkJImdldFdyaXRlciBjYW4ndCBiZSB1c2VkICIKICAgICAgICAgICAgCQkr
ICJhZnRlciBnZXRPdXRwdXRTdHJlYW0gd2FzIGludm9rZWQuIik7CiAgICAgICAgfQogICAgICAg
IHVzaW5nV3JpdGVyID0gdHJ1ZTsKICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXNwb25z
ZSgpLmdldFdyaXRlcigpOwogICAgfQoKfQo=
--001a11c2f3ecbabf4304ee6a77d0
Content-Type: application/octet-stream; 
	name="PrintWriterServletOutputStream.java"
Content-Disposition: attachment; 
	filename="PrintWriterServletOutputStream.java"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_hpnnq6yd1

LyoKICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVu
ZGVyIG9uZSBvciBtb3JlCiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0
aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAogKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9u
YWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCiAqIFRoZSBBU0Yg
bGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNp
b24gMi4wCiAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNl
cHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBj
b3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIAogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9s
aWNlbnNlcy9MSUNFTlNFLTIuMAogKiAKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUg
bGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRl
ciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRI
T1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mg
b3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2Ug
Z292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5z
ZS4KICovCnBhY2thZ2Ugb3JnLmFwYWNoZS5wbHV0by51dGlsOwoKaW1wb3J0IGphdmEuaW8uSU9F
eGNlcHRpb247CmltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwoKaW1wb3J0IGphdmF4LnNlcnZs
ZXQuU2VydmxldE91dHB1dFN0cmVhbTsKCi8qKgogKiBUaGlzIGlzIGEgc3BlY2lhbGl6ZWQgY2xh
c3MgaW1wbGVtZW50aW5nIGEgU2VydmxldE91dHB1dFN0cmVhbSB0aGF0IHdvcmtzIGluCiAqIGNv
bmp1bmN0aW9uIHdpdGggYSBQcmludFdyaXRlciB0byBzZW5kIGRhdGEgdG8gdGhlIGJyb3dzZXIu
IEl0IGlzIHVzZWQgd2hlbiBhCiAqIEoyRUUgc2VydmVyIHRocm93cyBhbiBJbGxlZ2FsU3RhdGVF
eGNlcHRpb24gd2hlbiB5b3UgY2FsbCBnZXRPdXRwdXRTdHJlYW0gb24KICogYSByZXNwb25zZSB3
aGljaCBzb21lb25lIGhhcyBwcmV2aW91c2x5IGNhbGxlZCBnZXRXcml0ZXIgb24uCiAqLwpwdWJs
aWMgY2xhc3MgUHJpbnRXcml0ZXJTZXJ2bGV0T3V0cHV0U3RyZWFtIGV4dGVuZHMgU2VydmxldE91
dHB1dFN0cmVhbSB7CgogICAgLyoqCiAgICAgKiBUaGUgUHJpbnRXcml0ZXIgdGhhdCBpcyB3cmFw
cGVkIG9uIHRvcCBvZiB0aGUgYmFzZSBpbnB1dCBzdHJlYW0KICAgICAqLwogICAgUHJpbnRXcml0
ZXIgbVByaW50V3JpdGVyOwoKICAgIC8qKgogICAgICogVGhlIGNoYXJhY3RlciBlbmNvZGluZyBv
ZiB0aGUgcmVzcG9uc2UuCiAgICAgKi8KICAgIHByaXZhdGUgU3RyaW5nIGNoYXJhY3RlckVuY29k
aW5nOwogICAgCiAgICAvKioKICAgICAqIENvbnN0cnVjdCBhIFNlcnZsZXRPdXRwdXRTdHJlYW0g
dGhhdCBjb29yZGluYXRlcyBvdXRwdXQgdXNpbmcgYSBiYXNlCiAgICAgKiBTZXJ2bGV0T3V0cHV0
U3RyZWFtIGFuZCBhIFByaW50V3JpdGVyIHRoYXQgaXMgd3JhcHBlZCBvbiB0b3Agb2YgdGhhdAog
ICAgICogT3V0cHV0U3RyZWFtLgogICAgICovCiAgICBwdWJsaWMgUHJpbnRXcml0ZXJTZXJ2bGV0
T3V0cHV0U3RyZWFtKFByaW50V3JpdGVyIHBPKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICBt
UHJpbnRXcml0ZXIgPSBwTzsKICAgIH0KCiAgICBwdWJsaWMgUHJpbnRXcml0ZXJTZXJ2bGV0T3V0
cHV0U3RyZWFtKFByaW50V3JpdGVyIHB3LCBTdHJpbmcgZW5jb2RpbmcpCiAgICB7CiAgICAgICAg
c3VwZXIoKTsKICAgICAgICBtUHJpbnRXcml0ZXIgPSBwdzsKICAgICAgICBjaGFyYWN0ZXJFbmNv
ZGluZyA9IGVuY29kaW5nOwogICAgfQogICAgCiAgICAvKioKICAgICAqIFdyaXRlcyBhbiBhcnJh
eSBvZiBieXRlcwogICAgICogQHBhcmFtIHBCdWYgdGhlIGFycmF5IHRvIGJlIHdyaXR0ZW4KICAg
ICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSS9PIGVycm9yIG9jY3VycmVkCiAgICAgKi8K
ICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBwQnVmKSB0aHJvd3MgSU9FeGNlcHRpb24gewog
ICAgICAgIGNoYXJbXSBjYnVmID0gbmV3IGNoYXJbcEJ1Zi5sZW5ndGhdOwogICAgICAgIGZvciAo
aW50IGkgPSAwOyBpIDwgY2J1Zi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBjYnVmW2ldID0g
KGNoYXIpIChwQnVmW2ldICYgMHhmZik7CiAgICAgICAgfQogICAgICAgIG1QcmludFdyaXRlci53
cml0ZShjYnVmLCAwLCBwQnVmLmxlbmd0aCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBXcml0ZXMg
YSBzaW5nbGUgYnl0ZSB0byB0aGUgb3V0cHV0IHN0cmVhbQogICAgICovCiAgICBwdWJsaWMgdm9p
ZCB3cml0ZShpbnQgcFZhbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICBtUHJpbnRXcml0
ZXIud3JpdGUocFZhbCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBXcml0ZXMgYSBzdWJhcnJheSBv
ZiBieXRlcwogICAgICogQHBhcmFtIHBCdWYgICAgdGhlIGFycmF5IHRvIGJlIHdyaXR0ZW4KICAg
ICAqIEBwYXJhbSBwT2Zmc2V0IHRoZSBvZmZzZXQgaW50byB0aGUgYXJyYXkKICAgICAqIEBwYXJh
bSBwTGVuZ3RoIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKICAgICAqIEB0aHJvd3MgSU9F
eGNlcHRpb24gaWYgYW4gSS9PIGVycm9yIG9jY3VycmVkCiAgICAgKi8KICAgIHB1YmxpYyB2b2lk
IHdyaXRlKGJ5dGVbXSBwQnVmLCBpbnQgcE9mZnNldCwgaW50IHBMZW5ndGgpCiAgICAgICAgdGhy
b3dzIElPRXhjZXB0aW9uIHsKICAgICAgICBTdHJpbmcgc3RyVmFsdWUgPSBudWxsOwogICAgICAg
IGlmKGNoYXJhY3RlckVuY29kaW5nICE9IG51bGwgJiYgISIiLmVxdWFscyhjaGFyYWN0ZXJFbmNv
ZGluZykpIHsKICAgICAgICAgICBzdHJWYWx1ZSA9IG5ldyBTdHJpbmcocEJ1ZiwgcE9mZnNldCwg
cExlbmd0aCwgY2hhcmFjdGVyRW5jb2RpbmcpOyAgICAgICAgICAgCiAgICAgICAgfQoKICAgICAg
ICBpZihzdHJWYWx1ZSA9PSBudWxsKSB7CiAgICAgICAgICAgIHN0clZhbHVlID0gbmV3IFN0cmlu
ZyhwQnVmLCBwT2Zmc2V0LCBwTGVuZ3RoKTsKICAgICAgICB9CgogICAgICAgIG1QcmludFdyaXRl
ci53cml0ZShzdHJWYWx1ZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBGbHVzaGVzIHRoZSBzdHJl
YW0sIHdyaXRpbmcgYW55IGJ1ZmZlcmVkIG91dHB1dCBieXRlcwogICAgICogQHRocm93cyBJT0V4
Y2VwdGlvbiBpZiBhbiBJL08gZXJyb3Igb2NjdXJyZWQKICAgICAqLwogICAgcHVibGljIHZvaWQg
Zmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgIG1QcmludFdyaXRlci5mbHVzaCgp
OwogICAgfQoKICAgIC8qKgogICAgICogQ2xvc2VzIHRoZSBzdHJlYW0KICAgICAqIEB0aHJvd3Mg
SU9FeGNlcHRpb24gaWYgYW4gSS9PIGVycm9yIG9jY3VycmVkCiAgICAgKi8KICAgIHB1YmxpYyB2
b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICBtUHJpbnRXcml0ZXIuY2xv
c2UoKTsKICAgIH0KCiAgICAvKioKICAgICAqIFByaW50cyBhIHN0cmluZy4KICAgICAqIEBwYXJh
bSBwVmFsIHRoZSBTdHJpbmcgdG8gYmUgcHJpbnRlZAogICAgICogQHRocm93cyBJT0V4Y2VwdGlv
biBpZiBhbiBJL08gZXJyb3IgaGFzIG9jY3VycmVkCiAgICAgKi8KICAgIHB1YmxpYyB2b2lkIHBy
aW50KFN0cmluZyBwVmFsKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgIG1QcmludFdyaXRl
ci5wcmludChwVmFsKTsKICAgIH0KCiAgICAvKioKICAgICAqIFByaW50cyBhbiBzdHJpbmcgZm9s
bG93ZWQgYnkgYSBDUkxGLgogICAgICogQHBhcmFtIHBWYWwgdGhlIFN0cmluZyB0byBiZSBwcmlu
dGVkCiAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIEkvTyBlcnJvciBoYXMgb2NjdXJy
ZWQKICAgICAqLwogICAgcHVibGljIHZvaWQgcHJpbnRsbihTdHJpbmcgcFZhbCkgdGhyb3dzIElP
RXhjZXB0aW9uIHsKICAgICAgICBtUHJpbnRXcml0ZXIucHJpbnRsbihwVmFsKTsKICAgIH0KCiAg
ICAvKioKICAgICAqIFByaW50cyBhIENSTEYKICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYg
YW4gSS9PIGVycm9yIGhhcyBvY2N1cnJlZAogICAgICovCiAgICBwdWJsaWMgdm9pZCBwcmludGxu
KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICBtUHJpbnRXcml0ZXIucHJpbnRsbigpOwog
ICAgfQoKfQo=
--001a11c2f3ecbabf4304ee6a77d0--