CodecPool.java
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:5k
源码类别:

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. package org.apache.hadoop.io.compress;
  19. import java.util.ArrayList;
  20. import java.util.HashMap;
  21. import java.util.List;
  22. import java.util.Map;
  23. import org.apache.commons.logging.Log;
  24. import org.apache.commons.logging.LogFactory;
  25. import org.apache.hadoop.util.ReflectionUtils;
  26. /**
  27.  * A global compressor/decompressor pool used to save and reuse 
  28.  * (possibly native) compression/decompression codecs.
  29.  */
  30. public class CodecPool {
  31.   private static final Log LOG = LogFactory.getLog(CodecPool.class);
  32.   
  33.   /**
  34.    * A global compressor pool used to save the expensive 
  35.    * construction/destruction of (possibly native) decompression codecs.
  36.    */
  37.   private static final Map<Class<Compressor>, List<Compressor>> compressorPool = 
  38.     new HashMap<Class<Compressor>, List<Compressor>>();
  39.   
  40.   /**
  41.    * A global decompressor pool used to save the expensive 
  42.    * construction/destruction of (possibly native) decompression codecs.
  43.    */
  44.   private static final Map<Class<Decompressor>, List<Decompressor>> decompressorPool = 
  45.     new HashMap<Class<Decompressor>, List<Decompressor>>();
  46.   private static <T> T borrow(Map<Class<T>, List<T>> pool,
  47.                              Class<? extends T> codecClass) {
  48.     T codec = null;
  49.     
  50.     // Check if an appropriate codec is available
  51.     synchronized (pool) {
  52.       if (pool.containsKey(codecClass)) {
  53.         List<T> codecList = pool.get(codecClass);
  54.         
  55.         if (codecList != null) {
  56.           synchronized (codecList) {
  57.             if (!codecList.isEmpty()) {
  58.               codec = codecList.remove(codecList.size()-1);
  59.             }
  60.           }
  61.         }
  62.       }
  63.     }
  64.     
  65.     return codec;
  66.   }
  67.   private static <T> void payback(Map<Class<T>, List<T>> pool, T codec) {
  68.     if (codec != null) {
  69.       Class<T> codecClass = ReflectionUtils.getClass(codec);
  70.       synchronized (pool) {
  71.         if (!pool.containsKey(codecClass)) {
  72.           pool.put(codecClass, new ArrayList<T>());
  73.         }
  74.         List<T> codecList = pool.get(codecClass);
  75.         synchronized (codecList) {
  76.           codecList.add(codec);
  77.         }
  78.       }
  79.     }
  80.   }
  81.   
  82.   /**
  83.    * Get a {@link Compressor} for the given {@link CompressionCodec} from the 
  84.    * pool or a new one.
  85.    *
  86.    * @param codec the <code>CompressionCodec</code> for which to get the 
  87.    *              <code>Compressor</code>
  88.    * @return <code>Compressor</code> for the given 
  89.    *         <code>CompressionCodec</code> from the pool or a new one
  90.    */
  91.   public static Compressor getCompressor(CompressionCodec codec) {
  92.     Compressor compressor = borrow(compressorPool, codec.getCompressorType());
  93.     if (compressor == null) {
  94.       compressor = codec.createCompressor();
  95.       LOG.info("Got brand-new compressor");
  96.     } else {
  97.       LOG.debug("Got recycled compressor");
  98.     }
  99.     return compressor;
  100.   }
  101.   
  102.   /**
  103.    * Get a {@link Decompressor} for the given {@link CompressionCodec} from the
  104.    * pool or a new one.
  105.    *  
  106.    * @param codec the <code>CompressionCodec</code> for which to get the 
  107.    *              <code>Decompressor</code>
  108.    * @return <code>Decompressor</code> for the given 
  109.    *         <code>CompressionCodec</code> the pool or a new one
  110.    */
  111.   public static Decompressor getDecompressor(CompressionCodec codec) {
  112.     Decompressor decompressor = borrow(decompressorPool, codec.getDecompressorType());
  113.     if (decompressor == null) {
  114.       decompressor = codec.createDecompressor();
  115.       LOG.info("Got brand-new decompressor");
  116.     } else {
  117.       LOG.debug("Got recycled decompressor");
  118.     }
  119.     return decompressor;
  120.   }
  121.   
  122.   /**
  123.    * Return the {@link Compressor} to the pool.
  124.    * 
  125.    * @param compressor the <code>Compressor</code> to be returned to the pool
  126.    */
  127.   public static void returnCompressor(Compressor compressor) {
  128.     if (compressor == null) {
  129.       return;
  130.     }
  131.     compressor.reset();
  132.     payback(compressorPool, compressor);
  133.   }
  134.   
  135.   /**
  136.    * Return the {@link Decompressor} to the pool.
  137.    * 
  138.    * @param decompressor the <code>Decompressor</code> to be returned to the 
  139.    *                     pool
  140.    */
  141.   public static void returnDecompressor(Decompressor decompressor) {
  142.     if (decompressor == null) {
  143.       return;
  144.     }
  145.     decompressor.reset();
  146.     payback(decompressorPool, decompressor);
  147.   }
  148. }