diff --git a/cadc-tap-schema/src/main/java/ca/nrc/cadc/vosi/actions/GetAction.java b/cadc-tap-schema/src/main/java/ca/nrc/cadc/vosi/actions/GetAction.java index 3b5e2bae..4dfb382f 100644 --- a/cadc-tap-schema/src/main/java/ca/nrc/cadc/vosi/actions/GetAction.java +++ b/cadc-tap-schema/src/main/java/ca/nrc/cadc/vosi/actions/GetAction.java @@ -76,9 +76,11 @@ import ca.nrc.cadc.tap.schema.TapSchemaDAO; import ca.nrc.cadc.tap.schema.TapSchemaLoader; import ca.nrc.cadc.tap.schema.TapSchemaUtil; +import ca.nrc.cadc.tap.schema.validator.ValidatorConfig; import ca.nrc.cadc.vosi.TableSetWriter; import ca.nrc.cadc.vosi.TableWriter; import java.io.OutputStreamWriter; +import java.io.PrintWriter; import org.apache.log4j.Logger; /** @@ -154,14 +156,25 @@ public void doAction() throws Exception { if (validate) { String validationResult; try { - validationResult = TapSchemaUtil.validateTableDesc(td, validatorConfig); + ValidatorConfig vc = validatorConfig; // set by service config + if (vc == null) { + vc = ValidatorConfig.lax(); + } + validationResult = TapSchemaUtil.validateTableDesc(td, vc); } catch (IllegalArgumentException ex) { validationResult = ex.getMessage(); } syncOutput.setCode(200); syncOutput.setHeader("Content-Type", "text/plain"); - syncOutput.getOutputStream().write(validationResult == null || validationResult.isEmpty() - ? "OK".getBytes() : validationResult.getBytes()); + PrintWriter w = new PrintWriter(new OutputStreamWriter(syncOutput.getOutputStream())); + w.print(tableName + ": "); + if (validationResult == null || validationResult.isEmpty()) { + w.println("OK"); + } else { + w.println(validationResult); + } + w.flush(); + w.close(); return; } // If the Accept header = application/x-votable+xml, diff --git a/cadc-tap/src/main/java/ca/nrc/cadc/tap/schema/TapSchemaUtil.java b/cadc-tap/src/main/java/ca/nrc/cadc/tap/schema/TapSchemaUtil.java index 101d0b50..ff283edb 100644 --- a/cadc-tap/src/main/java/ca/nrc/cadc/tap/schema/TapSchemaUtil.java +++ b/cadc-tap/src/main/java/ca/nrc/cadc/tap/schema/TapSchemaUtil.java @@ -269,18 +269,21 @@ public static String validateTableDesc(TableDesc td, ValidatorConfig config) { List warnings = new ArrayList<>(); IdentifierValidator identifierValidator = new IdentifierValidator(config); - collectViolations("schema name", td.getSchemaName(), + String contextPrefix = td.getSchemaName() + ": "; + collectViolations(contextPrefix, "schema name", td.getSchemaName(), identifierValidator.checkValidIdentifier(td.getSchemaName(), IdentifierValidator.IdentifierType.SCHEMA_NAME).getViolations(), config, errors, warnings); - collectViolations("table name", td.getTableName(), + contextPrefix = td.getTableName() + ": "; + collectViolations(contextPrefix, "table name", td.getTableName(), identifierValidator.checkValidTableName(td.getTableName()).getViolations(), config, errors, warnings); UCDValidator ucdValidator = new UCDValidator(config); VOUnitValidator voUnitValidator = new VOUnitValidator(config); for (ColumnDesc cd : td.getColumnDescs()) { - collectViolations("column name", cd.getColumnName(), + contextPrefix = td.getTableName() + "." + cd.getColumnName() + ": "; + collectViolations(contextPrefix , "column name", cd.getColumnName(), identifierValidator.checkValidIdentifier(cd.getColumnName(), IdentifierValidator.IdentifierType.COLUMN_NAME).getViolations(), config, errors, warnings); @@ -289,8 +292,8 @@ public static String validateTableDesc(TableDesc td, ValidatorConfig config) { continue; } - collectViolations("ucd", cd.ucd, ucdValidator.validate(cd.ucd).getViolations(), config, errors, warnings); - collectViolations("unit", cd.unit, voUnitValidator.validate(cd.unit).getViolations(), config, errors, warnings); + collectViolations(contextPrefix, "ucd", cd.ucd, ucdValidator.validate(cd.ucd).getViolations(), config, errors, warnings); + collectViolations(contextPrefix , "unit", cd.unit, voUnitValidator.validate(cd.unit).getViolations(), config, errors, warnings); } if (errors.isEmpty() && warnings.isEmpty()) { @@ -321,10 +324,10 @@ public static String validateTableDesc(TableDesc td, ValidatorConfig config) { /** * Classifies each violation by severity and appends the formatted line to the appropriate list. */ - private static void collectViolations(String fieldType, String fieldValue, List violations, + private static void collectViolations(String pre, String fieldType, String fieldValue, List violations, ValidatorConfig config, List errors, List warnings) { for (Violation v : violations) { - String line = fieldType + " \"" + fieldValue + "\": " + v.getMessage() + "\n"; + String line = pre + fieldType + " \"" + fieldValue + "\": " + v.getMessage() + "\n"; if (config.severityFor(v.getViolationType()) == ValidatorConfig.Severity.ERROR) { errors.add(line); } else { diff --git a/cadc-tap/src/test/java/ca/nrc/cadc/tap/schema/ValidatorConfigTest.java b/cadc-tap/src/test/java/ca/nrc/cadc/tap/schema/validator/ValidatorConfigTest.java similarity index 95% rename from cadc-tap/src/test/java/ca/nrc/cadc/tap/schema/ValidatorConfigTest.java rename to cadc-tap/src/test/java/ca/nrc/cadc/tap/schema/validator/ValidatorConfigTest.java index f120aba3..c0987e94 100644 --- a/cadc-tap/src/test/java/ca/nrc/cadc/tap/schema/ValidatorConfigTest.java +++ b/cadc-tap/src/test/java/ca/nrc/cadc/tap/schema/validator/ValidatorConfigTest.java @@ -65,9 +65,12 @@ ************************************************************************ */ -package ca.nrc.cadc.tap.schema; +package ca.nrc.cadc.tap.schema.validator; -import ca.nrc.cadc.tap.schema.validator.ValidatorConfig; +import ca.nrc.cadc.tap.schema.ColumnDesc; +import ca.nrc.cadc.tap.schema.TableDesc; +import ca.nrc.cadc.tap.schema.TapDataType; +import ca.nrc.cadc.tap.schema.TapSchemaUtil; import org.junit.Assert; import org.junit.Test; @@ -106,9 +109,9 @@ public void testValidateLaxConfig() { Assert.assertTrue(result.contains("warnings: 3")); Assert.assertTrue(result.contains("schema.name")); - Assert.assertFalse(result.contains("tableName")); + Assert.assertTrue(result.contains("tableName")); - Assert.assertFalse(result.contains("col1")); + Assert.assertTrue(result.contains("col1")); Assert.assertTrue(result.contains("\"select\"")); Assert.assertTrue(result.contains("Jy/beam/RMSF")); // STRUCTURAL @@ -165,9 +168,9 @@ public void testValidateStrictConfig() { Assert.assertTrue(result.contains("warnings: 0")); Assert.assertTrue(result.contains("schema.name")); - Assert.assertFalse(result.contains("tableName")); + Assert.assertTrue(result.contains("tableName")); - Assert.assertFalse(result.contains("col1")); + Assert.assertTrue(result.contains("col1")); Assert.assertTrue(result.contains("\"select\"")); Assert.assertTrue(result.contains("Jy/beam/RMSF")); // STRUCTURAL diff --git a/youcat/src/intTest/java/org/opencadc/youcat/GetActionTest.java b/youcat/src/intTest/java/org/opencadc/youcat/GetActionTest.java index 31173a77..614aa83d 100644 --- a/youcat/src/intTest/java/org/opencadc/youcat/GetActionTest.java +++ b/youcat/src/intTest/java/org/opencadc/youcat/GetActionTest.java @@ -148,7 +148,10 @@ public void write(OutputStream out) throws IOException { Assert.assertNull("throwable", check.getThrowable()); Assert.assertEquals("response code", 200, check.getResponseCode()); String validationContent = stream.toString(StandardCharsets.UTF_8); - Assert.assertEquals("OK", validationContent); + Assert.assertNotNull(validationContent); + validationContent = validationContent.trim(); + String expected = testTable + ": OK"; + Assert.assertEquals(expected, validationContent); } catch (Exception unexpected) { Assert.fail("unexpected exception: " + unexpected); }