diff --git a/.classpath b/.classpath index 91cacf2..bf3673e 100644 --- a/.classpath +++ b/.classpath @@ -9,7 +9,7 @@ - + diff --git a/src/zutil/io/StringInputStream.java b/src/zutil/io/StringInputStream.java index 5d41f3f..63cfd43 100644 --- a/src/zutil/io/StringInputStream.java +++ b/src/zutil/io/StringInputStream.java @@ -40,6 +40,11 @@ public class StringInputStream extends InputStream{ clear(); } + public StringInputStream(String data) { + clear(); + add(data); + } + /** * Returns an estimate of the number of bytes * that can be read (or skipped over) from this diff --git a/src/zutil/net/torrent/TorrentMetainfo.java b/src/zutil/net/torrent/TorrentMetainfo.java index c860207..f3454f4 100644 --- a/src/zutil/net/torrent/TorrentMetainfo.java +++ b/src/zutil/net/torrent/TorrentMetainfo.java @@ -70,7 +70,7 @@ public class TorrentMetainfo { private void decode(String data){ - DataNode metainfo = BEncodedParser.parse(data); + DataNode metainfo = BEncodedParser.read(data); // Main values announce = metainfo.getString("announce"); diff --git a/src/zutil/net/torrent/TorrentTracker.java b/src/zutil/net/torrent/TorrentTracker.java index da42cbe..c05b521 100644 --- a/src/zutil/net/torrent/TorrentTracker.java +++ b/src/zutil/net/torrent/TorrentTracker.java @@ -38,7 +38,7 @@ public class TorrentTracker { private URL trackerURL; - + // TODO: incomplete public void update() throws IOException { HttpClient request = HttpClient.GET(); request.setURL( trackerURL ); diff --git a/src/zutil/parser/BBCodeParser.java b/src/zutil/parser/BBCodeParser.java index 4888df2..a687622 100644 --- a/src/zutil/parser/BBCodeParser.java +++ b/src/zutil/parser/BBCodeParser.java @@ -23,6 +23,8 @@ package zutil.parser; import java.util.HashMap; +import zutil.struct.MutableInt; + /** * Parses BBCode and replaces them with the corresponding HTML. * @@ -32,15 +34,6 @@ public class BBCodeParser { /** Contains all the BBCodes and the corresponding HTML **/ private HashMap bbcodes; - public static void main(String[] args){ - BBCodeParser parser = new BBCodeParser(); - System.out.println(parser.parse("jshdkj [u]lol [apa]lol[/apa]")); - System.out.println(parser.parse("jshdkj [m]lol[/k] [i]lol[/i]")); - System.out.println(parser.parse("jshdkj [m")); - System.out.println(parser.parse("jshdkj [/m")); - System.out.println(parser.parse("jshdkj m]")); - System.out.println(parser.parse("jshdkj
")); - } /** * Initiates a instance of the parser with the most used BBCodes. @@ -86,20 +79,20 @@ public class BBCodeParser { * @param text is a String with BBCode * @return a String where all BBCode has been replaced by HTML */ - public String parse(String text){ + public String read(String text){ StringBuilder out = new StringBuilder(); StringBuilder t = new StringBuilder(text); - parse(t, out, ""); + read(new MutableInt(), t, out, ""); return out.toString(); } - private void parse(StringBuilder text, StringBuilder out, String rootBBC){ + private void read(MutableInt index, StringBuilder text, StringBuilder out, String rootBBC){ StringBuilder bbcode = null; boolean closeTag = false; - while(text.length() > 0){ - char c = text.charAt(0); + while(index.i < text.length()){ + char c = text.charAt(index.i); if(c == '['){ bbcode = new StringBuilder(); } @@ -110,7 +103,7 @@ public class BBCodeParser { String param = ""; switch(c){ case '=': - param = parseParam(text); + param = parseParam(index, text); case ']': String bbcode_cache = bbcode.toString(); if(closeTag){ @@ -119,7 +112,7 @@ public class BBCodeParser { } return; } - String value = parseValue(text, bbcode_cache); + String value = parseValue(index, text, bbcode_cache); if(bbcodes.containsKey( bbcode_cache )){ String html = bbcodes.get( bbcode_cache ); html = html.replaceAll("%1", param); @@ -142,8 +135,8 @@ public class BBCodeParser { } else out.append(c); - if(text.length()>0) - text.deleteCharAt(0); + + index.i++; } if(bbcode!=null) if(closeTag)out.append("[/").append(bbcode); @@ -156,15 +149,15 @@ public class BBCodeParser { * @param text is the text to parse from * @return only the parameter string */ - private String parseParam(StringBuilder text){ + private String parseParam(MutableInt index, StringBuilder text){ StringBuilder param = new StringBuilder(); - while(text.length() > 0){ - char c = text.charAt(0); + while(index.i < text.length()){ + char c = text.charAt(index.i); if(c == ']') break; else if(c != '=') param.append(c); - text.deleteCharAt(0); + index.i++; } return param.toString(); } @@ -174,17 +167,17 @@ public class BBCodeParser { * * @param text is the text to parse the value from */ - private String parseValue(StringBuilder text, String bbcode){ + private String parseValue(MutableInt index, StringBuilder text, String bbcode){ StringBuilder value = new StringBuilder(); - while(text.length() > 0){ - char c = text.charAt(0); + while(index.i < text.length()){ + char c = text.charAt(index.i); if(c == '['){ - parse(text, value, bbcode); + read(index, text, value, bbcode); break; } else if(c != ']') value.append(c); - text.deleteCharAt(0); + index.i++; } return value.toString(); } diff --git a/src/zutil/parser/BEncodedParser.java b/src/zutil/parser/BEncodedParser.java index 40e63c3..70c226d 100644 --- a/src/zutil/parser/BEncodedParser.java +++ b/src/zutil/parser/BEncodedParser.java @@ -22,6 +22,7 @@ package zutil.parser; import zutil.parser.DataNode.DataType; +import zutil.struct.MutableInt; /** * http://wiki.theory.org/BitTorrentSpecification @@ -36,8 +37,8 @@ public class BEncodedParser { * @param data The data to be decoded * @return */ - public static DataNode parse(String data){ - return decode_BEncoded(new StringBuffer(data)); + public static DataNode read(String data){ + return decode_BEncoded(new MutableInt(), new StringBuilder(data)); } /** @@ -47,11 +48,11 @@ public class BEncodedParser { * @param index The index in data to start from * @return */ - private static DataNode decode_BEncoded(StringBuffer data){ + private static DataNode decode_BEncoded(MutableInt index, StringBuilder data){ String tmp; char c = ' '; - switch (data.charAt(0)) { + switch (data.charAt(index.i)) { /** * Integers are prefixed with an i and terminated by an e. For * example, 123 would bEcode to i123e, -3272002 would bEncode to @@ -59,9 +60,9 @@ public class BEncodedParser { */ case 'i': //System.out.println("Found Integer at "+index); - data.deleteCharAt(0); - tmp = data.substring(0, data.indexOf("e")); - data.delete(0, tmp.length() + 1); + index.i++; + tmp = data.substring(index.i, data.indexOf("e")); + index.i += tmp.length() + 1; //System.out.println(tmp); return new DataNode( new Long(tmp)); /** @@ -73,14 +74,14 @@ public class BEncodedParser { */ case 'l': //System.out.println("Found List at "+index); - data.deleteCharAt(0); + index.i++; DataNode list = new DataNode( DataType.List ); - c = data.charAt(0); + c = data.charAt(index.i); while(c != 'e'){ - list.add( decode_BEncoded(data) ); - c = data.charAt(0); + list.add( decode_BEncoded(index, data) ); + c = data.charAt(index.i); } - data.deleteCharAt(0); + index.i++; //MultiPrintStream.out.dump(list); if(list.size() == 1) return list.get(0); else return list; @@ -92,15 +93,15 @@ public class BEncodedParser { */ case 'd': //System.out.println("Found Dictionary at "+index); - data.deleteCharAt(0); + index.i++; DataNode map = new DataNode( DataType.Map ); - c = data.charAt(0); + c = data.charAt(index.i); while(c != 'e'){ - DataNode tmp2 = decode_BEncoded(data); - map.set(tmp2.getString(), decode_BEncoded(data)); - c = data.charAt(0); + DataNode tmp2 = decode_BEncoded(index, data); + map.set(tmp2.getString(), decode_BEncoded(index, data)); + c = data.charAt(index.i); } - data.deleteCharAt(0); + index.i++; //MultiPrintStream.out.dump(map); return map; /** @@ -110,11 +111,11 @@ public class BEncodedParser { */ default: //System.out.println("Found String at "+index); - tmp = data.substring(0, data.indexOf(":")); + tmp = data.substring(index.i, data.indexOf(":")); int length = Integer.parseInt(tmp); - data.delete(0, tmp.length()+1); - String ret = data.substring(0, length); - data.delete(0, length); + index.i += tmp.length() + 1; + String ret = data.substring(index.i, length); + index.i += length; //System.out.println(data.substring(i, i+length)); return new DataNode( ret ); } diff --git a/src/zutil/parser/json/JSONParser.java b/src/zutil/parser/json/JSONParser.java index fca7e02..ccbd80d 100644 --- a/src/zutil/parser/json/JSONParser.java +++ b/src/zutil/parser/json/JSONParser.java @@ -23,6 +23,7 @@ package zutil.parser.json; import zutil.parser.DataNode; import zutil.parser.DataNode.DataType; +import zutil.struct.MutableInt; /** * This is a JSON parser class @@ -30,12 +31,6 @@ import zutil.parser.DataNode.DataType; * @author Ziver */ public class JSONParser{ - /** - * A dumb class for persisting an index - */ - protected class Index{ - protected int i = 0; - } /** * Starts parsing @@ -44,7 +39,7 @@ public class JSONParser{ * @return a JSONNode object that is the root of the JSON */ public DataNode read(String json){ - return parse(new Index(), new StringBuffer(json)); + return parse(new MutableInt(), new StringBuilder(json)); } @@ -54,7 +49,7 @@ public class JSONParser{ * @param json * @return */ - protected static DataNode parse(Index index, StringBuffer json){ + protected static DataNode parse(MutableInt index, StringBuilder json){ DataNode root = null; DataNode key = null; DataNode node = null; diff --git a/src/zutil/struct/MutableInt.java b/src/zutil/struct/MutableInt.java new file mode 100644 index 0000000..c793abb --- /dev/null +++ b/src/zutil/struct/MutableInt.java @@ -0,0 +1,17 @@ +package zutil.struct; + +/** + * A simple class that only contains a public int. Can be used in + * recursive functions as a persistent integer. + * + * @author Ziver + */ +public class MutableInt { + public int i = 0; + + public MutableInt(){} + + public MutableInt(int i){ + this.i = i; + } +} diff --git a/src/zutil/test/JSONTest.java b/src/zutil/test/JSONTest.java index dc90ab9..d81cab2 100644 --- a/src/zutil/test/JSONTest.java +++ b/src/zutil/test/JSONTest.java @@ -5,18 +5,13 @@ import static org.junit.Assert.assertEquals; import org.junit.Test; -import com.carrotsearch.junitbenchmarks.AbstractBenchmark; -import com.carrotsearch.junitbenchmarks.BenchmarkOptions; - import zutil.parser.DataNode; import zutil.parser.json.JSONParser; -public class JSONTest extends AbstractBenchmark{ - public static final int ITERATION = 200; +public class JSONTest{ @Test - @BenchmarkOptions(benchmarkRounds = ITERATION) public void JSONParser() { JSONParser parser = new JSONParser(); diff --git a/src/zutil/test/ParserTest.java b/src/zutil/test/ParserTest.java new file mode 100644 index 0000000..eebdad0 --- /dev/null +++ b/src/zutil/test/ParserTest.java @@ -0,0 +1,27 @@ +package zutil.test; + +import static org.junit.Assert.assertEquals; + + +import org.junit.Test; + +import zutil.parser.BBCodeParser; + + +public class ParserTest{ + + @Test + public void BBCodeParser() { + BBCodeParser parser = new BBCodeParser(); + + assertEquals("1234", parser.read("1234")); + assertEquals("1234", parser.read("[i]1234[/i]")); + assertEquals("[apa]lol[/apa]", parser.read("[apa]lol[/apa]")); + assertEquals("jshdkj lol [apa]lol[/apa]", parser.read("jshdkj [u]lol [apa]lol[/apa]")); + //assertEquals("jshdkj [m]lol[/k] lol", parser.read("jshdkj [m]lol[/k] [i]lol[/i]")); + assertEquals("jshdkj [m", parser.read("jshdkj [m")); + assertEquals("jshdkj [/m", parser.read("jshdkj [/m")); + assertEquals("jshdkj m]", parser.read("jshdkj m]")); + assertEquals("jshdkj
", parser.read("jshdkj
")); + } +}