Mercurial Hosting > luan
comparison src/org/eclipse/jetty/io/nio/DirectNIOBuffer.java @ 802:3428c60d7cfc
replace jetty jars with source
| author | Franklin Schmidt <fschmidt@gmail.com> |
|---|---|
| date | Wed, 07 Sep 2016 21:15:48 -0600 |
| parents | |
| children | 8e9db0bbf4f9 |
comparison
equal
deleted
inserted
replaced
| 801:6a21393191c1 | 802:3428c60d7cfc |
|---|---|
| 1 // | |
| 2 // ======================================================================== | |
| 3 // Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd. | |
| 4 // ------------------------------------------------------------------------ | |
| 5 // All rights reserved. This program and the accompanying materials | |
| 6 // are made available under the terms of the Eclipse Public License v1.0 | |
| 7 // and Apache License v2.0 which accompanies this distribution. | |
| 8 // | |
| 9 // The Eclipse Public License is available at | |
| 10 // http://www.eclipse.org/legal/epl-v10.html | |
| 11 // | |
| 12 // The Apache License v2.0 is available at | |
| 13 // http://www.opensource.org/licenses/apache2.0.php | |
| 14 // | |
| 15 // You may elect to redistribute this code under either of these licenses. | |
| 16 // ======================================================================== | |
| 17 // | |
| 18 | |
| 19 package org.eclipse.jetty.io.nio; | |
| 20 | |
| 21 import java.io.File; | |
| 22 import java.io.FileInputStream; | |
| 23 import java.io.IOException; | |
| 24 import java.io.InputStream; | |
| 25 import java.io.OutputStream; | |
| 26 import java.nio.ByteBuffer; | |
| 27 import java.nio.channels.Channels; | |
| 28 import java.nio.channels.FileChannel; | |
| 29 import java.nio.channels.ReadableByteChannel; | |
| 30 import java.nio.channels.WritableByteChannel; | |
| 31 | |
| 32 import org.eclipse.jetty.io.AbstractBuffer; | |
| 33 import org.eclipse.jetty.io.Buffer; | |
| 34 import org.eclipse.jetty.util.IO; | |
| 35 import org.eclipse.jetty.util.log.Log; | |
| 36 import org.eclipse.jetty.util.log.Logger; | |
| 37 | |
| 38 /* ------------------------------------------------------------------------------- */ | |
| 39 /** | |
| 40 * | |
| 41 * | |
| 42 */ | |
| 43 public class DirectNIOBuffer extends AbstractBuffer implements NIOBuffer | |
| 44 { | |
| 45 private static final Logger LOG = Log.getLogger(DirectNIOBuffer.class); | |
| 46 | |
| 47 protected final ByteBuffer _buf; | |
| 48 private ReadableByteChannel _in; | |
| 49 private InputStream _inStream; | |
| 50 private WritableByteChannel _out; | |
| 51 private OutputStream _outStream; | |
| 52 | |
| 53 public DirectNIOBuffer(int size) | |
| 54 { | |
| 55 super(READWRITE,NON_VOLATILE); | |
| 56 _buf = ByteBuffer.allocateDirect(size); | |
| 57 _buf.position(0); | |
| 58 _buf.limit(_buf.capacity()); | |
| 59 } | |
| 60 | |
| 61 public DirectNIOBuffer(ByteBuffer buffer,boolean immutable) | |
| 62 { | |
| 63 super(immutable?IMMUTABLE:READWRITE,NON_VOLATILE); | |
| 64 if (!buffer.isDirect()) | |
| 65 throw new IllegalArgumentException(); | |
| 66 _buf = buffer; | |
| 67 setGetIndex(buffer.position()); | |
| 68 setPutIndex(buffer.limit()); | |
| 69 } | |
| 70 | |
| 71 /** | |
| 72 * @param file | |
| 73 */ | |
| 74 public DirectNIOBuffer(File file) throws IOException | |
| 75 { | |
| 76 super(READONLY,NON_VOLATILE); | |
| 77 FileInputStream fis = null; | |
| 78 FileChannel fc = null; | |
| 79 try | |
| 80 { | |
| 81 fis = new FileInputStream(file); | |
| 82 fc = fis.getChannel(); | |
| 83 _buf = fc.map(FileChannel.MapMode.READ_ONLY, 0, file.length()); | |
| 84 setGetIndex(0); | |
| 85 setPutIndex((int)file.length()); | |
| 86 _access=IMMUTABLE; | |
| 87 } | |
| 88 finally | |
| 89 { | |
| 90 if (fc != null) try {fc.close();} catch (IOException e){LOG.ignore(e);} | |
| 91 IO.close(fis); | |
| 92 } | |
| 93 } | |
| 94 | |
| 95 /* ------------------------------------------------------------ */ | |
| 96 public boolean isDirect() | |
| 97 { | |
| 98 return true; | |
| 99 } | |
| 100 | |
| 101 /* ------------------------------------------------------------ */ | |
| 102 public byte[] array() | |
| 103 { | |
| 104 return null; | |
| 105 } | |
| 106 | |
| 107 /* ------------------------------------------------------------ */ | |
| 108 public int capacity() | |
| 109 { | |
| 110 return _buf.capacity(); | |
| 111 } | |
| 112 | |
| 113 /* ------------------------------------------------------------ */ | |
| 114 public byte peek(int position) | |
| 115 { | |
| 116 return _buf.get(position); | |
| 117 } | |
| 118 | |
| 119 public int peek(int index, byte[] b, int offset, int length) | |
| 120 { | |
| 121 int l = length; | |
| 122 if (index+l > capacity()) | |
| 123 { | |
| 124 l=capacity()-index; | |
| 125 if (l==0) | |
| 126 return -1; | |
| 127 } | |
| 128 | |
| 129 if (l < 0) | |
| 130 return -1; | |
| 131 try | |
| 132 { | |
| 133 _buf.position(index); | |
| 134 _buf.get(b,offset,l); | |
| 135 } | |
| 136 finally | |
| 137 { | |
| 138 _buf.position(0); | |
| 139 } | |
| 140 | |
| 141 return l; | |
| 142 } | |
| 143 | |
| 144 public void poke(int index, byte b) | |
| 145 { | |
| 146 if (isReadOnly()) throw new IllegalStateException(__READONLY); | |
| 147 if (index < 0) throw new IllegalArgumentException("index<0: " + index + "<0"); | |
| 148 if (index > capacity()) | |
| 149 throw new IllegalArgumentException("index>capacity(): " + index + ">" + capacity()); | |
| 150 _buf.put(index,b); | |
| 151 } | |
| 152 | |
| 153 @Override | |
| 154 public int poke(int index, Buffer src) | |
| 155 { | |
| 156 if (isReadOnly()) throw new IllegalStateException(__READONLY); | |
| 157 | |
| 158 byte[] array=src.array(); | |
| 159 if (array!=null) | |
| 160 { | |
| 161 return poke(index,array,src.getIndex(),src.length()); | |
| 162 } | |
| 163 else | |
| 164 { | |
| 165 Buffer src_buf=src.buffer(); | |
| 166 if (src_buf instanceof DirectNIOBuffer) | |
| 167 { | |
| 168 ByteBuffer src_bytebuf = ((DirectNIOBuffer)src_buf)._buf; | |
| 169 if (src_bytebuf==_buf) | |
| 170 src_bytebuf=_buf.duplicate(); | |
| 171 try | |
| 172 { | |
| 173 _buf.position(index); | |
| 174 int space = _buf.remaining(); | |
| 175 | |
| 176 int length=src.length(); | |
| 177 if (length>space) | |
| 178 length=space; | |
| 179 | |
| 180 src_bytebuf.position(src.getIndex()); | |
| 181 src_bytebuf.limit(src.getIndex()+length); | |
| 182 | |
| 183 _buf.put(src_bytebuf); | |
| 184 return length; | |
| 185 } | |
| 186 finally | |
| 187 { | |
| 188 _buf.position(0); | |
| 189 src_bytebuf.limit(src_bytebuf.capacity()); | |
| 190 src_bytebuf.position(0); | |
| 191 } | |
| 192 } | |
| 193 else | |
| 194 return super.poke(index,src); | |
| 195 } | |
| 196 } | |
| 197 | |
| 198 @Override | |
| 199 public int poke(int index, byte[] b, int offset, int length) | |
| 200 { | |
| 201 if (isReadOnly()) throw new IllegalStateException(__READONLY); | |
| 202 | |
| 203 if (index < 0) throw new IllegalArgumentException("index<0: " + index + "<0"); | |
| 204 | |
| 205 if (index + length > capacity()) | |
| 206 { | |
| 207 length=capacity()-index; | |
| 208 if (length<0) | |
| 209 throw new IllegalArgumentException("index>capacity(): " + index + ">" + capacity()); | |
| 210 } | |
| 211 | |
| 212 try | |
| 213 { | |
| 214 _buf.position(index); | |
| 215 | |
| 216 int space=_buf.remaining(); | |
| 217 | |
| 218 if (length>space) | |
| 219 length=space; | |
| 220 if (length>0) | |
| 221 _buf.put(b,offset,length); | |
| 222 return length; | |
| 223 } | |
| 224 finally | |
| 225 { | |
| 226 _buf.position(0); | |
| 227 } | |
| 228 } | |
| 229 | |
| 230 /* ------------------------------------------------------------ */ | |
| 231 public ByteBuffer getByteBuffer() | |
| 232 { | |
| 233 return _buf; | |
| 234 } | |
| 235 | |
| 236 /* ------------------------------------------------------------ */ | |
| 237 @Override | |
| 238 public int readFrom(InputStream in, int max) throws IOException | |
| 239 { | |
| 240 if (_in==null || !_in.isOpen() || in!=_inStream) | |
| 241 { | |
| 242 _in=Channels.newChannel(in); | |
| 243 _inStream=in; | |
| 244 } | |
| 245 | |
| 246 if (max<0 || max>space()) | |
| 247 max=space(); | |
| 248 int p = putIndex(); | |
| 249 | |
| 250 try | |
| 251 { | |
| 252 int len=0, total=0, available=max; | |
| 253 int loop=0; | |
| 254 while (total<max) | |
| 255 { | |
| 256 _buf.position(p); | |
| 257 _buf.limit(p+available); | |
| 258 len=_in.read(_buf); | |
| 259 if (len<0) | |
| 260 { | |
| 261 _in=null; | |
| 262 _inStream=in; | |
| 263 break; | |
| 264 } | |
| 265 else if (len>0) | |
| 266 { | |
| 267 p += len; | |
| 268 total += len; | |
| 269 available -= len; | |
| 270 setPutIndex(p); | |
| 271 loop=0; | |
| 272 } | |
| 273 else if (loop++>1) | |
| 274 break; | |
| 275 if (in.available()<=0) | |
| 276 break; | |
| 277 } | |
| 278 if (len<0 && total==0) | |
| 279 return -1; | |
| 280 return total; | |
| 281 | |
| 282 } | |
| 283 catch(IOException e) | |
| 284 { | |
| 285 _in=null; | |
| 286 _inStream=in; | |
| 287 throw e; | |
| 288 } | |
| 289 finally | |
| 290 { | |
| 291 if (_in!=null && !_in.isOpen()) | |
| 292 { | |
| 293 _in=null; | |
| 294 _inStream=in; | |
| 295 } | |
| 296 _buf.position(0); | |
| 297 _buf.limit(_buf.capacity()); | |
| 298 } | |
| 299 } | |
| 300 | |
| 301 /* ------------------------------------------------------------ */ | |
| 302 @Override | |
| 303 public void writeTo(OutputStream out) throws IOException | |
| 304 { | |
| 305 if (_out==null || !_out.isOpen() || out!=_outStream) | |
| 306 { | |
| 307 _out=Channels.newChannel(out); | |
| 308 _outStream=out; | |
| 309 } | |
| 310 | |
| 311 synchronized (_buf) | |
| 312 { | |
| 313 try | |
| 314 { | |
| 315 int loop=0; | |
| 316 while(hasContent() && _out.isOpen()) | |
| 317 { | |
| 318 _buf.position(getIndex()); | |
| 319 _buf.limit(putIndex()); | |
| 320 int len=_out.write(_buf); | |
| 321 if (len<0) | |
| 322 break; | |
| 323 else if (len>0) | |
| 324 { | |
| 325 skip(len); | |
| 326 loop=0; | |
| 327 } | |
| 328 else if (loop++>1) | |
| 329 break; | |
| 330 } | |
| 331 | |
| 332 } | |
| 333 catch(IOException e) | |
| 334 { | |
| 335 _out=null; | |
| 336 _outStream=null; | |
| 337 throw e; | |
| 338 } | |
| 339 finally | |
| 340 { | |
| 341 if (_out!=null && !_out.isOpen()) | |
| 342 { | |
| 343 _out=null; | |
| 344 _outStream=null; | |
| 345 } | |
| 346 _buf.position(0); | |
| 347 _buf.limit(_buf.capacity()); | |
| 348 } | |
| 349 } | |
| 350 } | |
| 351 | |
| 352 | |
| 353 | |
| 354 } |
