diff --git a/src/org/olap4j/impl/ConnectStringParser.java b/src/org/olap4j/impl/ConnectStringParser.java index 1361222..ce0d300 100644 --- a/src/org/olap4j/impl/ConnectStringParser.java +++ b/src/org/olap4j/impl/ConnectStringParser.java @@ -77,6 +77,9 @@ private PropertyMap parse() { */ private void parsePair(PropertyMap map) { String name = parseName(); + if (name == null) { + return; + } String value; if (i >= n) { value = ""; @@ -93,7 +96,8 @@ private void parsePair(PropertyMap map) { * Reads "name=". Name can contain equals sign if equals sign is * doubled. * - * @return Next name in the connect string being parsed + * @return Next name in the connect string being parsed, or null if there + * is no further name */ private String parseName() { nameBuf.setLength(0); @@ -115,6 +119,11 @@ private String parseName() { if (nameBuf.length() == 0) { // ignore preceding spaces i++; + if (i >= n) { + // there is no name, e.g. trailing spaces after + // semicolon, 'x=1; y=2; ' + return null; + } break; } else { // fall through diff --git a/testsrc/org/olap4j/impl/ConnectStringParserTest.java b/testsrc/org/olap4j/impl/ConnectStringParserTest.java index a510e82..224bf7b 100644 --- a/testsrc/org/olap4j/impl/ConnectStringParserTest.java +++ b/testsrc/org/olap4j/impl/ConnectStringParserTest.java @@ -82,6 +82,35 @@ public void testConnectStringMore() { p("empty= ;foo=bar", "empty", ""); } + /** + * Testcase for bug 1938151, "StringIndexOutOfBoundsException instead of a + * meaningful error" + */ + public void testBug1938151 () { + Map properties; + + // ends in semi + properties = ConnectStringParser.parseConnectString("foo=true; bar=xxx;"); + assertEquals(2, properties.size()); + + // ends in semi+space + properties = ConnectStringParser.parseConnectString("foo=true; bar=xxx; "); + assertEquals(2, properties.size()); + + // ends in space + properties = ConnectStringParser.parseConnectString(" "); + assertEquals(0, properties.size()); + + // actual testcase for bug + properties = ConnectStringParser.parseConnectString( + "provider=mondrian; JdbcDrivers=org.hsqldb.jdbcDriver;" + + "Jdbc=jdbc:hsqldb:./sql/sampledata;" + + "Catalog=C:\\cygwin\\home\\src\\jfreereport\\engines\\classic\\extensions-mondrian\\demo\\steelwheels.mondrian.xml;" + + "JdbcUser=sa; JdbcPassword=; "); + assertEquals(6, properties.size()); + assertEquals("", properties.get("JdbcPassword")); + } + /** * Checks that connectString contains a property called * name, whose value is value.