<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
<title>Source code</title>
<link rel="stylesheet" type="text/css" href="../../../../../../../stylesheet.css" title="Style">
</head>
<body>
<div class="sourceContainer">
<pre><span class="sourceLineNo">001</span>/*<a name="line.1"></a>
<span class="sourceLineNo">002</span> * Licensed to the Apache Software Foundation (ASF) under one or more<a name="line.2"></a>
<span class="sourceLineNo">003</span> * contributor license agreements. See the NOTICE file distributed with<a name="line.3"></a>
<span class="sourceLineNo">004</span> * this work for additional information regarding copyright ownership.<a name="line.4"></a>
<span class="sourceLineNo">005</span> * The ASF licenses this file to You under the Apache license, Version 2.0<a name="line.5"></a>
<span class="sourceLineNo">006</span> * (the "License"); you may not use this file except in compliance with<a name="line.6"></a>
<span class="sourceLineNo">007</span> * the License. You may obtain a copy of the License at<a name="line.7"></a>
<span class="sourceLineNo">008</span> *<a name="line.8"></a>
<span class="sourceLineNo">009</span> *      http://www.apache.org/licenses/LICENSE-2.0<a name="line.9"></a>
<span class="sourceLineNo">010</span> *<a name="line.10"></a>
<span class="sourceLineNo">011</span> * Unless required by applicable law or agreed to in writing, software<a name="line.11"></a>
<span class="sourceLineNo">012</span> * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.12"></a>
<span class="sourceLineNo">013</span> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.13"></a>
<span class="sourceLineNo">014</span> * See the license for the specific language governing permissions and<a name="line.14"></a>
<span class="sourceLineNo">015</span> * limitations under the license.<a name="line.15"></a>
<span class="sourceLineNo">016</span> */<a name="line.16"></a>
<span class="sourceLineNo">017</span>package org.apache.logging.log4j.core.layout;<a name="line.17"></a>
<span class="sourceLineNo">018</span><a name="line.18"></a>
<span class="sourceLineNo">019</span>import java.nio.ByteBuffer;<a name="line.19"></a>
<span class="sourceLineNo">020</span>import java.nio.CharBuffer;<a name="line.20"></a>
<span class="sourceLineNo">021</span>import java.nio.charset.CharacterCodingException;<a name="line.21"></a>
<span class="sourceLineNo">022</span>import java.nio.charset.Charset;<a name="line.22"></a>
<span class="sourceLineNo">023</span>import java.nio.charset.CharsetEncoder;<a name="line.23"></a>
<span class="sourceLineNo">024</span>import java.nio.charset.CoderResult;<a name="line.24"></a>
<span class="sourceLineNo">025</span><a name="line.25"></a>
<span class="sourceLineNo">026</span>/**<a name="line.26"></a>
<span class="sourceLineNo">027</span> * Helper class to encode text to binary data without allocating temporary objects.<a name="line.27"></a>
<span class="sourceLineNo">028</span> *<a name="line.28"></a>
<span class="sourceLineNo">029</span> * @since 2.6<a name="line.29"></a>
<span class="sourceLineNo">030</span> */<a name="line.30"></a>
<span class="sourceLineNo">031</span>public class TextEncoderHelper {<a name="line.31"></a>
<span class="sourceLineNo">032</span><a name="line.32"></a>
<span class="sourceLineNo">033</span>    private TextEncoderHelper() {<a name="line.33"></a>
<span class="sourceLineNo">034</span>    }<a name="line.34"></a>
<span class="sourceLineNo">035</span><a name="line.35"></a>
<span class="sourceLineNo">036</span>    static void encodeTextFallBack(final Charset charset, final StringBuilder text,<a name="line.36"></a>
<span class="sourceLineNo">037</span>            final ByteBufferDestination destination) {<a name="line.37"></a>
<span class="sourceLineNo">038</span>        final byte[] bytes = text.toString().getBytes(charset);<a name="line.38"></a>
<span class="sourceLineNo">039</span>        destination.writeBytes(bytes, 0, bytes.length);<a name="line.39"></a>
<span class="sourceLineNo">040</span>    }<a name="line.40"></a>
<span class="sourceLineNo">041</span><a name="line.41"></a>
<span class="sourceLineNo">042</span>    /**<a name="line.42"></a>
<span class="sourceLineNo">043</span>     * Converts the specified text to bytes and writes the resulting bytes to the specified destination.<a name="line.43"></a>
<span class="sourceLineNo">044</span>     * Attempts to postpone synchronizing on the destination as long as possible to minimize lock contention.<a name="line.44"></a>
<span class="sourceLineNo">045</span>     *<a name="line.45"></a>
<span class="sourceLineNo">046</span>     * @param charsetEncoder thread-local encoder instance for converting chars to bytes<a name="line.46"></a>
<span class="sourceLineNo">047</span>     * @param charBuf thread-local text buffer for converting text to bytes<a name="line.47"></a>
<span class="sourceLineNo">048</span>     * @param byteBuf thread-local buffer to temporarily hold converted bytes before copying them to the destination<a name="line.48"></a>
<span class="sourceLineNo">049</span>     * @param text the text to convert and write to the destination<a name="line.49"></a>
<span class="sourceLineNo">050</span>     * @param destination the destination to write the bytes to<a name="line.50"></a>
<span class="sourceLineNo">051</span>     * @throws CharacterCodingException if conversion failed<a name="line.51"></a>
<span class="sourceLineNo">052</span>     */<a name="line.52"></a>
<span class="sourceLineNo">053</span>    static void encodeText(final CharsetEncoder charsetEncoder, final CharBuffer charBuf, final ByteBuffer byteBuf,<a name="line.53"></a>
<span class="sourceLineNo">054</span>            final StringBuilder text, final ByteBufferDestination destination)<a name="line.54"></a>
<span class="sourceLineNo">055</span>            throws CharacterCodingException {<a name="line.55"></a>
<span class="sourceLineNo">056</span>        charsetEncoder.reset();<a name="line.56"></a>
<span class="sourceLineNo">057</span>        if (text.length() &gt; charBuf.capacity()) {<a name="line.57"></a>
<span class="sourceLineNo">058</span>            encodeChunkedText(charsetEncoder, charBuf, byteBuf, text, destination);<a name="line.58"></a>
<span class="sourceLineNo">059</span>            return;<a name="line.59"></a>
<span class="sourceLineNo">060</span>        }<a name="line.60"></a>
<span class="sourceLineNo">061</span>        charBuf.clear();<a name="line.61"></a>
<span class="sourceLineNo">062</span>        text.getChars(0, text.length(), charBuf.array(), charBuf.arrayOffset());<a name="line.62"></a>
<span class="sourceLineNo">063</span>        charBuf.limit(text.length());<a name="line.63"></a>
<span class="sourceLineNo">064</span>        final CoderResult result = charsetEncoder.encode(charBuf, byteBuf, true);<a name="line.64"></a>
<span class="sourceLineNo">065</span>        writeEncodedText(charsetEncoder, charBuf, byteBuf, destination, result);<a name="line.65"></a>
<span class="sourceLineNo">066</span>    }<a name="line.66"></a>
<span class="sourceLineNo">067</span><a name="line.67"></a>
<span class="sourceLineNo">068</span>    /**<a name="line.68"></a>
<span class="sourceLineNo">069</span>     * This method is called when the CharEncoder has encoded (but not yet flushed) content from the CharBuffer<a name="line.69"></a>
<span class="sourceLineNo">070</span>     * into the ByteBuffer. A CoderResult of UNDERFLOW means that the contents fit into the ByteBuffer and we can move<a name="line.70"></a>
<span class="sourceLineNo">071</span>     * on to the next step, flushing. Otherwise, we need to synchronize on the destination, copy the ByteBuffer to the<a name="line.71"></a>
<span class="sourceLineNo">072</span>     * destination and encode the remainder of the CharBuffer while holding the lock on the destination.<a name="line.72"></a>
<span class="sourceLineNo">073</span>     *<a name="line.73"></a>
<span class="sourceLineNo">074</span>     * @since 2.9<a name="line.74"></a>
<span class="sourceLineNo">075</span>     */<a name="line.75"></a>
<span class="sourceLineNo">076</span>    private static void writeEncodedText(final CharsetEncoder charsetEncoder, final CharBuffer charBuf,<a name="line.76"></a>
<span class="sourceLineNo">077</span>            final ByteBuffer byteBuf, final ByteBufferDestination destination, CoderResult result) {<a name="line.77"></a>
<span class="sourceLineNo">078</span>        if (!result.isUnderflow()) {<a name="line.78"></a>
<span class="sourceLineNo">079</span>            writeChunkedEncodedText(charsetEncoder, charBuf, destination, byteBuf, result);<a name="line.79"></a>
<span class="sourceLineNo">080</span>            return;<a name="line.80"></a>
<span class="sourceLineNo">081</span>        }<a name="line.81"></a>
<span class="sourceLineNo">082</span>        result = charsetEncoder.flush(byteBuf);<a name="line.82"></a>
<span class="sourceLineNo">083</span>        if (!result.isUnderflow()) {<a name="line.83"></a>
<span class="sourceLineNo">084</span>            synchronized (destination) {<a name="line.84"></a>
<span class="sourceLineNo">085</span>                flushRemainingBytes(charsetEncoder, destination, byteBuf);<a name="line.85"></a>
<span class="sourceLineNo">086</span>            }<a name="line.86"></a>
<span class="sourceLineNo">087</span>            return;<a name="line.87"></a>
<span class="sourceLineNo">088</span>        }<a name="line.88"></a>
<span class="sourceLineNo">089</span>        // Thread-safety note: no explicit synchronization on ByteBufferDestination below. This is safe, because<a name="line.89"></a>
<span class="sourceLineNo">090</span>        // if the byteBuf is actually the destination's buffer, this method call should be protected with<a name="line.90"></a>
<span class="sourceLineNo">091</span>        // synchronization on the destination object at some level, so the call to destination.getByteBuffer() should<a name="line.91"></a>
<span class="sourceLineNo">092</span>        // be safe. If the byteBuf is an unrelated buffer, the comparison between the buffers should fail despite<a name="line.92"></a>
<span class="sourceLineNo">093</span>        // destination.getByteBuffer() is not protected with the synchronization on the destination object.<a name="line.93"></a>
<span class="sourceLineNo">094</span>        if (byteBuf != destination.getByteBuffer()) {<a name="line.94"></a>
<span class="sourceLineNo">095</span>            byteBuf.flip();<a name="line.95"></a>
<span class="sourceLineNo">096</span>            destination.writeBytes(byteBuf);<a name="line.96"></a>
<span class="sourceLineNo">097</span>            byteBuf.clear();<a name="line.97"></a>
<span class="sourceLineNo">098</span>        }<a name="line.98"></a>
<span class="sourceLineNo">099</span>    }<a name="line.99"></a>
<span class="sourceLineNo">100</span><a name="line.100"></a>
<span class="sourceLineNo">101</span>    /**<a name="line.101"></a>
<span class="sourceLineNo">102</span>     * This method is called when the CharEncoder has encoded (but not yet flushed) content from the CharBuffer<a name="line.102"></a>
<span class="sourceLineNo">103</span>     * into the ByteBuffer and we found that the ByteBuffer is too small to hold all the content.<a name="line.103"></a>
<span class="sourceLineNo">104</span>     * Therefore, we need to synchronize on the destination, copy the ByteBuffer to the<a name="line.104"></a>
<span class="sourceLineNo">105</span>     * destination and encode the remainder of the CharBuffer while holding the lock on the destination.<a name="line.105"></a>
<span class="sourceLineNo">106</span>     *<a name="line.106"></a>
<span class="sourceLineNo">107</span>     * @since 2.9<a name="line.107"></a>
<span class="sourceLineNo">108</span>     */<a name="line.108"></a>
<span class="sourceLineNo">109</span>    private static void writeChunkedEncodedText(final CharsetEncoder charsetEncoder, final CharBuffer charBuf,<a name="line.109"></a>
<span class="sourceLineNo">110</span>            final ByteBufferDestination destination, ByteBuffer byteBuf, final CoderResult result) {<a name="line.110"></a>
<span class="sourceLineNo">111</span>        synchronized (destination) {<a name="line.111"></a>
<span class="sourceLineNo">112</span>            byteBuf = writeAndEncodeAsMuchAsPossible(charsetEncoder, charBuf, true, destination, byteBuf,<a name="line.112"></a>
<span class="sourceLineNo">113</span>                    result);<a name="line.113"></a>
<span class="sourceLineNo">114</span>            flushRemainingBytes(charsetEncoder, destination, byteBuf);<a name="line.114"></a>
<span class="sourceLineNo">115</span>        }<a name="line.115"></a>
<span class="sourceLineNo">116</span>    }<a name="line.116"></a>
<span class="sourceLineNo">117</span><a name="line.117"></a>
<span class="sourceLineNo">118</span>    /**<a name="line.118"></a>
<span class="sourceLineNo">119</span>     * This method is called &lt;em&gt;before&lt;/em&gt; the CharEncoder has encoded any content from the CharBuffer<a name="line.119"></a>
<span class="sourceLineNo">120</span>     * into the ByteBuffer, but we have already detected that the CharBuffer contents is too large to fit into the<a name="line.120"></a>
<span class="sourceLineNo">121</span>     * ByteBuffer. Therefore, at some point we need to synchronize on the destination, copy the ByteBuffer to the<a name="line.121"></a>
<span class="sourceLineNo">122</span>     * destination and encode the remainder of the CharBuffer while holding the lock on the destination.<a name="line.122"></a>
<span class="sourceLineNo">123</span>     *<a name="line.123"></a>
<span class="sourceLineNo">124</span>     * @since 2.9<a name="line.124"></a>
<span class="sourceLineNo">125</span>     */<a name="line.125"></a>
<span class="sourceLineNo">126</span>    private static void encodeChunkedText(final CharsetEncoder charsetEncoder, final CharBuffer charBuf,<a name="line.126"></a>
<span class="sourceLineNo">127</span>            ByteBuffer byteBuf, final StringBuilder text, final ByteBufferDestination destination) {<a name="line.127"></a>
<span class="sourceLineNo">128</span><a name="line.128"></a>
<span class="sourceLineNo">129</span>        // LOG4J2-1874 ByteBuffer, CharBuffer and CharsetEncoder are thread-local, so no need to synchronize while<a name="line.129"></a>
<span class="sourceLineNo">130</span>        // modifying these objects. Postpone synchronization until accessing the ByteBufferDestination.<a name="line.130"></a>
<span class="sourceLineNo">131</span>        int start = 0;<a name="line.131"></a>
<span class="sourceLineNo">132</span>        CoderResult result = CoderResult.UNDERFLOW;<a name="line.132"></a>
<span class="sourceLineNo">133</span>        boolean endOfInput = false;<a name="line.133"></a>
<span class="sourceLineNo">134</span>        while (!endOfInput &amp;&amp; result.isUnderflow()) {<a name="line.134"></a>
<span class="sourceLineNo">135</span>            charBuf.clear();<a name="line.135"></a>
<span class="sourceLineNo">136</span>            final int copied = copy(text, start, charBuf);<a name="line.136"></a>
<span class="sourceLineNo">137</span>            start += copied;<a name="line.137"></a>
<span class="sourceLineNo">138</span>            endOfInput = start &gt;= text.length();<a name="line.138"></a>
<span class="sourceLineNo">139</span>            charBuf.flip();<a name="line.139"></a>
<span class="sourceLineNo">140</span>            result = charsetEncoder.encode(charBuf, byteBuf, endOfInput);<a name="line.140"></a>
<span class="sourceLineNo">141</span>        }<a name="line.141"></a>
<span class="sourceLineNo">142</span>        if (endOfInput) {<a name="line.142"></a>
<span class="sourceLineNo">143</span>            writeEncodedText(charsetEncoder, charBuf, byteBuf, destination, result);<a name="line.143"></a>
<span class="sourceLineNo">144</span>            return;<a name="line.144"></a>
<span class="sourceLineNo">145</span>        }<a name="line.145"></a>
<span class="sourceLineNo">146</span>        synchronized (destination) {<a name="line.146"></a>
<span class="sourceLineNo">147</span>            byteBuf = writeAndEncodeAsMuchAsPossible(charsetEncoder, charBuf, endOfInput, destination, byteBuf,<a name="line.147"></a>
<span class="sourceLineNo">148</span>                    result);<a name="line.148"></a>
<span class="sourceLineNo">149</span>            while (!endOfInput) {<a name="line.149"></a>
<span class="sourceLineNo">150</span>                result = CoderResult.UNDERFLOW;<a name="line.150"></a>
<span class="sourceLineNo">151</span>                while (!endOfInput &amp;&amp; result.isUnderflow()) {<a name="line.151"></a>
<span class="sourceLineNo">152</span>                    charBuf.clear();<a name="line.152"></a>
<span class="sourceLineNo">153</span>                    final int copied = copy(text, start, charBuf);<a name="line.153"></a>
<span class="sourceLineNo">154</span>                    start += copied;<a name="line.154"></a>
<span class="sourceLineNo">155</span>                    endOfInput = start &gt;= text.length();<a name="line.155"></a>
<span class="sourceLineNo">156</span>                    charBuf.flip();<a name="line.156"></a>
<span class="sourceLineNo">157</span>                    result = charsetEncoder.encode(charBuf, byteBuf, endOfInput);<a name="line.157"></a>
<span class="sourceLineNo">158</span>                }<a name="line.158"></a>
<span class="sourceLineNo">159</span>                byteBuf = writeAndEncodeAsMuchAsPossible(charsetEncoder, charBuf, endOfInput, destination, byteBuf,<a name="line.159"></a>
<span class="sourceLineNo">160</span>                        result);<a name="line.160"></a>
<span class="sourceLineNo">161</span>            }<a name="line.161"></a>
<span class="sourceLineNo">162</span>            flushRemainingBytes(charsetEncoder, destination, byteBuf);<a name="line.162"></a>
<span class="sourceLineNo">163</span>        }<a name="line.163"></a>
<span class="sourceLineNo">164</span>    }<a name="line.164"></a>
<span class="sourceLineNo">165</span><a name="line.165"></a>
<span class="sourceLineNo">166</span>    /**<a name="line.166"></a>
<span class="sourceLineNo">167</span>     * For testing purposes only.<a name="line.167"></a>
<span class="sourceLineNo">168</span>     */<a name="line.168"></a>
<span class="sourceLineNo">169</span>    @Deprecated<a name="line.169"></a>
<span class="sourceLineNo">170</span>    public static void encodeText(final CharsetEncoder charsetEncoder, final CharBuffer charBuf,<a name="line.170"></a>
<span class="sourceLineNo">171</span>            final ByteBufferDestination destination) {<a name="line.171"></a>
<span class="sourceLineNo">172</span>        charsetEncoder.reset();<a name="line.172"></a>
<span class="sourceLineNo">173</span>        synchronized (destination) {<a name="line.173"></a>
<span class="sourceLineNo">174</span>            ByteBuffer byteBuf = destination.getByteBuffer();<a name="line.174"></a>
<span class="sourceLineNo">175</span>            byteBuf = encodeAsMuchAsPossible(charsetEncoder, charBuf, true, destination, byteBuf);<a name="line.175"></a>
<span class="sourceLineNo">176</span>            flushRemainingBytes(charsetEncoder, destination, byteBuf);<a name="line.176"></a>
<span class="sourceLineNo">177</span>        }<a name="line.177"></a>
<span class="sourceLineNo">178</span>    }<a name="line.178"></a>
<span class="sourceLineNo">179</span><a name="line.179"></a>
<span class="sourceLineNo">180</span>    /**<a name="line.180"></a>
<span class="sourceLineNo">181</span>     * Continues to write the contents of the ByteBuffer to the destination and encode more of the CharBuffer text<a name="line.181"></a>
<span class="sourceLineNo">182</span>     * into the ByteBuffer until the remaining encoded text fit into the ByteBuffer, at which point the ByteBuffer<a name="line.182"></a>
<span class="sourceLineNo">183</span>     * is returned (without flushing the CharEncoder).<a name="line.183"></a>
<span class="sourceLineNo">184</span>     * &lt;p&gt;<a name="line.184"></a>
<span class="sourceLineNo">185</span>     * This method is called when the CharEncoder has encoded (but not yet flushed) content from the CharBuffer<a name="line.185"></a>
<span class="sourceLineNo">186</span>     * into the ByteBuffer and we found that the ByteBuffer is too small to hold all the content.<a name="line.186"></a>
<span class="sourceLineNo">187</span>     * &lt;/p&gt;&lt;p&gt;<a name="line.187"></a>
<span class="sourceLineNo">188</span>     * Thread-safety note: This method should be called while synchronizing on the ByteBufferDestination.<a name="line.188"></a>
<span class="sourceLineNo">189</span>     * &lt;/p&gt;<a name="line.189"></a>
<span class="sourceLineNo">190</span>     * @return the ByteBuffer resulting from draining the temporary ByteBuffer to the destination. In the case<a name="line.190"></a>
<span class="sourceLineNo">191</span>     *          of a MemoryMappedFile, a remap() may have taken place and the returned ByteBuffer is now the<a name="line.191"></a>
<span class="sourceLineNo">192</span>     *          MappedBuffer of the newly mapped region of the memory mapped file.<a name="line.192"></a>
<span class="sourceLineNo">193</span>     * @since 2.9<a name="line.193"></a>
<span class="sourceLineNo">194</span>     */<a name="line.194"></a>
<span class="sourceLineNo">195</span>    private static ByteBuffer writeAndEncodeAsMuchAsPossible(final CharsetEncoder charsetEncoder,<a name="line.195"></a>
<span class="sourceLineNo">196</span>            final CharBuffer charBuf, final boolean endOfInput, final ByteBufferDestination destination,<a name="line.196"></a>
<span class="sourceLineNo">197</span>            ByteBuffer temp, CoderResult result) {<a name="line.197"></a>
<span class="sourceLineNo">198</span>        while (true) {<a name="line.198"></a>
<span class="sourceLineNo">199</span>            temp = drainIfByteBufferFull(destination, temp, result);<a name="line.199"></a>
<span class="sourceLineNo">200</span>            if (!result.isOverflow()) {<a name="line.200"></a>
<span class="sourceLineNo">201</span>                break;<a name="line.201"></a>
<span class="sourceLineNo">202</span>            }<a name="line.202"></a>
<span class="sourceLineNo">203</span>            result = charsetEncoder.encode(charBuf, temp, endOfInput);<a name="line.203"></a>
<span class="sourceLineNo">204</span>        }<a name="line.204"></a>
<span class="sourceLineNo">205</span>        if (!result.isUnderflow()) { // we should have fully read the char buffer contents<a name="line.205"></a>
<span class="sourceLineNo">206</span>            throwException(result);<a name="line.206"></a>
<span class="sourceLineNo">207</span>        }<a name="line.207"></a>
<span class="sourceLineNo">208</span>        return temp;<a name="line.208"></a>
<span class="sourceLineNo">209</span>    }<a name="line.209"></a>
<span class="sourceLineNo">210</span><a name="line.210"></a>
<span class="sourceLineNo">211</span>    // @since 2.9<a name="line.211"></a>
<span class="sourceLineNo">212</span>    private static void throwException(final CoderResult result) {<a name="line.212"></a>
<span class="sourceLineNo">213</span>        try {<a name="line.213"></a>
<span class="sourceLineNo">214</span>            result.throwException();<a name="line.214"></a>
<span class="sourceLineNo">215</span>        } catch (final CharacterCodingException e) {<a name="line.215"></a>
<span class="sourceLineNo">216</span>            throw new IllegalStateException(e);<a name="line.216"></a>
<span class="sourceLineNo">217</span>        }<a name="line.217"></a>
<span class="sourceLineNo">218</span>    }<a name="line.218"></a>
<span class="sourceLineNo">219</span><a name="line.219"></a>
<span class="sourceLineNo">220</span>    private static ByteBuffer encodeAsMuchAsPossible(final CharsetEncoder charsetEncoder, final CharBuffer charBuf,<a name="line.220"></a>
<span class="sourceLineNo">221</span>            final boolean endOfInput, final ByteBufferDestination destination, ByteBuffer temp) {<a name="line.221"></a>
<span class="sourceLineNo">222</span>        CoderResult result;<a name="line.222"></a>
<span class="sourceLineNo">223</span>        do {<a name="line.223"></a>
<span class="sourceLineNo">224</span>            result = charsetEncoder.encode(charBuf, temp, endOfInput);<a name="line.224"></a>
<span class="sourceLineNo">225</span>            temp = drainIfByteBufferFull(destination, temp, result);<a name="line.225"></a>
<span class="sourceLineNo">226</span>        } while (result.isOverflow()); // byte buffer has been drained: retry<a name="line.226"></a>
<span class="sourceLineNo">227</span>        if (!result.isUnderflow()) { // we should have fully read the char buffer contents<a name="line.227"></a>
<span class="sourceLineNo">228</span>            throwException(result);<a name="line.228"></a>
<span class="sourceLineNo">229</span>        }<a name="line.229"></a>
<span class="sourceLineNo">230</span>        return temp;<a name="line.230"></a>
<span class="sourceLineNo">231</span>    }<a name="line.231"></a>
<span class="sourceLineNo">232</span><a name="line.232"></a>
<span class="sourceLineNo">233</span>    /**<a name="line.233"></a>
<span class="sourceLineNo">234</span>     * If the CoderResult indicates the ByteBuffer is full, synchronize on the destination and write the content<a name="line.234"></a>
<span class="sourceLineNo">235</span>     * of the ByteBuffer to the destination. If the specified ByteBuffer is owned by the destination, we have<a name="line.235"></a>
<span class="sourceLineNo">236</span>     * reached the end of a MappedBuffer and we call drain() on the destination to remap().<a name="line.236"></a>
<span class="sourceLineNo">237</span>     * &lt;p&gt;<a name="line.237"></a>
<span class="sourceLineNo">238</span>     * If the CoderResult indicates more can be encoded, this method does nothing and returns the temp ByteBuffer.<a name="line.238"></a>
<span class="sourceLineNo">239</span>     * &lt;/p&gt;<a name="line.239"></a>
<span class="sourceLineNo">240</span>     *<a name="line.240"></a>
<span class="sourceLineNo">241</span>     * @param destination the destination to write bytes to<a name="line.241"></a>
<span class="sourceLineNo">242</span>     * @param temp the ByteBuffer containing the encoded bytes. May be a temporary buffer or may be the ByteBuffer of<a name="line.242"></a>
<span class="sourceLineNo">243</span>     *              the ByteBufferDestination<a name="line.243"></a>
<span class="sourceLineNo">244</span>     * @param result the CoderResult from the CharsetEncoder<a name="line.244"></a>
<span class="sourceLineNo">245</span>     * @return the ByteBuffer to encode into for the remainder of the text<a name="line.245"></a>
<span class="sourceLineNo">246</span>     */<a name="line.246"></a>
<span class="sourceLineNo">247</span>    private static ByteBuffer drainIfByteBufferFull(final ByteBufferDestination destination, final ByteBuffer temp,<a name="line.247"></a>
<span class="sourceLineNo">248</span>            final CoderResult result) {<a name="line.248"></a>
<span class="sourceLineNo">249</span>        if (result.isOverflow()) { // byte buffer full<a name="line.249"></a>
<span class="sourceLineNo">250</span>            // all callers already synchronize on destination but for safety ensure we are synchronized because<a name="line.250"></a>
<span class="sourceLineNo">251</span>            // below calls to drain() may cause destination to swap in a new ByteBuffer object<a name="line.251"></a>
<span class="sourceLineNo">252</span>            synchronized (destination) {<a name="line.252"></a>
<span class="sourceLineNo">253</span>                final ByteBuffer destinationBuffer = destination.getByteBuffer();<a name="line.253"></a>
<span class="sourceLineNo">254</span>                if (destinationBuffer != temp) {<a name="line.254"></a>
<span class="sourceLineNo">255</span>                    temp.flip();<a name="line.255"></a>
<span class="sourceLineNo">256</span>                    ByteBufferDestinationHelper.writeToUnsynchronized(temp, destination);<a name="line.256"></a>
<span class="sourceLineNo">257</span>                    temp.clear();<a name="line.257"></a>
<span class="sourceLineNo">258</span>                    return destination.getByteBuffer();<a name="line.258"></a>
<span class="sourceLineNo">259</span>                } else {<a name="line.259"></a>
<span class="sourceLineNo">260</span>                    return destination.drain(destinationBuffer);<a name="line.260"></a>
<span class="sourceLineNo">261</span>                }<a name="line.261"></a>
<span class="sourceLineNo">262</span>            }<a name="line.262"></a>
<span class="sourceLineNo">263</span>        } else {<a name="line.263"></a>
<span class="sourceLineNo">264</span>            return temp;<a name="line.264"></a>
<span class="sourceLineNo">265</span>        }<a name="line.265"></a>
<span class="sourceLineNo">266</span>    }<a name="line.266"></a>
<span class="sourceLineNo">267</span><a name="line.267"></a>
<span class="sourceLineNo">268</span>    private static void flushRemainingBytes(final CharsetEncoder charsetEncoder,<a name="line.268"></a>
<span class="sourceLineNo">269</span>            final ByteBufferDestination destination, ByteBuffer temp) {<a name="line.269"></a>
<span class="sourceLineNo">270</span>        CoderResult result;<a name="line.270"></a>
<span class="sourceLineNo">271</span>        do {<a name="line.271"></a>
<span class="sourceLineNo">272</span>            // write any final bytes to the output buffer once the overall input sequence has been read<a name="line.272"></a>
<span class="sourceLineNo">273</span>            result = charsetEncoder.flush(temp);<a name="line.273"></a>
<span class="sourceLineNo">274</span>            temp = drainIfByteBufferFull(destination, temp, result);<a name="line.274"></a>
<span class="sourceLineNo">275</span>        } while (result.isOverflow()); // byte buffer has been drained: retry<a name="line.275"></a>
<span class="sourceLineNo">276</span>        if (!result.isUnderflow()) { // we should have fully flushed the remaining bytes<a name="line.276"></a>
<span class="sourceLineNo">277</span>            throwException(result);<a name="line.277"></a>
<span class="sourceLineNo">278</span>        }<a name="line.278"></a>
<span class="sourceLineNo">279</span>        if (temp.remaining() &gt; 0 &amp;&amp; temp != destination.getByteBuffer()) {<a name="line.279"></a>
<span class="sourceLineNo">280</span>            temp.flip();<a name="line.280"></a>
<span class="sourceLineNo">281</span>            ByteBufferDestinationHelper.writeToUnsynchronized(temp, destination);<a name="line.281"></a>
<span class="sourceLineNo">282</span>            temp.clear();<a name="line.282"></a>
<span class="sourceLineNo">283</span>        }<a name="line.283"></a>
<span class="sourceLineNo">284</span>    }<a name="line.284"></a>
<span class="sourceLineNo">285</span><a name="line.285"></a>
<span class="sourceLineNo">286</span>    /**<a name="line.286"></a>
<span class="sourceLineNo">287</span>     * Copies characters from the StringBuilder into the CharBuffer,<a name="line.287"></a>
<span class="sourceLineNo">288</span>     * starting at the specified offset and ending when either all<a name="line.288"></a>
<span class="sourceLineNo">289</span>     * characters have been copied or when the CharBuffer is full.<a name="line.289"></a>
<span class="sourceLineNo">290</span>     *<a name="line.290"></a>
<span class="sourceLineNo">291</span>     * @return the number of characters that were copied<a name="line.291"></a>
<span class="sourceLineNo">292</span>     */<a name="line.292"></a>
<span class="sourceLineNo">293</span>    static int copy(final StringBuilder source, final int offset, final CharBuffer destination) {<a name="line.293"></a>
<span class="sourceLineNo">294</span>        final int length = Math.min(source.length() - offset, destination.remaining());<a name="line.294"></a>
<span class="sourceLineNo">295</span>        final char[] array = destination.array();<a name="line.295"></a>
<span class="sourceLineNo">296</span>        final int start = destination.position();<a name="line.296"></a>
<span class="sourceLineNo">297</span>        source.getChars(offset, offset + length, array, destination.arrayOffset() + start);<a name="line.297"></a>
<span class="sourceLineNo">298</span>        destination.position(start + length);<a name="line.298"></a>
<span class="sourceLineNo">299</span>        return length;<a name="line.299"></a>
<span class="sourceLineNo">300</span>    }<a name="line.300"></a>
<span class="sourceLineNo">301</span>}<a name="line.301"></a>




























































</pre>
</div>
</body>
</html>
