diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs index fbb080d..85a4f62 100644 --- a/.settings/org.eclipse.jdt.core.prefs +++ b/.settings/org.eclipse.jdt.core.prefs @@ -83,7 +83,7 @@ org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_de org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true -org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=false org.eclipse.jdt.core.formatter.indent_empty_lines=false org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true diff --git a/src/fr/devinsy/util/StringList.java b/src/fr/devinsy/util/StringList.java index b65162d..18de8ab 100755 --- a/src/fr/devinsy/util/StringList.java +++ b/src/fr/devinsy/util/StringList.java @@ -13,9 +13,11 @@ import java.util.ArrayList; * possible to build a string without any copy. The goal is to optimize the * building of strings where they are lot of concatenation action. */ -public class StringList extends ArrayList +public class StringList extends ArrayList implements CharSequence { + private static final long serialVersionUID = -1154185934830213732L; + public static final String LINE_SEPARATOR = "\n"; /** @@ -288,6 +290,24 @@ public class StringList extends ArrayList return (result); } + /** + * + */ + @Override + public char charAt(final int index) + { + char result; + + // + StringListCharPosition position = indexOf(index); + + // + result = get(position.getStringIndex()).charAt(position.getLocalCharIndex()); + + // + return result; + } + /** * */ @@ -303,7 +323,47 @@ public class StringList extends ArrayList /** * + * @param index + * @return */ + public StringListCharPosition indexOf(final int index) + { + StringListCharPosition result; + + if ((index < 0) || (index >= length())) + { + throw new StringIndexOutOfBoundsException(index); + } + else + { + boolean ended = false; + int stringIndex = 0; + int currentLength = 0; + result = null; + while (!ended) + { + if (index < currentLength + get(stringIndex).length()) + { + ended = true; + result = new StringListCharPosition(index, stringIndex, index - currentLength); + } + else + { + stringIndex += 1; + currentLength += get(stringIndex).length(); + } + } + + } + + // + return result; + } + + /** + * + */ + @Override public int length() { int result = 0; @@ -353,6 +413,91 @@ public class StringList extends ArrayList return (result); } + /** + * + */ + @Override + public CharSequence subSequence(final int start, final int end) + { + StringList result; + + result = substring(start, end); + + // + return result; + } + + /** + * + * @param start + * @param end + * @return + */ + public StringList substring(final int beginIndex, final int endIndex) + { + StringList result; + + if (beginIndex < 0) + { + throw new StringIndexOutOfBoundsException(beginIndex); + } + else if (endIndex > length()) + { + throw new StringIndexOutOfBoundsException(endIndex); + } + else if (beginIndex > endIndex) + { + throw new StringIndexOutOfBoundsException(endIndex - beginIndex); + } + else if (beginIndex == endIndex) + { + result = new StringList(); + } + else + { + // + result = new StringList(); + + // + StringListCharPosition startPosition = indexOf(beginIndex); + StringListCharPosition endPosition = indexOf(endIndex); + + // + if (startPosition.getStringIndex() == endPosition.getStringIndex()) + { + String source = get(startPosition.getStringIndex()); + String target = source.substring(startPosition.getLocalCharIndex(), endPosition.getLocalCharIndex()); + result.append(target); + } + else + { + // + { + String source = get(startPosition.getStringIndex()); + String target = source.substring(startPosition.getLocalCharIndex()); + result.append(target); + } + + // + for (int stringIndex = startPosition.getStringIndex() + 1; stringIndex < endPosition.getStringIndex(); stringIndex++) + { + String target = get(stringIndex); + result.append(target); + } + + // + { + String source = get(endPosition.getStringIndex()); + String target = source.substring(0, endPosition.getLocalCharIndex()); + result.append(target); + } + + } + } + // + return result; + } + /** * */ @@ -361,7 +506,7 @@ public class StringList extends ArrayList { String result; - StringBuffer buffer = new StringBuffer(this.length()); + StringBuffer buffer = new StringBuffer(length()); for (String string : this) { diff --git a/src/fr/devinsy/util/StringListCharPosition.java b/src/fr/devinsy/util/StringListCharPosition.java new file mode 100644 index 0000000..c80fe66 --- /dev/null +++ b/src/fr/devinsy/util/StringListCharPosition.java @@ -0,0 +1,55 @@ +/** + * @author Christian Momon, 2013. + * This file is free software under the terms of the GNU Library General Public License + * as published by the Free Software Foundation version 2 or any later version. + */ +package fr.devinsy.util; + +/** + * This class manages a char position in a StringList object. + * + * @author Christian P. Momon + */ +public class StringListCharPosition +{ + private int charIndex; + private int stringIndex; + private int localCharIndex; + + public StringListCharPosition(final int index, final int stringIndex, final int localIndex) + { + this.charIndex = index; + this.stringIndex = stringIndex; + this.localCharIndex = localIndex; + } + + public int getCharIndex() + { + return charIndex; + } + + public int getLocalCharIndex() + { + return localCharIndex; + } + + public int getStringIndex() + { + return stringIndex; + } + + public void setCharIndex(final int charIndex) + { + this.charIndex = charIndex; + } + + public void setLocalCharIndex(final int localCharIndex) + { + this.localCharIndex = localCharIndex; + } + + public void setStringIndex(final int stringIndex) + { + this.stringIndex = stringIndex; + } +} diff --git a/test/fr/devinsy/util/StringListTest.java b/test/fr/devinsy/util/StringListTest.java new file mode 100644 index 0000000..254a16b --- /dev/null +++ b/test/fr/devinsy/util/StringListTest.java @@ -0,0 +1,235 @@ +package fr.devinsy.util; + +import org.apache.log4j.BasicConfigurator; +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * + * @author Christian P. Momon + */ +public class StringListTest +{ + static protected org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(StringListTest.class); + + /** + * + */ + @Before + public void before() + { + BasicConfigurator.configure(); + Logger.getRootLogger().setLevel(Level.ERROR); + } + + /** + * + */ + @Test + public void testCharAt01() + { + // + logger.debug("===== test starting..."); + + // + StringList source = new StringList(); + source.append("abcdefghijklm"); + + // + char target = source.charAt(0); + Assert.assertEquals(target, 'a'); + + // + target = source.charAt(4); + Assert.assertEquals(target, 'e'); + + // + target = source.charAt(11); + Assert.assertEquals(target, 'l'); + + // + logger.debug("===== test done."); + } + + /** + * + */ + @Test + public void testCharAt02() + { + // + logger.debug("===== test starting..."); + + // + StringList source = new StringList(); + source.append("abc"); + source.append("def"); + source.append("ghi"); + source.append("jkl"); + source.append("mno"); + + // + char target = source.charAt(0); + Assert.assertEquals('a', target); + + // + target = source.charAt(4); + Assert.assertEquals('e', target); + + // + target = source.charAt(11); + Assert.assertEquals('l', target); + + // + logger.debug("===== test done."); + } + + /** + * + */ + @Test(expected = IndexOutOfBoundsException.class) + public void testCharAtException01() + { + // + logger.debug("===== test starting..."); + + // + StringList source = new StringList(); + source.append("abcdefghijklm"); + + // + char target = source.charAt(-2); + Assert.assertEquals('a', target); + + // + logger.debug("===== test done."); + } + + /** + * + */ + @Test(expected = IndexOutOfBoundsException.class) + public void testCharAtException02() + { + // + logger.debug("===== test starting..."); + + // + StringList source = new StringList(); + source.append("abcdefghijklm"); + + // + char target = source.charAt(100); + Assert.assertEquals('a', target); + + // + logger.debug("===== test done."); + } + + /** + * + */ + @Test(expected = IndexOutOfBoundsException.class) + public void testCharAtException03() + { + // + logger.debug("===== test starting..."); + + // + StringList source = new StringList(); + source.append("abcdefghijklm"); + + // + char target = source.charAt(source.length()); + Assert.assertEquals('a', target); + + // + logger.debug("===== test done."); + } + + /** + * + */ + @Test + public void testSubstring01() + { + // + logger.debug("===== test starting..."); + + // + StringList source = new StringList(); + source.append("hamburger"); + + // + StringList target = source.substring(4, 8); + Assert.assertEquals("urge", target.toString()); + + // + logger.debug("===== test done."); + } + + /** + * + */ + @Test + public void testSubstring02() + { + // + logger.debug("===== test starting..."); + + // + StringList source = new StringList(); + source.append("ham").append("bur").append("ger"); + + // + StringList target = source.substring(4, 8); + Assert.assertEquals("urge", target.toString()); + + // + logger.debug("===== test done."); + } + + /** + */ + @Test + public void testSubstring03() + { + // + logger.debug("===== test starting..."); + + // + StringList source = new StringList(); + source.append("smiles"); + + // + StringList target = source.substring(1, 5); + Assert.assertEquals("mile", target.toString()); + + // + logger.debug("===== test done."); + } + + /** + */ + @Test + public void testSubstring04() + { + // + logger.debug("===== test starting..."); + + // + StringList source = new StringList(); + source.append("sm").append("il").append("es"); + + // + StringList target = source.substring(1, 5); + Assert.assertEquals("mile", target.toString()); + + // + logger.debug("===== test done."); + } + +} diff --git a/test/one/Foo2Test.java b/test/one/Foo2Test.java index d590c11..07ebac5 100644 --- a/test/one/Foo2Test.java +++ b/test/one/Foo2Test.java @@ -5,9 +5,6 @@ import org.junit.Test; public class Foo2Test { - // static private final Logger logger = - // LoggerFactory.getLogger(PdfGenerationAmqpServiceInjectedTest.class); - /** * */