package tap.metadata; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; import java.io.PrintWriter; import java.io.StringWriter; import java.util.Iterator; import org.junit.Test; /** * This class aims to ensure schema, table and column names are interpreted correctly * when quoted and/or qualified (with a schema or table prefix). */ public class TestMetadataNames { /** TEST SCHEMA NAME */ @Test public void testSchemaName(){ TAPSchema schema; // NULL try{ new TAPSchema(null); fail("It should be impossible to create a TAPSchema with a NULL name."); }catch(NullPointerException npe){ assertEquals("Missing schema name!", npe.getMessage()); } // Empty string (not a single character): try{ new TAPSchema(""); fail("It should be impossible to create a TAPSchema with an empty name."); }catch(NullPointerException npe){ assertEquals("Missing schema name!", npe.getMessage()); } // String with only space characters: try{ new TAPSchema(" "); fail("It should be impossible to create a TAPSchema with a name just composed of space characters."); }catch(NullPointerException npe){ assertEquals("Missing schema name!", npe.getMessage()); } // Empty quoted string: try{ new TAPSchema("\"\""); fail("It should be impossible to create a TAPSchema with a empty name even if quoted."); }catch(NullPointerException npe){ assertEquals("Missing schema name!", npe.getMessage()); } // Non quoted names => ADQL_NAME = RAW_NAME = TRIMMED(GIVEN_NAME) try{ schema = new TAPSchema("foo"); assertEquals("foo", schema.getADQLName()); assertEquals("foo", schema.getRawName()); schema = new TAPSchema(" foo "); assertEquals("foo", schema.getADQLName()); assertEquals("foo", schema.getRawName()); // Qualified name => Not supported as a catalog name! schema = new TAPSchema("myCat.foo"); assertEquals("myCat.foo", schema.getADQLName()); assertEquals("myCat.foo", schema.getRawName()); }catch(NullPointerException npe){ npe.printStackTrace(System.err); fail("Unexpected error! The schema name is not empty or NULL. (see console for more details)"); } // Quoted names => ADQL_NAME <> RAW_NAME = TRIMMED(GIVEN_NAME) try{ schema = new TAPSchema("\" \""); assertEquals(" ", schema.getADQLName()); assertEquals("\" \"", schema.getRawName()); schema = new TAPSchema("\"foo\""); assertEquals("foo", schema.getADQLName()); assertEquals("\"foo\"", schema.getRawName()); schema = new TAPSchema(" \" foo \" "); assertEquals(" foo ", schema.getADQLName()); assertEquals("\" foo \"", schema.getRawName()); // Qualified name => Not supported as a catalog name! schema = new TAPSchema("myCat.\"foo\""); assertEquals("myCat.\"foo\"", schema.getADQLName()); assertEquals("myCat.\"foo\"", schema.getRawName()); }catch(NullPointerException npe){ npe.printStackTrace(System.err); fail("Unexpected error! The schema name is not empty or NULL. (see console for more details)"); } } /** TEST TABLE NAME */ @Test public void testTableName(){ TAPTable table, table2, table3; // NULL try{ new TAPTable(null); fail("It should be impossible to create a TAPTable with a NULL name."); }catch(NullPointerException npe){ assertEquals("Missing table name!", npe.getMessage()); } // Empty string (not a single character): try{ new TAPTable(""); fail("It should be impossible to create a TAPTable with an empty name."); }catch(NullPointerException npe){ assertEquals("Missing table name!", npe.getMessage()); } // String with only space characters: try{ new TAPTable(" "); fail("It should be impossible to create a TAPTable with a name just composed of space characters."); }catch(NullPointerException npe){ assertEquals("Missing table name!", npe.getMessage()); } // Empty quoted string: try{ new TAPTable("\"\""); fail("It should be impossible to create a TAPTable with a empty name even if quoted."); }catch(NullPointerException npe){ assertEquals("Missing table name!", npe.getMessage()); } // Non quoted names => ADQL_NAME = RAW_NAME = TRIMMED(GIVEN_NAME) try{ table = new TAPTable("foo"); assertEquals("foo", table.getADQLName()); assertEquals("foo", table.getRawName()); table = new TAPTable(" foo "); assertEquals("foo", table.getADQLName()); assertEquals("foo", table.getRawName()); // Qualified name => Without a schema link, no prefix can be removed! table = new TAPTable("mySchema.foo"); assertEquals("mySchema.foo", table.getADQLName()); assertEquals("mySchema.foo", table.getRawName()); // Qualified name + Schema with the WRONG name: table.setSchema(new TAPSchema("Blabla")); assertEquals("mySchema.foo", table.getADQLName()); assertEquals("mySchema.foo", table.getRawName()); // Qualified name + Schema with the RIGHT name: table.setSchema(new TAPSchema("mySchema")); assertEquals("foo", table.getADQLName()); assertEquals("mySchema.foo", table.getRawName()); }catch(NullPointerException npe){ npe.printStackTrace(System.err); fail("Unexpected error! The table name is not empty or NULL. (see console for more details)"); } // Quoted names => ADQL_NAME <> RAW_NAME = TRIMMED(GIVEN_NAME) try{ table = new TAPTable("\" \""); assertEquals(" ", table.getADQLName()); assertEquals("\" \"", table.getRawName()); table = new TAPTable("\"foo\""); assertEquals("foo", table.getADQLName()); assertEquals("\"foo\"", table.getRawName()); table = new TAPTable(" \" foo \" "); assertEquals(" foo ", table.getADQLName()); assertEquals("\" foo \"", table.getRawName()); // Qualified name => Without a schema link, no prefix can be removed! table = new TAPTable("mySchema.\"foo\""); assertEquals("mySchema.\"foo\"", table.getADQLName()); assertEquals("mySchema.\"foo\"", table.getRawName()); table2 = new TAPTable(" \"mySchema\". \"foo\""); assertEquals("\"mySchema\". \"foo\"", table2.getADQLName()); assertEquals("\"mySchema\". \"foo\"", table2.getRawName()); table3 = new TAPTable(" \"mySchema\". foo"); assertEquals("\"mySchema\". foo", table3.getADQLName()); assertEquals("\"mySchema\". foo", table3.getRawName()); // Qualified name + Schema with the WRONG name: table.setSchema(new TAPSchema("Blabla")); assertEquals("mySchema.\"foo\"", table.getADQLName()); assertEquals("mySchema.\"foo\"", table.getRawName()); table2.setSchema(new TAPSchema("mySchema")); assertEquals("\"mySchema\". \"foo\"", table2.getADQLName()); assertEquals("\"mySchema\". \"foo\"", table2.getRawName()); table3.setSchema(new TAPSchema("mySchema")); assertEquals("\"mySchema\". foo", table3.getADQLName()); assertEquals("\"mySchema\". foo", table3.getRawName()); // Qualified name + Schema with the RIGHT name: table.setSchema(new TAPSchema("mySchema")); assertEquals("foo", table.getADQLName()); assertEquals("mySchema.\"foo\"", table.getRawName()); table2.setSchema(new TAPSchema("\"mySchema\"")); assertEquals("foo", table2.getADQLName()); assertEquals("\"mySchema\". \"foo\"", table2.getRawName()); table3.setSchema(new TAPSchema("\"mySchema\"")); assertEquals("foo", table3.getADQLName()); assertEquals("\"mySchema\". foo", table3.getRawName()); }catch(NullPointerException npe){ npe.printStackTrace(System.err); fail("Unexpected error! The table name is not empty or NULL. (see console for more details)"); } } /** TEST COLUMN NAME */ @Test public void testColumnName(){ TAPColumn column, column2, column3, column4, column5; // NULL try{ new TAPColumn(null); fail("It should be impossible to create a TAPColumn with a NULL name."); }catch(NullPointerException npe){ assertEquals("Missing column name!", npe.getMessage()); } // Empty string (not a single character): try{ new TAPColumn(""); fail("It should be impossible to create a TAPColumn with an empty name."); }catch(NullPointerException npe){ assertEquals("Missing column name!", npe.getMessage()); } // String with only space characters: try{ new TAPColumn(" "); fail("It should be impossible to create a TAPColumn with a name just composed of space characters."); }catch(NullPointerException npe){ assertEquals("Missing column name!", npe.getMessage()); } // Empty quoted string: try{ new TAPColumn("\"\""); fail("It should be impossible to create a TAPColumn with a empty name even if quoted."); }catch(NullPointerException npe){ assertEquals("Missing column name!", npe.getMessage()); } // Non quoted names => ADQL_NAME = RAW_NAME = TRIMMED(GIVEN_NAME) try{ column = new TAPColumn("foo"); assertEquals("foo", column.getADQLName()); assertEquals("foo", column.getRawName()); column = new TAPColumn(" foo "); assertEquals("foo", column.getADQLName()); assertEquals("foo", column.getRawName()); // Qualified name => Without a table link, no prefix can be removed! column = new TAPColumn("myTable.foo"); assertEquals("myTable.foo", column.getADQLName()); assertEquals("myTable.foo", column.getRawName()); // Qualified name + Table with the WRONG name: column.setTable(new TAPTable("Blabla")); assertEquals("myTable.foo", column.getADQLName()); assertEquals("myTable.foo", column.getRawName()); // Qualified name + Table with the RIGHT name: column.setTable(new TAPTable("myTable")); assertEquals("foo", column.getADQLName()); assertEquals("myTable.foo", column.getRawName()); }catch(NullPointerException npe){ npe.printStackTrace(System.err); fail("Unexpected error! The column name is not empty or NULL. (see console for more details)"); } // Quoted names => ADQL_NAME <> RAW_NAME = TRIMMED(GIVEN_NAME) try{ column = new TAPColumn("\" \""); assertEquals(" ", column.getADQLName()); assertEquals("\" \"", column.getRawName()); column = new TAPColumn("\"foo\""); assertEquals("foo", column.getADQLName()); assertEquals("\"foo\"", column.getRawName()); column = new TAPColumn(" \" foo \" "); assertEquals(" foo ", column.getADQLName()); assertEquals("\" foo \"", column.getRawName()); // Qualified name => Without a table link, no prefix can be removed! column = new TAPColumn("myTable.\"foo\""); assertEquals("myTable.\"foo\"", column.getADQLName()); assertEquals("myTable.\"foo\"", column.getRawName()); column2 = new TAPColumn(" \"myTable\". \"foo\""); assertEquals("\"myTable\". \"foo\"", column2.getADQLName()); assertEquals("\"myTable\". \"foo\"", column2.getRawName()); column3 = new TAPColumn(" \"myTable\". foo"); assertEquals("\"myTable\". foo", column3.getADQLName()); assertEquals("\"myTable\". foo", column3.getRawName()); column4 = new TAPColumn(" mySchema.\"myTable\". foo"); assertEquals("mySchema.\"myTable\". foo", column4.getADQLName()); assertEquals("mySchema.\"myTable\". foo", column4.getRawName()); column5 = new TAPColumn(" \"mySchema\".\"myTable\". foo"); assertEquals("\"mySchema\".\"myTable\". foo", column5.getADQLName()); assertEquals("\"mySchema\".\"myTable\". foo", column5.getRawName()); // Qualified name + Table with the WRONG name: column.setTable(new TAPTable("Blabla")); assertEquals("myTable.\"foo\"", column.getADQLName()); assertEquals("myTable.\"foo\"", column.getRawName()); column2.setTable(new TAPTable("myTable")); assertEquals("\"myTable\". \"foo\"", column2.getADQLName()); assertEquals("\"myTable\". \"foo\"", column2.getRawName()); column3.setTable(new TAPTable("myTable")); assertEquals("\"myTable\". foo", column3.getADQLName()); assertEquals("\"myTable\". foo", column3.getRawName()); TAPTable t = new TAPTable("mySchema.myTable"); t.setSchema(new TAPSchema("mySchema")); column4.setTable(t); assertEquals("mySchema.\"myTable\". foo", column4.getADQLName()); assertEquals("mySchema.\"myTable\". foo", column4.getRawName()); t = new TAPTable("\"mySchema\".myTable"); t.setSchema(new TAPSchema("\"mySchema\"")); column5.setTable(t); assertEquals("\"mySchema\".\"myTable\". foo", column5.getADQLName()); assertEquals("\"mySchema\".\"myTable\". foo", column5.getRawName()); // Qualified name + Table with the RIGHT name: column.setTable(new TAPTable("myTable")); assertEquals("foo", column.getADQLName()); assertEquals("myTable.\"foo\"", column.getRawName()); column2.setTable(new TAPTable("\"myTable\"")); assertEquals("foo", column2.getADQLName()); assertEquals("\"myTable\". \"foo\"", column2.getRawName()); column3.setTable(new TAPTable("\"myTable\"")); assertEquals("foo", column3.getADQLName()); assertEquals("\"myTable\". foo", column3.getRawName()); t = new TAPTable("mySchema.\"myTable\""); t.setSchema(new TAPSchema("mySchema")); column4.setTable(t); assertEquals("foo", column4.getADQLName()); assertEquals("mySchema.\"myTable\". foo", column4.getRawName()); t = new TAPTable("\"mySchema\".\"myTable\""); t.setSchema(new TAPSchema("\"mySchema\"")); column5.setTable(t); assertEquals("foo", column5.getADQLName()); assertEquals("\"mySchema\".\"myTable\". foo", column5.getRawName()); }catch(NullPointerException npe){ npe.printStackTrace(System.err); fail("Unexpected error! The column name is not empty or NULL. (see console for more details)"); } } /** TEST XML METADATA */ @Test public void testXMLMetadata(){ TAPMetadata metadata = new TAPMetadata(); TAPSchema schema = new TAPSchema("blabla"); assertEquals("blabla", schema.getADQLName()); TAPTable table = new TAPTable("foo"); table.addColumn(new TAPColumn("col1")); table.addColumn(new TAPColumn("col2")); table.addColumn(new TAPColumn("foo.col3")); table.addColumn(new TAPColumn("blabla.foo.col4")); table.addColumn(new TAPColumn("foo2.col5")); schema.addTable(table); assertEquals("foo", table.getADQLName()); Iterator<TAPColumn> itCol = table.getColumns(); assertEquals("col1", itCol.next().getADQLName()); assertEquals("col2", itCol.next().getADQLName()); assertEquals("col3", itCol.next().getADQLName()); assertEquals("blabla.foo.col4", itCol.next().getADQLName()); /* Note for below: * Only ADQL allows schema.table.column. Here, the table name MUST be exactly * the same as the one written in the TAP_SCHEMA.tables (so, the trimmed raw name). */ assertEquals("foo2.col5", itCol.next().getADQLName()); table = new TAPTable(" \"foo.bar\""); table.addColumn(new TAPColumn("foo.bar.col1")); table.addColumn(new TAPColumn("\"foo.bar\".col2")); table.addColumn(new TAPColumn("blabla.foo.bar.col3")); table.addColumn(new TAPColumn("blabla.\"foo.bar\".col4")); schema.addTable(table); assertEquals("foo.bar", table.getADQLName()); itCol = table.getColumns(); assertEquals("foo.bar.col1", itCol.next().getADQLName()); assertEquals("col2", itCol.next().getADQLName()); assertEquals("blabla.foo.bar.col3", itCol.next().getADQLName()); assertEquals("blabla.\"foo.bar\".col4", itCol.next().getADQLName()); /* Note for below: * Same as for the 4th column of the table "foo". */ metadata.addSchema(schema); schema = new TAPSchema("myCat.bloblo"); assertEquals("myCat.bloblo", schema.getADQLName()); table = new TAPTable("myCat.bloblo.bar"); table.addColumn(new TAPColumn("col1")); table.addColumn(new TAPColumn("bloblo.col2")); table.addColumn(new TAPColumn("bar.col3")); table.addColumn(new TAPColumn("bloblo.bar.col4")); table.addColumn(new TAPColumn("myCat.bloblo.bar.col5")); schema.addTable(table); assertEquals("bar", table.getADQLName()); itCol = table.getColumns(); assertEquals("col1", itCol.next().getADQLName()); assertEquals("bloblo.col2", itCol.next().getADQLName()); assertEquals("bar.col3", itCol.next().getADQLName()); /* Note for below: * Same as for the 4th column of the table "foo". */ assertEquals("bloblo.bar.col4", itCol.next().getADQLName()); assertEquals("col5", itCol.next().getADQLName()); metadata.addSchema(schema); schema = new TAPSchema("\"Mon Super Schema\""); assertEquals("Mon Super Schema", schema.getADQLName()); metadata.addSchema(schema); try{ StringWriter str = new StringWriter(); metadata.write(new PrintWriter(str)); //System.out.println(str.toString()); assertEquals(expectedXMLMetadata, str.toString()); }catch(Exception ex){ ex.printStackTrace(System.err); fail("Unexpected error when writing TAP metadata into an XML format! (see console for more details)"); } } public final static String expectedXMLMetadata = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<vosi:tableset xmlns:vosi=\"http://www.ivoa.net/xml/VOSITables/v1.0\" xmlns:vod=\"http://www.ivoa.net/xml/VODataService/v1.1\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.ivoa.net/xml/VODataService/v1.1 http://www.ivoa.net/xml/VODataService/v1.1 http://www.ivoa.net/xml/VOSITables/v1.0 http://vo.ari.uni-heidelberg.de/docs/schemata/VOSITables-v1.0.xsd\">\n\t<schema>\n\t\t<name>blabla</name>\n\t\t<table>\n\t\t\t<name>foo</name>\n\t\t\t<column>\n\t\t\t\t<name>col1</name>\n\t\t\t\t<dataType xsi:type=\"vod:TAPType\">UNKNOWN</dataType>\n\t\t\t</column>\n\t\t\t<column>\n\t\t\t\t<name>col2</name>\n\t\t\t\t<dataType xsi:type=\"vod:TAPType\">UNKNOWN</dataType>\n\t\t\t</column>\n\t\t\t<column>\n\t\t\t\t<name>foo.col3</name>\n\t\t\t\t<dataType xsi:type=\"vod:TAPType\">UNKNOWN</dataType>\n\t\t\t</column>\n\t\t\t<column>\n\t\t\t\t<name>blabla.foo.col4</name>\n\t\t\t\t<dataType xsi:type=\"vod:TAPType\">UNKNOWN</dataType>\n\t\t\t</column>\n\t\t\t<column>\n\t\t\t\t<name>foo2.col5</name>\n\t\t\t\t<dataType xsi:type=\"vod:TAPType\">UNKNOWN</dataType>\n\t\t\t</column>\n\t\t</table>\n\t\t<table>\n\t\t\t<name>\"foo.bar\"</name>\n\t\t\t<column>\n\t\t\t\t<name>foo.bar.col1</name>\n\t\t\t\t<dataType xsi:type=\"vod:TAPType\">UNKNOWN</dataType>\n\t\t\t</column>\n\t\t\t<column>\n\t\t\t\t<name>\"foo.bar\".col2</name>\n\t\t\t\t<dataType xsi:type=\"vod:TAPType\">UNKNOWN</dataType>\n\t\t\t</column>\n\t\t\t<column>\n\t\t\t\t<name>blabla.foo.bar.col3</name>\n\t\t\t\t<dataType xsi:type=\"vod:TAPType\">UNKNOWN</dataType>\n\t\t\t</column>\n\t\t\t<column>\n\t\t\t\t<name>blabla.\"foo.bar\".col4</name>\n\t\t\t\t<dataType xsi:type=\"vod:TAPType\">UNKNOWN</dataType>\n\t\t\t</column>\n\t\t</table>\n\t</schema>\n\t<schema>\n\t\t<name>myCat.bloblo</name>\n\t\t<table>\n\t\t\t<name>myCat.bloblo.bar</name>\n\t\t\t<column>\n\t\t\t\t<name>col1</name>\n\t\t\t\t<dataType xsi:type=\"vod:TAPType\">UNKNOWN</dataType>\n\t\t\t</column>\n\t\t\t<column>\n\t\t\t\t<name>bloblo.col2</name>\n\t\t\t\t<dataType xsi:type=\"vod:TAPType\">UNKNOWN</dataType>\n\t\t\t</column>\n\t\t\t<column>\n\t\t\t\t<name>bar.col3</name>\n\t\t\t\t<dataType xsi:type=\"vod:TAPType\">UNKNOWN</dataType>\n\t\t\t</column>\n\t\t\t<column>\n\t\t\t\t<name>bloblo.bar.col4</name>\n\t\t\t\t<dataType xsi:type=\"vod:TAPType\">UNKNOWN</dataType>\n\t\t\t</column>\n\t\t\t<column>\n\t\t\t\t<name>myCat.bloblo.bar.col5</name>\n\t\t\t\t<dataType xsi:type=\"vod:TAPType\">UNKNOWN</dataType>\n\t\t\t</column>\n\t\t</table>\n\t</schema>\n\t<schema>\n\t\t<name>\"Mon Super Schema\"</name>\n\t</schema>\n</vosi:tableset>\n"; }