Commit 96df1d5a authored by gmantele's avatar gmantele
Browse files

Fix UDF parsing from the configuration file.

The end of the description of a UDF was not detected when this UDF was followed
by another UDF definition. This was due to an incorrect double quote escape in
the regular expression of a UDF's definition.
parent a959db1f
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -2,7 +2,7 @@
<!DOCTYPE project>
<project name="tap" basedir="." default="buildLib">
	
	<property name="version" value="2.2" />
	<property name="version" value="2.3" />

	<property name="srcDir" value="src" />
	<property name="testDir" value="test" />
+2 −2
Original line number Diff line number Diff line
@@ -129,7 +129,7 @@ import uws.service.log.UWSLog.LogLevel;
 * </p>
 *
 * @author Gr&eacute;gory Mantelet (ARI)
 * @version 2.1 (02/2018)
 * @version 2.3 (03/2018)
 * @since 2.0
 */
public final class ConfigurableServiceConnection implements ServiceConnection {
@@ -1124,7 +1124,7 @@ public final class ConfigurableServiceConnection implements ServiceConnection {

	private final String REGEXP_CLASSPATH = "\\{[^{}]*\\}";

	private final String REGEXP_DESCRIPTION = "\"((\\\"|[^\"])*)\"";
	private final String REGEXP_DESCRIPTION = "\"((\\\\\"|[^\"])*)\"";

	private final String REGEXP_UDF = "\\[\\s*(" + REGEXP_SIGNATURE + ")\\s*(,\\s*(" + REGEXP_CLASSPATH + ")?\\s*(,\\s*(" + REGEXP_DESCRIPTION + ")?\\s*)?)?\\]";

+10 −4
Original line number Diff line number Diff line
@@ -308,7 +308,7 @@ public class TestConfigurableServiceConnection {
		udfsWithClassNameProp.setProperty(KEY_UDFS, "[toto(a string)->VARCHAR, {adql.db.TestDBChecker$UDFToto}]");

		udfsWithClassNameAndDescriptionProp = (Properties)validProp.clone();
		udfsWithClassNameAndDescriptionProp.setProperty(KEY_UDFS, "[toto(a string)->VARCHAR, {adql.db.TestDBChecker$UDFToto}, \"Bla \"bla\".\"]");
		udfsWithClassNameAndDescriptionProp.setProperty(KEY_UDFS, "[toto(a string)->VARCHAR, {adql.db.TestDBChecker$UDFToto}, \"Bla \\\"bla\\\".\"], [ titi(b REAL) -> double, {adql.db.TestDBChecker$UDFToto}, \"Function titi.\"]");

		udfsWithEmptyOptParamsProp = (Properties)validProp.clone();
		udfsWithEmptyOptParamsProp.setProperty(KEY_UDFS, "[toto(a string)->VARCHAR,,  	 ]");
@@ -1060,12 +1060,18 @@ public class TestConfigurableServiceConnection {
		try{
			ServiceConnection connection = new ConfigurableServiceConnection(udfsWithClassNameAndDescriptionProp);
			assertNotNull(connection.getUDFs());
			assertEquals(1, connection.getUDFs().size());
			FunctionDef def = connection.getUDFs().iterator().next();
			assertEquals(2, connection.getUDFs().size());
			Iterator<FunctionDef> itUdfs = connection.getUDFs().iterator();
			FunctionDef def = itUdfs.next();
			assertEquals("toto(a VARCHAR) -> VARCHAR", def.toString());
			assertEquals(UDFToto.class, def.getUDFClass());
			assertEquals("Bla \"bla\".", def.description);
			assertEquals("Bla \\\"bla\\\".", def.description);
			def = itUdfs.next();
			assertEquals("titi(b REAL) -> DOUBLE", def.toString());
			assertEquals(UDFToto.class, def.getUDFClass());
			assertEquals("Function titi.", def.description);
		}catch(Exception e){
			e.printStackTrace();
			fail("This MUST have succeeded because the given list of UDFs contains valid items! \nCaught exception: " + getPertinentMessage(e));
		}