From 07aea2cbb97fd38d68f695bcf7dc99f5b6fd33bc Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Mon, 8 May 2017 16:50:54 +0000 Subject: [PATCH] [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 --- RELEASE_NOTES.txt | 8 +++ .../entity/DeflateDecompressingEntity.java | 12 +--- .../entity/DeflateInputStreamFactory.java | 63 ++++++++++++++++++ .../http/entity/GZIPInputStreamFactory.java | 64 +++++++++++++++++++ .../http/entity/GzipDecompressingEntity.java | 21 ++---- .../impl/sync/ContentCompressionExec.java | 28 ++------ 6 files changed, 146 insertions(+), 50 deletions(-) create mode 100644 httpclient5/src/main/java/org/apache/hc/client5/http/entity/DeflateInputStreamFactory.java create mode 100644 httpclient5/src/main/java/org/apache/hc/client5/http/entity/GZIPInputStreamFactory.java diff --git a/RELEASE_NOTES.txt b/RELEASE_NOTES.txt index ce8990504..dbbf0a0d7 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 + + 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 34c89cc43..3f2053636 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 @@ public class DeflateDecompressingEntity extends DecompressingEntity { * 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 000000000..82aaec51e --- /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 + * . + * + */ + +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 000000000..44efe5bd2 --- /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 + * . + * + */ + +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 07d252026..ca32f70e9 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 1d7086c93..589bfdb0a 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 @@ import org.apache.hc.core5.util.Args; @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 acceptEncoding; private final Lookup decoderRegistry; private final boolean ignoreUnknown; @@ -96,9 +78,9 @@ public final class ContentCompressionExec implements ExecChainHandler { this.acceptEncoding = acceptEncoding != null ? acceptEncoding : Arrays.asList("gzip", "x-gzip", "deflate"); this.decoderRegistry = decoderRegistry != null ? decoderRegistry : RegistryBuilder.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; }