Search in sources :

Example 1 with BytePatternNotFoundException

use of org.apache.nifi.stream.io.exception.BytePatternNotFoundException in project nifi by apache.

the class StreamUtils method copyExclusive.

/**
 * Copies data from in to out until either we are out of data (returns null) or we hit one of the byte patterns identified by the <code>stoppers</code> parameter (returns the byte pattern
 * matched). The byte pattern matched will NOT be copied to the output and will be un-read from the input.
 *
 * @param in the source to read bytes from
 * @param out the destination to write bytes to
 * @param maxBytes the maximum number of bytes to copy
 * @param stoppers byte patterns which will cause the copy to stop if found
 * @return the byte array matched, or null if end of stream was reached
 * @throws IOException for issues reading or writing to underlying streams
 */
public static byte[] copyExclusive(final InputStream in, final OutputStream out, final int maxBytes, final byte[]... stoppers) throws IOException {
    if (stoppers.length == 0) {
        return null;
    }
    int longest = 0;
    NonThreadSafeCircularBuffer longestBuffer = null;
    final List<NonThreadSafeCircularBuffer> circularBuffers = new ArrayList<>();
    for (final byte[] stopper : stoppers) {
        final NonThreadSafeCircularBuffer circularBuffer = new NonThreadSafeCircularBuffer(stopper);
        if (stopper.length > longest) {
            longest = stopper.length;
            longestBuffer = circularBuffer;
            circularBuffers.add(0, circularBuffer);
        } else {
            circularBuffers.add(circularBuffer);
        }
    }
    long bytesRead = 0;
    while (true) {
        final int next = in.read();
        if (next == -1) {
            return null;
        } else if (maxBytes > 0 && bytesRead++ > maxBytes) {
            throw new BytePatternNotFoundException("Did not encounter any byte pattern that was expected; data does not appear to be in the expected format");
        }
        for (final NonThreadSafeCircularBuffer circ : circularBuffers) {
            if (circ.addAndCompare((byte) next)) {
                // The longest buffer has some data that may not have been written out yet; we need to make sure
                // that we copy out those bytes.
                final int bytesToCopy = longest - circ.getByteArray().length;
                for (int i = 0; i < bytesToCopy; i++) {
                    final int oldestByte = longestBuffer.getOldestByte();
                    if (oldestByte != -1) {
                        out.write(oldestByte);
                        longestBuffer.addAndCompare((byte) 0);
                    }
                }
                return circ.getByteArray();
            }
        }
        if (longestBuffer.isFilled()) {
            out.write(longestBuffer.getOldestByte());
        }
    }
}
Also used : NonThreadSafeCircularBuffer(org.apache.nifi.stream.io.util.NonThreadSafeCircularBuffer) BytePatternNotFoundException(org.apache.nifi.stream.io.exception.BytePatternNotFoundException) ArrayList(java.util.ArrayList)

Example 2 with BytePatternNotFoundException

use of org.apache.nifi.stream.io.exception.BytePatternNotFoundException in project nifi by apache.

the class StreamUtils method copyInclusive.

/**
 * Copies data from in to out until either we are out of data (returns null) or we hit one of the byte patterns identified by the <code>stoppers</code> parameter (returns the byte pattern
 * matched). The bytes in the stopper will be copied.
 *
 * @param in the source to read bytes from
 * @param out the destination to write bytes to
 * @param maxBytes the max bytes to copy
 * @param stoppers patterns of bytes which if seen will cause the copy to stop
 * @return the byte array matched, or null if end of stream was reached
 * @throws IOException if issues occur reading or writing bytes to the underlying streams
 */
public static byte[] copyInclusive(final InputStream in, final OutputStream out, final int maxBytes, final byte[]... stoppers) throws IOException {
    if (stoppers.length == 0) {
        return null;
    }
    final List<NonThreadSafeCircularBuffer> circularBuffers = new ArrayList<>();
    for (final byte[] stopper : stoppers) {
        circularBuffers.add(new NonThreadSafeCircularBuffer(stopper));
    }
    long bytesRead = 0;
    while (true) {
        final int next = in.read();
        if (next == -1) {
            return null;
        } else if (maxBytes > 0 && ++bytesRead >= maxBytes) {
            throw new BytePatternNotFoundException("Did not encounter any byte pattern that was expected; data does not appear to be in the expected format");
        }
        out.write(next);
        for (final NonThreadSafeCircularBuffer circ : circularBuffers) {
            if (circ.addAndCompare((byte) next)) {
                return circ.getByteArray();
            }
        }
    }
}
Also used : NonThreadSafeCircularBuffer(org.apache.nifi.stream.io.util.NonThreadSafeCircularBuffer) BytePatternNotFoundException(org.apache.nifi.stream.io.exception.BytePatternNotFoundException) ArrayList(java.util.ArrayList)

Aggregations

ArrayList (java.util.ArrayList)2 BytePatternNotFoundException (org.apache.nifi.stream.io.exception.BytePatternNotFoundException)2 NonThreadSafeCircularBuffer (org.apache.nifi.stream.io.util.NonThreadSafeCircularBuffer)2