You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ol...@apache.org on 2015/08/30 12:21:41 UTC

svn commit: r1700104 - in /httpcomponents/httpcore/trunk/httpcore/src: main/java/org/apache/http/entity/ByteBufferEntity.java test/java/org/apache/http/entity/TestByteBufferEntity.java

Author: olegk
Date: Sun Aug 30 10:21:41 2015
New Revision: 1700104

URL: http://svn.apache.org/r1700104
Log:
HTTPCORE-407: Add a ByteBufferEntity.

Added:
    httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/entity/ByteBufferEntity.java   (with props)
    httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/entity/TestByteBufferEntity.java   (with props)

Added: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/entity/ByteBufferEntity.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/entity/ByteBufferEntity.java?rev=1700104&view=auto
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/entity/ByteBufferEntity.java (added)
+++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/entity/ByteBufferEntity.java Sun Aug 30 10:21:41 2015
@@ -0,0 +1,117 @@
+/*
+ * ====================================================================
+ * 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.http.entity;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.ByteBuffer;
+import java.nio.channels.Channels;
+import java.nio.channels.WritableByteChannel;
+
+import org.apache.http.annotation.NotThreadSafe;
+import org.apache.http.util.Args;
+
+/**
+ * An entity that delivers the contents of a {@link ByteBuffer}.
+ */
+@NotThreadSafe
+public class ByteBufferEntity extends AbstractHttpEntity implements Cloneable {
+
+    private final ByteBuffer buffer;
+
+    private class ByteBufferInputStream extends InputStream {
+
+        ByteBufferInputStream() {
+            buffer.position(0);
+        }
+
+        public int read() throws IOException {
+            if (!buffer.hasRemaining()) {
+                return -1;
+            }
+            return buffer.get() & 0xFF;
+        }
+
+        public int read(final byte[] bytes, final int off, final int len) throws IOException {
+            if (!buffer.hasRemaining()) {
+                return -1;
+            }
+
+            final int chunk = Math.min(len, buffer.remaining());
+            buffer.get(bytes, off, chunk);
+            return chunk;
+        }
+    }
+
+    public ByteBufferEntity(final ByteBuffer buffer, final ContentType contentType) {
+        super();
+        Args.notNull(buffer, "Source byte buffer");
+        this.buffer = buffer;
+        if (contentType != null) {
+            setContentType(contentType.toString());
+        }
+    }
+
+    public ByteBufferEntity(final ByteBuffer buffer) {
+        this(buffer, null);
+    }
+
+    @Override
+    public boolean isRepeatable() {
+        return true;
+    }
+
+    @Override
+    public long getContentLength() {
+        return buffer.capacity();
+    }
+
+    @Override
+    public InputStream getContent() throws IOException, UnsupportedOperationException {
+        return new ByteBufferInputStream();
+    }
+
+    @Override
+    public void writeTo(final OutputStream outstream) throws IOException {
+        Args.notNull(outstream, "Output stream");
+        final WritableByteChannel channel = Channels.newChannel(outstream);
+        channel.write(buffer);
+        outstream.flush();
+    }
+
+    @Override
+    public boolean isStreaming() {
+        return false;
+    }
+
+    @Override
+    public Object clone() throws CloneNotSupportedException {
+        return super.clone();
+    }
+}

Propchange: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/entity/ByteBufferEntity.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/entity/ByteBufferEntity.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/entity/ByteBufferEntity.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/entity/TestByteBufferEntity.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/entity/TestByteBufferEntity.java?rev=1700104&view=auto
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/entity/TestByteBufferEntity.java (added)
+++ httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/entity/TestByteBufferEntity.java Sun Aug 30 10:21:41 2015
@@ -0,0 +1,92 @@
+/*
+ * ====================================================================
+ * 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.http.entity;
+
+import org.apache.http.Consts;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.ByteArrayOutputStream;
+import java.nio.ByteBuffer;
+
+/**
+ * Unit tests for {@link ByteBufferEntity}.
+ *
+ */
+public class TestByteBufferEntity {
+
+    @Test
+    public void testBasics() throws Exception {
+        final ByteBuffer bytes = ByteBuffer.wrap("Message content".getBytes(Consts.ASCII));
+        final ByteBufferEntity httpentity = new ByteBufferEntity(bytes);
+
+        Assert.assertEquals(bytes.capacity(), httpentity.getContentLength());
+        Assert.assertNotNull(httpentity.getContent());
+        Assert.assertTrue(httpentity.isRepeatable());
+        Assert.assertFalse(httpentity.isStreaming());
+    }
+
+
+    @Test(expected=IllegalArgumentException.class)
+    public void testIllegalConstructorNullByteArray() throws Exception {
+        new ByteBufferEntity(null);
+    }
+
+    @Test
+    public void testWriteTo() throws Exception {
+        final ByteBuffer bytes = ByteBuffer.wrap("Message content".getBytes(Consts.ASCII));
+        final ByteBufferEntity httpentity = new ByteBufferEntity(bytes);
+
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        httpentity.writeTo(out);
+        byte[] bytes2 = out.toByteArray();
+        Assert.assertNotNull(bytes2);
+        Assert.assertEquals(bytes.capacity(), bytes2.length);
+        bytes.position(0);
+        for (int i = 0; i < bytes2.length; i++) {
+            Assert.assertEquals(bytes.get(i), bytes2[i]);
+        }
+
+        out = new ByteArrayOutputStream();
+        httpentity.writeTo(out);
+        bytes2 = out.toByteArray();
+        Assert.assertNotNull(bytes2);
+        Assert.assertEquals(bytes.capacity(), bytes2.length);
+        bytes.position(0);
+        for (int i = 0; i < bytes.capacity(); i++) {
+            Assert.assertEquals(bytes.get(i), bytes2[i]);
+        }
+
+        try {
+            httpentity.writeTo(null);
+            Assert.fail("IllegalArgumentException should have been thrown");
+        } catch (final IllegalArgumentException ex) {
+            // expected
+        }
+    }
+}

Propchange: httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/entity/TestByteBufferEntity.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/entity/TestByteBufferEntity.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/entity/TestByteBufferEntity.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain