X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Futils%2FReplaceInputStream.java;h=a456463b79032585a1c6372656265c4f089495c6;hb=eeaa5ebc0ebe6ffd860273ed6727024737085a25;hp=5ce9ef32d3692619c4018cc1a26c25ef69e0a070;hpb=6ef54b36380b9d123bbdb6b4056cf64b7489225e;p=nikiroo-utils.git diff --git a/src/be/nikiroo/utils/ReplaceInputStream.java b/src/be/nikiroo/utils/ReplaceInputStream.java index 5ce9ef3..a456463 100644 --- a/src/be/nikiroo/utils/ReplaceInputStream.java +++ b/src/be/nikiroo/utils/ReplaceInputStream.java @@ -4,6 +4,12 @@ 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. + * + * @author niki + */ public class ReplaceInputStream extends BufferedInputStream { private byte[] from; private byte[] to; @@ -12,10 +18,32 @@ public class ReplaceInputStream extends BufferedInputStream { private int spos; private int slen; + /** + * Create a {@link ReplaceInputStream} that will replace from with + * to. + * + * @param in + * the under-laying {@link InputStream} + * @param from + * the {@link String} to replace + * @param to + * the {@link String} to replace with + */ public ReplaceInputStream(InputStream in, String from, String to) { this(in, bytes(from), bytes(to)); } + /** + * Create a {@link ReplaceInputStream} that will replace from with + * to. + * + * @param in + * the under-laying {@link InputStream} + * @param from + * the value to replace + * @param to + * the value to replace with + */ public ReplaceInputStream(InputStream in, byte[] from, byte[] to) { super(in); this.from = from; @@ -28,9 +56,9 @@ public class ReplaceInputStream extends BufferedInputStream { @Override protected int read(InputStream in, byte[] buffer) throws IOException { - if (buffer.length < to.length) { + if (buffer.length < to.length || source.length < to.length * 2) { throw new IOException( - "Underlaying buffer is too small to contain the replace String"); + "An underlaying buffer is too small for this replace value"); } if (spos >= slen) { @@ -40,22 +68,27 @@ public class ReplaceInputStream extends BufferedInputStream { // Note: very simple, not efficient implementation, sorry. int count = 0; - int i = spos; - while (i < slen && count < buffer.length - to.length) { - if (from.length > 0 && startsWith(from, source, spos)) { + 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; - i += to.length; - spos += to.length; + spos += from.length; } else { - buffer[count++] = source[i++]; - spos++; + 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");