X-Git-Url: https://git.nikiroo.be/?a=blobdiff_plain;ds=inline;f=src%2Fbe%2Fnikiroo%2Futils%2Fstreams%2FReplaceInputStream.java;h=b2187af09ce189dae52105733c10559f0db4aff0;hb=f743f2ca02a518a7e91ee6376bff28c68977f8da;hp=5eac0b448fef0262b9f2ded53a4c199a2c41d0b7;hpb=8e76f6ab13a8a4a651f2518b6c91d5e6424c7922;p=nikiroo-utils.git diff --git a/src/be/nikiroo/utils/streams/ReplaceInputStream.java b/src/be/nikiroo/utils/streams/ReplaceInputStream.java index 5eac0b4..b2187af 100644 --- a/src/be/nikiroo/utils/streams/ReplaceInputStream.java +++ b/src/be/nikiroo/utils/streams/ReplaceInputStream.java @@ -2,17 +2,17 @@ package be.nikiroo.utils.streams; import java.io.IOException; import java.io.InputStream; -import java.io.UnsupportedEncodingException; /** - * This {@link InputStream} will replace some of its content by replacing it - * with something else. + * This {@link InputStream} will change some of its content by replacing it with + * something else. * * @author niki */ public class ReplaceInputStream extends BufferedInputStream { - private byte[] from; - private byte[] to; + private byte[][] froms; + private byte[][] tos; + private int maxToSize; private byte[] source; private int spos; @@ -30,7 +30,7 @@ public class ReplaceInputStream extends BufferedInputStream { * the {@link String} to replace with */ public ReplaceInputStream(InputStream in, String from, String to) { - this(in, bytes(from), bytes(to)); + this(in, StreamUtils.bytes(from), StreamUtils.bytes(to)); } /** @@ -45,9 +45,55 @@ public class ReplaceInputStream extends BufferedInputStream { * the value to replace with */ public ReplaceInputStream(InputStream in, byte[] from, byte[] to) { + this(in, new byte[][] { from }, new byte[][] { to }); + } + + /** + * Create a {@link ReplaceInputStream} that will replace all froms + * with tos. + *
+ * Note that they will be replaced in order, and that for each from + * a to must correspond. + * + * @param in + * the under-laying {@link InputStream} + * @param froms + * the values to replace + * @param tos + * the values to replace with + */ + public ReplaceInputStream(InputStream in, String[] froms, String[] tos) { + this(in, StreamUtils.bytes(froms), StreamUtils.bytes(tos)); + } + + /** + * Create a {@link ReplaceInputStream} that will replace all froms + * with tos. + *
+ * Note that they will be replaced in order, and that for each from + * a to must correspond. + * + * @param in + * the under-laying {@link InputStream} + * @param froms + * the values to replace + * @param tos + * the values to replace with + */ + public ReplaceInputStream(InputStream in, byte[][] froms, byte[][] tos) { super(in); - this.from = from; - this.to = to; + + if (froms.length != tos.length) { + throw new IllegalArgumentException( + "For replacing, each FROM must have a corresponding TO"); + } + + this.froms = froms; + this.tos = tos; + + for (int i = 0; i < tos.length; i++) { + maxToSize = Math.max(maxToSize, tos[i].length); + } source = new byte[4096]; spos = 0; @@ -55,10 +101,11 @@ public class ReplaceInputStream extends BufferedInputStream { } @Override - protected int read(InputStream in, byte[] buffer) throws IOException { - if (buffer.length < to.length || source.length < to.length * 2) { + protected int read(InputStream in, byte[] buffer, int off, int len) + throws IOException { + if (len < maxToSize || source.length < maxToSize * 2) { throw new IOException( - "An underlaying buffer is too small for this replace value"); + "An underlaying buffer is too small for these replace values"); } if (spos >= slen) { @@ -68,34 +115,28 @@ public class ReplaceInputStream extends BufferedInputStream { // Note: very simple, not efficient implementation, sorry. int count = 0; - while (spos < slen && count < buffer.length - to.length) { - if (from.length > 0 && startsWith(from, source, spos, slen)) { - System.arraycopy(to, 0, buffer, spos, to.length); - count += to.length; - spos += from.length; - } else { - buffer[count++] = source[spos++]; + while (spos < slen && count < len - maxToSize) { + boolean replaced = false; + for (int i = 0; i < froms.length; i++) { + if (froms[i] != null && froms[i].length > 0 + && StreamUtils.startsWith(froms[i], source, spos, slen)) { + if (tos[i] != null && tos[i].length > 0) { + System.arraycopy(tos[i], 0, buffer, off + spos, + tos[i].length); + count += tos[i].length; + } + + spos += froms[i].length; + replaced = true; + break; + } + } + + if (!replaced) { + buffer[off + count++] = source[spos++]; } } return count; } - - /** - * Return the bytes array representation of the given {@link String} in - * UTF-8. - * - * @param str - * the string to transform into bytes - * @return the content in bytes - */ - static private byte[] bytes(String str) { - try { - return str.getBytes("UTF-8"); - } catch (UnsupportedEncodingException e) { - // All conforming JVM must support UTF-8 - e.printStackTrace(); - return null; - } - } }