[HTTPCLIENT-1845]: Extract InputStreamFactory classes out of GzipDecompressingEntity and  DeflateDecompressingEntity for reuse and to create less garbage.

git-svn-id: https://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk@1794410 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/RELEASE_NOTES.txt b/RELEASE_NOTES.txt
index ce89905..dbbf0a0 100644
--- a/RELEASE_NOTES.txt
+++ b/RELEASE_NOTES.txt
@@ -1,3 +1,11 @@
+Release 5.0-ALPHA3
+-------------------
+
+* [HTTPCLIENT-1845]: Extract InputStreamFactory classes out of GzipDecompressingEntity and 
+  DeflateDecompressingEntity for reuse and to create less garbage.
+  Contributed by Gary Gregory <ggregory at apache.org>
+
+
 Release 5.0-ALPHA2
 -------------------
 
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/entity/DeflateDecompressingEntity.java b/httpclient5/src/main/java/org/apache/hc/client5/http/entity/DeflateDecompressingEntity.java
index 34c89cc..3f20536 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/entity/DeflateDecompressingEntity.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/entity/DeflateDecompressingEntity.java
@@ -26,9 +26,6 @@
  */
 package org.apache.hc.client5.http.entity;
 
-import java.io.IOException;
-import java.io.InputStream;
-
 import org.apache.hc.core5.http.HttpEntity;
 
 /**
@@ -57,14 +54,7 @@
      *            a non-null {@link HttpEntity} to be wrapped
      */
     public DeflateDecompressingEntity(final HttpEntity entity) {
-        super(entity, new InputStreamFactory() {
-
-            @Override
-            public InputStream create(final InputStream instream) throws IOException {
-                return new DeflateInputStream(instream);
-            }
-
-        });
+        super(entity, DeflateInputStreamFactory.getInstance());
     }
 
 }
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/entity/DeflateInputStreamFactory.java b/httpclient5/src/main/java/org/apache/hc/client5/http/entity/DeflateInputStreamFactory.java
new file mode 100644
index 0000000..82aaec5
--- /dev/null
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/entity/DeflateInputStreamFactory.java
@@ -0,0 +1,63 @@
+/*

+ * ====================================================================

+ * Licensed to the Apache Software Foundation (ASF) under one

+ * or more contributor license agreements.  See the NOTICE file

+ * distributed with this work for additional information

+ * regarding copyright ownership.  The ASF licenses this file

+ * to you under the Apache License, Version 2.0 (the

+ * "License"); you may not use this file except in compliance

+ * with the License.  You may obtain a copy of the License at

+ *

+ *   http://www.apache.org/licenses/LICENSE-2.0

+ *

+ * Unless required by applicable law or agreed to in writing,

+ * software distributed under the License is distributed on an

+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

+ * KIND, either express or implied.  See the License for the

+ * specific language governing permissions and limitations

+ * under the License.

+ * ====================================================================

+ *

+ * This software consists of voluntary contributions made by many

+ * individuals on behalf of the Apache Software Foundation.  For more

+ * information on the Apache Software Foundation, please see

+ * <http://www.apache.org/>.

+ *

+ */

+

+package org.apache.hc.client5.http.entity;

+

+import java.io.IOException;

+import java.io.InputStream;

+

+import org.apache.hc.core5.annotation.Contract;

+import org.apache.hc.core5.annotation.ThreadingBehavior;

+

+/**

+ * {@link InputStreamFactory} for handling Deflate Content Coded responses.

+ *

+ * @since 5.0

+ */

+@Contract(threading = ThreadingBehavior.IMMUTABLE)

+public class DeflateInputStreamFactory implements InputStreamFactory {

+

+    /**

+     * Singleton instance.

+     */

+    private static final DeflateInputStreamFactory INSTANCE = new DeflateInputStreamFactory();

+

+    /**

+     * Gets the singleton instance.

+     *

+     * @return the singleton instance.

+     */

+    public static DeflateInputStreamFactory getInstance() {

+        return INSTANCE;

+    }

+

+    @Override

+    public InputStream create(final InputStream inputStream) throws IOException {

+        return new DeflateInputStream(inputStream);

+    }

+

+}

diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/entity/GZIPInputStreamFactory.java b/httpclient5/src/main/java/org/apache/hc/client5/http/entity/GZIPInputStreamFactory.java
new file mode 100644
index 0000000..44efe5b
--- /dev/null
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/entity/GZIPInputStreamFactory.java
@@ -0,0 +1,64 @@
+/*

+ * ====================================================================

+ * Licensed to the Apache Software Foundation (ASF) under one

+ * or more contributor license agreements.  See the NOTICE file

+ * distributed with this work for additional information

+ * regarding copyright ownership.  The ASF licenses this file

+ * to you under the Apache License, Version 2.0 (the

+ * "License"); you may not use this file except in compliance

+ * with the License.  You may obtain a copy of the License at

+ *

+ *   http://www.apache.org/licenses/LICENSE-2.0

+ *

+ * Unless required by applicable law or agreed to in writing,

+ * software distributed under the License is distributed on an

+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

+ * KIND, either express or implied.  See the License for the

+ * specific language governing permissions and limitations

+ * under the License.

+ * ====================================================================

+ *

+ * This software consists of voluntary contributions made by many

+ * individuals on behalf of the Apache Software Foundation.  For more

+ * information on the Apache Software Foundation, please see

+ * <http://www.apache.org/>.

+ *

+ */

