From b56dd8ff5ae8bda64fd8311e52ffa7759907f3f1 Mon Sep 17 00:00:00 2001 From: Patrick Dowler Date: Thu, 9 Feb 2023 11:35:34 -0800 Subject: [PATCH] cadc-datalink: add local_semantics, remove readable add basic serialization in votable test --- cadc-datalink-server/build.gradle | 5 +- .../datalink/server/DataLinkUtil.java | 16 +- .../datalink/server/LinkQueryRunner.java | 1 - .../datalink/server/DataLinkUtilTest.java | 224 ++++++++++++++++++ cadc-datalink/build.gradle | 2 +- .../java/org/opencadc/datalink/DataLink.java | 8 +- 6 files changed, 238 insertions(+), 18 deletions(-) create mode 100644 cadc-datalink-server/src/test/java/org/opencadc/datalink/server/DataLinkUtilTest.java diff --git a/cadc-datalink-server/build.gradle b/cadc-datalink-server/build.gradle index 34512b27..85305cb9 100644 --- a/cadc-datalink-server/build.gradle +++ b/cadc-datalink-server/build.gradle @@ -14,15 +14,16 @@ sourceCompatibility = '1.8' group = 'org.opencadc' -version = '1.1.3' +version = '1.1.4' description = 'OpenCADC DataLink server library' def git_url = 'https://github.com/opencadc/dal' dependencies { compile 'org.opencadc:cadc-util:[1.6,)' + compile 'org.opencadc:cadc-registry:[1.6.2,2.0)' compile 'org.opencadc:cadc-dali:[1.2.17,)' - compile 'org.opencadc:cadc-datalink:[1.1.0,1.2)' + compile 'org.opencadc:cadc-datalink:[1.1.1,1.2)' compile 'org.opencadc:cadc-uws-server:[1.2,1.3)' testCompile 'junit:junit:[4.0,5.0)' diff --git a/cadc-datalink-server/src/main/java/org/opencadc/datalink/server/DataLinkUtil.java b/cadc-datalink-server/src/main/java/org/opencadc/datalink/server/DataLinkUtil.java index ac8a2fcb..9e81b599 100644 --- a/cadc-datalink-server/src/main/java/org/opencadc/datalink/server/DataLinkUtil.java +++ b/cadc-datalink-server/src/main/java/org/opencadc/datalink/server/DataLinkUtil.java @@ -79,7 +79,6 @@ import java.net.URI; import java.net.URL; import java.util.ArrayList; -import java.util.Arrays; import java.util.Iterator; import java.util.List; import org.apache.log4j.Logger; @@ -126,6 +125,11 @@ public static List getFields() { f = new VOTableField("semantics", "char", "*"); f.ucd = "meta.code"; fields.add(f); + + f = new VOTableField("local_semantics", "char", "*"); + f.ucd = "meta.code"; + f.description = "local tag indicating equivalent meaning or role of this link (DataLink-1.1)"; + fields.add(f); f = new VOTableField("description", "char", "*"); f.ucd = "meta.note"; @@ -155,19 +159,13 @@ public static List getFields() { f.description = "the current authenticated identity is authorized (DataLink-1.1)"; fields.add(f); - // custom - f = new VOTableField("readable", "boolean"); - f.description = "equivalent to link_authorized; backwards compat support"; - f.ucd = "meta.code"; - fields.add(f); - return fields; } public static VOTableDocument createVOTable() { VOTableDocument vot = new VOTableDocument(); VOTableResource vr = new VOTableResource("results"); - vr.getInfos().add(new VOTableInfo("standardID", Standards.DATALINK_LINKS_10.toASCIIString())); + vr.getInfos().add(new VOTableInfo("standardID", Standards.DATALINK_LINKS_11.toASCIIString())); vot.getResources().add(vr); VOTableTable tab = new VOTableTable(); vr.setTable(tab); @@ -216,13 +214,13 @@ public static List linkToRow(DataLink dl) { vals.add(dl.serviceDef); vals.add(dl.errorMessage); vals.add(dl.getSemantics().getValue()); + vals.add(dl.localSemantics); vals.add(dl.description); vals.add(dl.contentType); vals.add(dl.contentLength); vals.add(dl.contentQualifier); vals.add(safeToString(dl.linkAuth)); vals.add(dl.linkAuthorized); - vals.add(dl.readable); return vals; } diff --git a/cadc-datalink-server/src/main/java/org/opencadc/datalink/server/LinkQueryRunner.java b/cadc-datalink-server/src/main/java/org/opencadc/datalink/server/LinkQueryRunner.java index 86e077e6..f993b82c 100644 --- a/cadc-datalink-server/src/main/java/org/opencadc/datalink/server/LinkQueryRunner.java +++ b/cadc-datalink-server/src/main/java/org/opencadc/datalink/server/LinkQueryRunner.java @@ -79,7 +79,6 @@ import ca.nrc.cadc.log.WebServiceLogInfo; import ca.nrc.cadc.net.ContentType; import ca.nrc.cadc.net.TransientException; -import ca.nrc.cadc.rest.SyncInput; import ca.nrc.cadc.rest.SyncOutput; import ca.nrc.cadc.util.ThrowableUtil; import ca.nrc.cadc.uws.ErrorSummary; diff --git a/cadc-datalink-server/src/test/java/org/opencadc/datalink/server/DataLinkUtilTest.java b/cadc-datalink-server/src/test/java/org/opencadc/datalink/server/DataLinkUtilTest.java new file mode 100644 index 00000000..4468a869 --- /dev/null +++ b/cadc-datalink-server/src/test/java/org/opencadc/datalink/server/DataLinkUtilTest.java @@ -0,0 +1,224 @@ +/* +************************************************************************ +******************* CANADIAN ASTRONOMY DATA CENTRE ******************* +************** CENTRE CANADIEN DE DONNÉES ASTRONOMIQUES ************** +* +* (c) 2023. (c) 2023. +* Government of Canada Gouvernement du Canada +* National Research Council Conseil national de recherches +* Ottawa, Canada, K1A 0R6 Ottawa, Canada, K1A 0R6 +* All rights reserved Tous droits réservés +* +* NRC disclaims any warranties, Le CNRC dénie toute garantie +* expressed, implied, or énoncée, implicite ou légale, +* statutory, of any kind with de quelque nature que ce +* respect to the software, soit, concernant le logiciel, +* including without limitation y compris sans restriction +* any warranty of merchantability toute garantie de valeur +* or fitness for a particular marchande ou de pertinence +* purpose. NRC shall not be pour un usage particulier. +* liable in any event for any Le CNRC ne pourra en aucun cas +* damages, whether direct or être tenu responsable de tout +* indirect, special or general, dommage, direct ou indirect, +* consequential or incidental, particulier ou général, +* arising from the use of the accessoire ou fortuit, résultant +* software. Neither the name de l'utilisation du logiciel. Ni +* of the National Research le nom du Conseil National de +* Council of Canada nor the Recherches du Canada ni les noms +* names of its contributors may de ses participants ne peuvent +* be used to endorse or promote être utilisés pour approuver ou +* products derived from this promouvoir les produits dérivés +* software without specific prior de ce logiciel sans autorisation +* written permission. préalable et particulière +* par écrit. +* +* This file is part of the Ce fichier fait partie du projet +* OpenCADC project. OpenCADC. +* +* OpenCADC is free software: OpenCADC est un logiciel libre ; +* you can redistribute it and/or vous pouvez le redistribuer ou le +* modify it under the terms of modifier suivant les termes de +* the GNU Affero General Public la “GNU Affero General Public +* License as published by the License” telle que publiée +* Free Software Foundation, par la Free Software Foundation +* either version 3 of the : soit la version 3 de cette +* License, or (at your option) licence, soit (à votre gré) +* any later version. toute version ultérieure. +* +* OpenCADC is distributed in the OpenCADC est distribué +* hope that it will be useful, dans l’espoir qu’il vous +* but WITHOUT ANY WARRANTY; sera utile, mais SANS AUCUNE +* without even the implied GARANTIE : sans même la garantie +* warranty of MERCHANTABILITY implicite de COMMERCIALISABILITÉ +* or FITNESS FOR A PARTICULAR ni d’ADÉQUATION À UN OBJECTIF +* PURPOSE. See the GNU Affero PARTICULIER. Consultez la Licence +* General Public License for Générale Publique GNU Affero +* more details. pour plus de détails. +* +* You should have received Vous devriez avoir reçu une +* a copy of the GNU Affero copie de la Licence Générale +* General Public License along Publique GNU Affero avec +* with OpenCADC. If not, see OpenCADC ; si ce n’est +* . pas le cas, consultez : +* . +* +************************************************************************ +*/ + +package org.opencadc.datalink.server; + +import ca.nrc.cadc.dali.tables.votable.VOTableDocument; +import ca.nrc.cadc.dali.tables.votable.VOTableReader; +import ca.nrc.cadc.dali.tables.votable.VOTableResource; +import ca.nrc.cadc.dali.tables.votable.VOTableTable; +import ca.nrc.cadc.dali.tables.votable.VOTableWriter; +import ca.nrc.cadc.util.Log4jInit; +import java.io.ByteArrayOutputStream; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.junit.Assert; +import org.junit.Test; +import org.opencadc.datalink.DataLink; +import org.opencadc.datalink.ServiceDescriptor; + +/** + * + * @author pdowler + */ +public class DataLinkUtilTest { + private static final Logger log = Logger.getLogger(DataLinkUtilTest.class); + + static { + Log4jInit.setLevel("org.opencadc.datalink", Level.INFO); + } + + public DataLinkUtilTest() { + } + + @Test + public void testEmptyIterator() throws Exception { + List links = new ArrayList<>(); + + VOTableDocument vot = DataLinkUtil.createVOTable(); + VOTableTable tab = vot.getResourceByType("results").getTable(); + tab.setTableData(DataLinkUtil.getTableDataWrapper(links.iterator())); + + VOTableWriter writer = new VOTableWriter(); + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + writer.write(vot, bos); + + String xml = bos.toString("UTF-8"); + log.info("datalink doc:\n" + xml); + + VOTableReader r = new VOTableReader(true); + VOTableDocument doc = r.read(xml); + Assert.assertNotNull(doc); + VOTableTable vtt = doc.getResourceByType("results").getTable(); + Assert.assertFalse(vtt.getTableData().iterator().hasNext()); + } + + @Test + public void testMinimalLinks() throws Exception { + + DataLink a = new DataLink("a", DataLink.Term.THIS); + a.accessURL = new URL("https://opencadc.org/example/a"); + DataLink b = new DataLink("b", DataLink.Term.PREVIEW); + b.serviceDef = "prev-gen"; + DataLink c = new DataLink("c", DataLink.Term.AUXILIARY); + c.errorMessage = "oops"; + + final List links = new ArrayList<>(); + links.add(a); + links.add(b); + links.add(c); + final ServiceDescriptor prev = new ServiceDescriptor(new URL("https://opencadc.oreg/example/prev-gen?id=xyz")); + prev.id = b.serviceDef; + + VOTableDocument vot = DataLinkUtil.createVOTable(); + VOTableTable tab = vot.getResourceByType("results").getTable(); + tab.setTableData(DataLinkUtil.getTableDataWrapper(links.iterator())); + + VOTableResource metaResource = DataLinkUtil.convert(prev); + vot.getResources().add(metaResource); + + VOTableWriter writer = new VOTableWriter(); + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + writer.write(vot, bos); + + String xml = bos.toString("UTF-8"); + log.info("datalink doc:\n" + xml); + + VOTableReader r = new VOTableReader(true); + VOTableDocument doc = r.read(xml); + Assert.assertNotNull(doc); + VOTableTable vtt = doc.getResourceByType("results").getTable(); + Assert.assertTrue(vtt.getTableData().iterator().hasNext()); + + VOTableResource srv = doc.getResourceByID(b.serviceDef); + Assert.assertNotNull(srv); + + } + + @Test + public void testFullLinks() throws Exception { + + DataLink a = new DataLink("a", DataLink.Term.THIS); + a.accessURL = new URL("https://opencadc.org/example/a"); + a.contentLength = 1024L * 1024L; + a.contentType = "application/fits"; + a.contentQualifier = "image"; + a.description = "a fits image of M31"; + a.linkAuth = DataLink.LinkAuthTerm.OPTIONAL; + a.linkAuthorized = true; + a.localSemantics = "foo"; + + DataLink b = new DataLink("b", DataLink.Term.PREVIEW); + b.serviceDef = "prev-gen"; + b.contentLength = 1024L; + b.contentType = "image/png"; + b.contentQualifier = "image"; + b.description = "a pretty picture of M31"; + b.linkAuth = DataLink.LinkAuthTerm.OPTIONAL; + b.linkAuthorized = true; + b.localSemantics = "bar"; + + DataLink c = new DataLink("c", DataLink.Term.AUXILIARY); + c.errorMessage = "oops"; + + final List links = new ArrayList<>(); + links.add(a); + links.add(b); + links.add(c); + + final ServiceDescriptor prev = new ServiceDescriptor(new URL("https://opencadc.oreg/example/prev-gen?id=xyz")); + prev.id = b.serviceDef; + + VOTableDocument vot = DataLinkUtil.createVOTable(); + VOTableTable tab = vot.getResourceByType("results").getTable(); + tab.setTableData(DataLinkUtil.getTableDataWrapper(links.iterator())); + + VOTableResource metaResource = DataLinkUtil.convert(prev); + vot.getResources().add(metaResource); + + VOTableWriter writer = new VOTableWriter(); + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + writer.write(vot, bos); + + String xml = bos.toString("UTF-8"); + log.info("datalink doc:\n" + xml); + + VOTableReader r = new VOTableReader(true); + VOTableDocument doc = r.read(xml); + Assert.assertNotNull(doc); + VOTableTable vtt = doc.getResourceByType("results").getTable(); + Assert.assertTrue(vtt.getTableData().iterator().hasNext()); + + VOTableResource srv = doc.getResourceByID(b.serviceDef); + Assert.assertNotNull(srv); + } + + // TODO: fully test ServiceDescriptor output +} diff --git a/cadc-datalink/build.gradle b/cadc-datalink/build.gradle index 09c9f497..1086e075 100644 --- a/cadc-datalink/build.gradle +++ b/cadc-datalink/build.gradle @@ -14,7 +14,7 @@ sourceCompatibility = '1.8' group = 'org.opencadc' -version = '1.1.0' +version = '1.1.1' description = 'OpenCADC DataLink library' def git_url = 'https://github.com/opencadc/dal' diff --git a/cadc-datalink/src/main/java/org/opencadc/datalink/DataLink.java b/cadc-datalink/src/main/java/org/opencadc/datalink/DataLink.java index 67adc191..ba66b05c 100644 --- a/cadc-datalink/src/main/java/org/opencadc/datalink/DataLink.java +++ b/cadc-datalink/src/main/java/org/opencadc/datalink/DataLink.java @@ -161,17 +161,15 @@ public String getValue() { public String contentType; public Long contentLength; public String contentQualifier; // DataLink-1.1 - public LinkAuthTerm linkAuth; // DataLink-1.1 - public Boolean linkAuthorized; // DataLink-1.1 + public LinkAuthTerm linkAuth; // DataLink-1.1 + public Boolean linkAuthorized; // DataLink-1.1 + public String localSemantics; // DataLink-1.1 /** * If the serviceDef specifies a link-specific service descriptor, this is it. */ public ServiceDescriptor descriptor; - // custom CADC field equivalent to linkAuthorized retained for temporary backwards compat - public Boolean readable; - /** * Constructor. The caller must also assign a value to exactly one of: * accessURL, serviceDef, errorMessage before output.