1 /*
2 * ====================================================================
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 * ====================================================================
20 *
21 * This software consists of voluntary contributions made by many
22 * individuals on behalf of the Apache Software Foundation. For more
23 * information on the Apache Software Foundation, please see
24 * <http://www.apache.org/>.
25 *
26 */
27
28 package org.apache.http.nio.entity;
29
30 import java.io.IOException;
31 import java.io.InputStream;
32 import java.io.OutputStream;
33 import java.nio.ByteBuffer;
34 import java.nio.channels.Channels;
35 import java.nio.channels.ReadableByteChannel;
36
37 import org.apache.http.HttpEntity;
38 import org.apache.http.annotation.NotThreadSafe;
39 import org.apache.http.entity.HttpEntityWrapper;
40 import org.apache.http.nio.ContentEncoder;
41 import org.apache.http.nio.IOControl;
42
43 /**
44 * {@link ProducingNHttpEntity} compatibility adaptor for blocking HTTP
45 * entities.
46 *
47 * @since 4.0
48 *
49 * @deprecated (4.2) use {@link EntityAsyncContentProducer}
50 */
51 @NotThreadSafe
52 @Deprecated
53 public class NHttpEntityWrapper
54 extends HttpEntityWrapper implements ProducingNHttpEntity {
55
56 private final ReadableByteChannel channel;
57 private final ByteBuffer buffer;
58
59 public NHttpEntityWrapper(final HttpEntity httpEntity) throws IOException {
60 super(httpEntity);
61 this.channel = Channels.newChannel(httpEntity.getContent());
62 this.buffer = ByteBuffer.allocate(4096);
63 }
64
65 /**
66 * This method throws {@link UnsupportedOperationException}.
67 */
68 @Override
69 public InputStream getContent() throws IOException, UnsupportedOperationException {
70 throw new UnsupportedOperationException("Does not support blocking methods");
71 }
72
73 @Override
74 public boolean isStreaming() {
75 return true;
76 }
77
78 /**
79 * This method throws {@link UnsupportedOperationException}.
80 */
81 @Override
82 public void writeTo(OutputStream out) throws IOException, UnsupportedOperationException {
83 throw new UnsupportedOperationException("Does not support blocking methods");
84 }
85
86 /**
87 * This method is equivalent to the {@link #finish()} method.
88 * <br/>
89 * TODO: The name of this method is misnomer. It will be renamed to
90 * #finish() in the next major release.
91 */
92 @Override
93 public void consumeContent() throws IOException {
94 finish();
95 }
96
97 public void produceContent(
98 final ContentEncoder encoder,
99 final IOControl ioctrl) throws IOException {
100 int i = this.channel.read(this.buffer);
101 this.buffer.flip();
102 encoder.write(this.buffer);
103 boolean buffering = this.buffer.hasRemaining();
104 this.buffer.compact();
105 if (i == -1 && !buffering) {
106 encoder.complete();
107 this.channel.close();
108 }
109 }
110
111 public void finish() {
112 try {
113 this.channel.close();
114 } catch (IOException ignore) {
115 }
116 }
117
118 }