+

+package org.apache.hc.client5.http.entity;

+

+import java.io.IOException;

+import java.io.InputStream;

+import java.util.zip.GZIPInputStream;

+

+import org.apache.hc.core5.annotation.Contract;

+import org.apache.hc.core5.annotation.ThreadingBehavior;

+

+/**

+ * {@link InputStreamFactory} for handling GZIPContent Coded responses.

+ *

+ * @since 5.0

+ */

+@Contract(threading = ThreadingBehavior.IMMUTABLE)

+public class GZIPInputStreamFactory implements InputStreamFactory {

+

+    /**

+     * Singleton instance.

+     */

+    private static final GZIPInputStreamFactory INSTANCE = new GZIPInputStreamFactory();

+

+    /**

+     * Gets the singleton instance.

+     *

+     * @return the singleton instance.

+     */

+    public static GZIPInputStreamFactory getInstance() {

+        return INSTANCE;

+    }

+

+    @Override

+    public InputStream create(final InputStream inputStream) throws IOException {

+        return new GZIPInputStream(inputStream);

+    }

+

+}

diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/entity/GzipDecompressingEntity.java b/httpclient5/src/main/java/org/apache/hc/client5/http/entity/GzipDecompressingEntity.java
index 07d2520..ca32f70 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/entity/GzipDecompressingEntity.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/entity/GzipDecompressingEntity.java
@@ -26,36 +26,25 @@
  */
 package org.apache.hc.client5.http.entity;
 
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.zip.GZIPInputStream;
-
 import org.apache.hc.core5.http.HttpEntity;
 
 /**
- * {@link org.apache.hc.core5.http.io.entity.HttpEntityWrapper} for handling gzip
- * Content Coded responses.
+ * {@link org.apache.hc.core5.http.io.entity.HttpEntityWrapper} for handling
+ * gzip Content Coded responses.
  *
  * @since 4.1
  */
 public class GzipDecompressingEntity extends DecompressingEntity {
 
     /**
-     * Creates a new {@link GzipDecompressingEntity} which will wrap the specified
-     * {@link HttpEntity}.
+     * Creates a new {@link GzipDecompressingEntity} which will wrap the
+     * specified {@link HttpEntity}.
      *
      * @param entity
      *            the non-null {@link HttpEntity} to be wrapped
      */
     public GzipDecompressingEntity(final HttpEntity entity) {
-        super(entity, new InputStreamFactory() {
-
-            @Override
-            public InputStream create(final InputStream instream) throws IOException {
-                return new GZIPInputStream(instream);
-            }
-
-        });
+        super(entity, GZIPInputStreamFactory.getInstance());
     }
 
 }
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/sync/ContentCompressionExec.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/sync/ContentCompressionExec.java
index 1d7086c..589bfdb 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/sync/ContentCompressionExec.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/sync/ContentCompressionExec.java
@@ -28,15 +28,14 @@
 package org.apache.hc.client5.http.impl.sync;
 
 import java.io.IOException;
-import java.io.InputStream;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Locale;
-import java.util.zip.GZIPInputStream;
 
 import org.apache.hc.client5.http.config.RequestConfig;
 import org.apache.hc.client5.http.entity.DecompressingEntity;
-import org.apache.hc.client5.http.entity.DeflateInputStream;
+import org.apache.hc.client5.http.entity.DeflateInputStreamFactory;
+import org.apache.hc.client5.http.entity.GZIPInputStreamFactory;
 import org.apache.hc.client5.http.entity.InputStreamFactory;
 import org.apache.hc.client5.http.protocol.HttpClientContext;
 import org.apache.hc.client5.http.sync.ExecChain;
@@ -68,23 +67,6 @@
 @Contract(threading = ThreadingBehavior.IMMUTABLE)
 public final class ContentCompressionExec implements ExecChainHandler {
 
-    private final static InputStreamFactory GZIP = new InputStreamFactory() {
-
-        @Override
-        public InputStream create(final InputStream instream) throws IOException {
-            return new GZIPInputStream(instream);
-        }
-    };
-
-    private final static InputStreamFactory DEFLATE = new InputStreamFactory() {
-
-        @Override
-        public InputStream create(final InputStream instream) throws IOException {
-            return new DeflateInputStream(instream);
-        }
-
-    };
-
     private final List<String> acceptEncoding;
     private final Lookup<InputStreamFactory> decoderRegistry;
     private final boolean ignoreUnknown;
@@ -96,9 +78,9 @@
         this.acceptEncoding = acceptEncoding != null ? acceptEncoding : Arrays.asList("gzip", "x-gzip", "deflate");
         this.decoderRegistry = decoderRegistry != null ? decoderRegistry :
                 RegistryBuilder.<InputStreamFactory>create()
-                        .register("gzip", GZIP)
-                        .register("x-gzip", GZIP)
-                        .register("deflate", DEFLATE)
+                        .register("gzip", GZIPInputStreamFactory.getInstance())
+                        .register("x-gzip", GZIPInputStreamFactory.getInstance())
+                        .register("deflate", DeflateInputStreamFactory.getInstance())
                         .build();
         this.ignoreUnknown = ignoreUnknown;
     }