X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Futils%2Fstreams%2FReplaceInputStream.java;h=eea3a1ab9b74b42158d5b40e565b59c839cb690a;hb=627f866e6cd474bd7494750dc3846c5ad898f2ec;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..eea3a1a 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; @@ -56,9 +102,9 @@ 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) { + if (buffer.length < 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 +114,27 @@ 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 { + while (spos < slen && count < buffer.length - 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, spos, tos[i].length); + count += tos[i].length; + } + + spos += froms[i].length; + replaced = true; + break; + } + } + + if (!replaced) { buffer[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; - } - } }