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