aboutsummaryrefslogtreecommitdiff
path: root/src/share/jaxws_classes/com/sun/xml/internal/ws/util/ReadAllStream.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/share/jaxws_classes/com/sun/xml/internal/ws/util/ReadAllStream.java')
-rw-r--r--src/share/jaxws_classes/com/sun/xml/internal/ws/util/ReadAllStream.java253
1 files changed, 0 insertions, 253 deletions
diff --git a/src/share/jaxws_classes/com/sun/xml/internal/ws/util/ReadAllStream.java b/src/share/jaxws_classes/com/sun/xml/internal/ws/util/ReadAllStream.java
deleted file mode 100644
index 2e1b7a1f..00000000
--- a/src/share/jaxws_classes/com/sun/xml/internal/ws/util/ReadAllStream.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/*
- * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package com.sun.xml.internal.ws.util;
-
-import com.sun.istack.internal.NotNull;
-import com.sun.istack.internal.Nullable;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * Reads a input stream completely and creates a new stream
- * by keeping some data in memory and the rest on the file system.
- *
- * @author Jitendra Kotamraju
- */
-public class ReadAllStream extends InputStream {
-
- private final @NotNull MemoryStream memStream;
- private final @NotNull FileStream fileStream;
-
- private boolean readAll;
- private boolean closed;
-
- private static final Logger LOGGER = Logger.getLogger(ReadAllStream.class.getName());
-
- public ReadAllStream() {
- memStream = new MemoryStream();
- fileStream = new FileStream();
- }
-
- /**
- * Reads the data from input stream completely. It keeps
- * inMemory size in the memory, and the rest on the file
- * system.
- *
- * Caller's responsibility to close the InputStream. This
- * method can be called only once.
- *
- * @param in from which to be read
- * @param inMemory this much data is kept in the memory
- * @throws IOException in case of exception
- */
- public void readAll(InputStream in, long inMemory) throws IOException {
- assert !readAll;
- readAll = true;
-
- boolean eof = memStream.readAll(in, inMemory);
- if (!eof) {
- fileStream.readAll(in);
- }
- }
-
- @Override
- public int read() throws IOException {
- int ch = memStream.read();
- if (ch == -1) {
- ch = fileStream.read();
- }
- return ch;
- }
-
- @Override
- public int read(byte b[], int off, int sz) throws IOException {
- int len = memStream.read(b, off, sz);
- if (len == -1) {
- len = fileStream.read(b, off, sz);
- }
- return len;
- }
-
- @Override
- public void close() throws IOException {
- if (!closed) {
- memStream.close();
- fileStream.close();
- closed = true;
- }
- }
-
- // Keeps the rest of the data on the file system
- private static class FileStream extends InputStream {
- private @Nullable File tempFile;
- private @Nullable FileInputStream fin;
-
- void readAll(InputStream in) throws IOException {
- tempFile = File.createTempFile("jaxws",".bin");
- FileOutputStream fileOut = new FileOutputStream(tempFile);
- try {
- byte[] buf = new byte[8192];
- int len;
- while((len=in.read(buf)) != -1) {
- fileOut.write(buf, 0, len);
- }
- } finally {
- fileOut.close();
- }
- fin = new FileInputStream(tempFile);
- }
-
- @Override
- public int read() throws IOException {
- return (fin != null) ? fin.read() : -1;
- }
-
- @Override
- public int read(byte b[], int off, int sz) throws IOException {
- return (fin != null) ? fin.read(b, off, sz) : -1;
- }
-
- @Override
- public void close() throws IOException {
- if (fin != null) {
- fin.close();
- }
- if (tempFile != null) {
- boolean success = tempFile.delete();
- if (!success) {
- LOGGER.log(Level.INFO, "File {0} could not be deleted", tempFile);
- }
- }
- }
- }
-
- // Keeps data in memory until certain size
- private static class MemoryStream extends InputStream {
- private Chunk head, tail;
- private int curOff;
-
- private void add(byte[] buf, int len) {
- if (tail != null) {
- tail = tail.createNext(buf, 0, len);
- } else {
- head = tail = new Chunk(buf, 0, len);
- }
- }
-
- /**
- * Reads until the size specified
- *
- * @param in stream from which to be read
- * @param inMemory reads until this size
- * @return true if eof
- * false otherwise
- * @throws IOException in case of exception
- */
- boolean readAll(InputStream in, long inMemory) throws IOException {
- long total = 0;
- while(true) {
- byte[] buf = new byte[8192];
- int read = fill(in, buf);
- total += read;
- if (read != 0) {
- add(buf, read);
- }
- if (read != buf.length) {
- return true;
- } // EOF
- if (total > inMemory) {
- return false; // Reached in-memory size
- }
- }
- }
-
- private int fill(InputStream in, byte[] buf) throws IOException {
- int read;
- int total = 0;
- while(total < buf.length && (read=in.read(buf, total, buf.length-total)) != -1) {
- total += read;
- }
- return total;
- }
-
- @Override
- public int read() throws IOException {
- if (!fetch()) {
- return -1;
- }
- return (head.buf[curOff++] & 0xff);
- }
-
- @Override
- public int read(byte b[], int off, int sz) throws IOException {
- if (!fetch()) {
- return -1;
- }
- sz = Math.min(sz, head.len-(curOff-head.off));
- System.arraycopy(head.buf,curOff,b,off,sz);
- curOff += sz;
- return sz;
- }
-
- // if eof, return false else true
- private boolean fetch() {
- if (head == null) {
- return false;
- }
- if (curOff == head.off+head.len) {
- head = head.next;
- if (head == null) {
- return false;
- }
- curOff = head.off;
- }
- return true;
- }
-
- private static final class Chunk {
- Chunk next;
- final byte[] buf;
- final int off;
- final int len;
-
- public Chunk(byte[] buf, int off, int len) {
- this.buf = buf;
- this.off = off;
- this.len = len;
- }
-
- public Chunk createNext(byte[] buf, int off, int len) {
- return next = new Chunk(buf, off, len);
- }
- }
- }
-}