ThreadLocalOutputBufferProvider.java revision 56ed4167b942ec265f9cee70ac4d71d10b3835ce
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/* 25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * Copyright (C) 2010 Google Inc. 35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * 45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * Licensed under the Apache License, Version 2.0 (the "License"); 50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner * you may not use this file except in compliance with the License. 60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner * You may obtain a copy of the License at 75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * 85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * http://www.apache.org/licenses/LICENSE-2.0 95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * 105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * Unless required by applicable law or agreed to in writing, software 115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * distributed under the License is distributed on an "AS IS" BASIS, 125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * See the License for the specific language governing permissions and 145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * limitations under the License. 155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer */ 165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 173632a35e811096da86d957c3e6ba0e73d75782f5Ted Kremenekpackage com.google.clearsilver.jsilver.output; 18ae50fa0a9e7217b043ed4ffe175af4b26dc90f34Chris Lattner 199dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner/** 209c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek * Implementation of OutputBufferProvider that reuses the same StringBuilder in each Thread. 212b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner */ 22ae50fa0a9e7217b043ed4ffe175af4b26dc90f34Chris Lattnerpublic class ThreadLocalOutputBufferProvider implements OutputBufferProvider { 23ceafc4b63599d14f0b5b10ff92e22bf242682dceBenjamin Kramer 242b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner private final ThreadLocal<StringBuilder> pool; 2506159e878569e5f39bf0e8f11b84ac3ad0970597Chris Lattner private final ThreadLocal<Boolean> available; 269c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek 279c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek public ThreadLocalOutputBufferProvider(final int bufferSize) { 285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer pool = new ThreadLocal<StringBuilder>() { 291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump protected StringBuilder initialValue() { 30a9793ed6a77946c988ee38035baf4cde6ff2e864Ted Kremenek return new StringBuilder(bufferSize); 311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 322b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner }; 332b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner available = new ThreadLocal<Boolean>() { 342b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner protected Boolean initialValue() { 352b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner return true; 362b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner } 372b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner }; 382b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner } 392b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner 401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump @Override 412b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner public Appendable get() { 421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!available.get()) { 432b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner throw new IllegalStateException("Thread buffer is not free."); 442b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner } 452b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner StringBuilder sb = pool.get(); 462b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner available.set(false); 472b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner sb.setLength(0); 482b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner return sb; 491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 50de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 512b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner @Override 521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump public void release(Appendable buffer) { 532b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner if (buffer != pool.get()) { 542b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner throw new IllegalArgumentException("Can't release buffer that does not " 55de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner + "correspond to this thread."); 562b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner } 572b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner available.set(true); 582b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner } 592b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner} 602b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner