Loading data-discovery/src/main/java/vlkb/output/ObscoreExt.java 0 → 100644 +191 −0 Original line number Diff line number Diff line import uk.ac.starlink.table.*;// ColumnInfo needed class ObscoreExt { public static final ColumnInfo[] OBSCORE_COLINFO = { new ColumnInfo( "dataproduct_type", String.class, "Dataproduct Type (image|cube)" ), new ColumnInfo( "calib_level", Integer.class, "Calibration level" ), new ColumnInfo( "obs_collection", String.class, "Collection" ), new ColumnInfo( "obs_id", String.class, "Observation Id" ), new ColumnInfo( "obs_publisher_did", String.class, "Publisher Did" ), new ColumnInfo( "access_url", String.class, "Access URL" ), new ColumnInfo( "access_format", String.class, "Format (MIME type)" ), new ColumnInfo( "access_estsize", Long.class, "Extimated size (KB)" ), new ColumnInfo( "target_name", String.class, "Target" ), new ColumnInfo( "s_ra", Double.class, "Right Ascention" ), new ColumnInfo( "s_dec", Double.class, "Declination" ), new ColumnInfo( "s_fov", Double.class, "Field of view" ), new ColumnInfo( "s_region", String.class, "Region" ), new ColumnInfo( "s_xel1", Long.class, "Pixels axis1" ), new ColumnInfo( "s_xel2", Long.class, "Pixels axis2" ), new ColumnInfo( "s_resolution", Double.class, "Spatial resolution" ), new ColumnInfo( "t_min", Double.class, "Time min" ), new ColumnInfo( "t_max", Double.class, "Time max" ), new ColumnInfo( "t_exptime", Double.class, "Exposure time" ), new ColumnInfo( "t_resolution", Double.class, "Time resolution" ), new ColumnInfo( "t_xel", Long.class, "Time pixels" ), new ColumnInfo( "em_min", Double.class, "Spectrum min" ), new ColumnInfo( "em_max", Double.class, "Spectrum max" ), new ColumnInfo( "em_res_power", Double.class, "Spectrum resolution power" ), new ColumnInfo( "em_xel", Long.class, "Spectrum pixels" ), new ColumnInfo( "o_ucd", String.class, "Observable UCD" ), new ColumnInfo( "pol_states", String.class, "Polarization states" ), new ColumnInfo( "pol_xel", Long.class, "Polarization pixels" ), new ColumnInfo( "facility_name", String.class, "Facility" ), new ColumnInfo( "instrument_name", String.class, "Instrument" ), }; public static Object[] obscoreRow( Dataset dataset ) { return new Object[] { dataset.obsCore.dataproduct_type,//dataset.dataType, Integer.valueOf( dataset.obsCore.calib_level ), dataset.obsCore.obs_collection, dataset.obsCore.obs_id, dataset.obsCore.obs_publisher_did, dataset.obsCore.access_url,//dataset.access.accessCutoutUrl, dataset.obsCore.access_format, Long.valueOf( dataset.obsCore.access_estsize ), dataset.obsCore.target_name, Double.valueOf(dataset.obsCore.s_ra),Double.valueOf(dataset.obsCore.s_dec), Double.valueOf(dataset.obsCore.s_fov), dataset.obsCore.s_region, Long.valueOf( dataset.obsCore.s_xel1 ), Long.valueOf( dataset.obsCore.s_xel2 ), Double.valueOf(dataset.obsCore.s_resolution), Double.valueOf(dataset.obsCore.t_min), Double.valueOf(dataset.obsCore.t_max), Double.valueOf(dataset.obsCore.t_exptime), Double.valueOf(dataset.obsCore.t_resolution), Long.valueOf( dataset.obsCore.t_xel ), Double.valueOf(dataset.obsCore.em_min), Double.valueOf(dataset.obsCore.em_max), Double.valueOf(dataset.obsCore.em_res_power), Long.valueOf( dataset.obsCore.em_xel ), dataset.obsCore.o_ucd, dataset.obsCore.pol_states, Long.valueOf( dataset.obsCore.pol_xel ), dataset.obsCore.facility_name, dataset.obsCore.instrument_name, }; } public static final ColumnInfo[] VLKB_COLINFO = { new ColumnInfo( "overlap", Integer.class, "Overlap Code" ), new ColumnInfo( "overlapSky", Integer.class, "Overlap Code for Sky axes" ), new ColumnInfo( "overlapSpec", Integer.class, "Overlap Code for Spectral axis" ), new ColumnInfo( "P1lon", Double.class, "P1 longitude" ), new ColumnInfo( "P1lat", Double.class, "P1 latitude" ), new ColumnInfo( "P2lon", Double.class, "P2 longitude" ), new ColumnInfo( "P2lat", Double.class, "P2 latitude" ), new ColumnInfo( "P3lon", Double.class, "P3 longitude" ), new ColumnInfo( "P3lat", Double.class, "P3 latitude" ), new ColumnInfo( "P4lon", Double.class, "P4 longitude" ), new ColumnInfo( "P4lat", Double.class, "P4 latitude" ), new ColumnInfo( "file_url", String.class, "Access URL: all file" ), new ColumnInfo( "cutout_url", String.class, "Access URL: cut file" ), new ColumnInfo( "merge_url", String.class, "Access URL: demosaicing files" ), }; public static Object[] vlkbRow( Dataset dataset ) { return new Object[] { Integer.valueOf( dataset.overlapCode ), Integer.valueOf( dataset.overlapCodeSky ), Integer.valueOf( dataset.overlapCodeVel ), Double.valueOf(dataset.vertices_deg.lon[0]), Double.valueOf(dataset.vertices_deg.lat[0]), Double.valueOf(dataset.vertices_deg.lon[1]), Double.valueOf(dataset.vertices_deg.lat[1]), Double.valueOf(dataset.vertices_deg.lon[2]), Double.valueOf(dataset.vertices_deg.lat[2]), Double.valueOf(dataset.vertices_deg.lon[3]), Double.valueOf(dataset.vertices_deg.lat[3]), dataset.access.accessFileUrl, dataset.access.accessCutoutUrl, dataset.access.accessMosaicUrl, }; } public static final ColumnInfo[] SUBSURVEY_COLINFO = { new ColumnInfo( "velocity_unit", String.class, "Velocity Unit" ), new ColumnInfo( "survey", String.class, "Survey name" ), new ColumnInfo( "species", String.class, "Species" ), new ColumnInfo( "transition", String.class, "Transition" ), new ColumnInfo( "description", String.class, "Descritpion" ) }; public static Object[] subsurveyRow( Subsurvey subsurvey ) { return new Object[] { subsurvey.vel_unit, subsurvey.surveyname, subsurvey.species, subsurvey.transition, subsurvey.description }; } public static final ColumnInfo[] OBSCORE_VLKB_COLINFO = concat(OBSCORE_COLINFO, VLKB_COLINFO); public static Object[] obscoreVlkbRow( Dataset dataset ) { return concat(obscoreRow(dataset),vlkbRow(dataset)); } public static final ColumnInfo[] OBSCORE_VLKB_SUBSURVEY_COLINFO = concat(concat(OBSCORE_COLINFO, VLKB_COLINFO), SUBSURVEY_COLINFO); public static Object[] obscoreVlkbSubsurveyRow( Dataset dataset, Subsurvey subsurvey ) { return concat(concat(obscoreRow(dataset),vlkbRow(dataset)), subsurveyRow(subsurvey)); } private static ColumnInfo[] concat(ColumnInfo[] arr1, ColumnInfo[] arr2) { ColumnInfo[] oc = new ColumnInfo[arr1.length + arr2.length]; System.arraycopy(arr1, 0, oc, 0, arr1.length); System.arraycopy(arr2, 0, oc, arr1.length, arr2.length); return oc; }; private static Object[] concat(Object[] arr1, Object[] arr2) { Object[] oc = new Object[arr1.length + arr2.length]; System.arraycopy(arr1, 0, oc, 0, arr1.length); System.arraycopy(arr2, 0, oc, arr1.length, arr2.length); return oc; }; } data-discovery/src/main/java/vlkb/output/XmlSerializer.java +81 −143 Original line number Diff line number Diff line //import java.util.logging.Logger; import java.io.PrintWriter; // VOTable Loading @@ -12,16 +11,15 @@ import java.io.BufferedWriter; public final class XmlSerializer final class XmlSerializer { //private static final Logger LOGGER = Logger.getLogger(ServletCutout.class.getName()); private XmlSerializer() {} // disables instatiation private XmlSerializer() {} // VOTable public static void serializeToVoTable(PrintWriter writer, String charEncoding, SearchOutputData searchOutputData, public static void serializeToVoTable( PrintWriter writer, String charEncoding, SearchOutputData searchOutputData, boolean showDuration, long startTime_msec) throws IOException { StarTable dstable = makeSearchResultsTable( searchOutputData.subsurveyArr ); Loading @@ -34,173 +32,113 @@ public final class XmlSerializer new DefaultValueInfo( "datacubeCount", Integer.class, "Count of all datacubes from VLKB-search" ), searchOutputData.datacubeCount ) ); StarTable[] tables = {dstable}; BufferedWriter out = new BufferedWriter( writer ); out.write("<?xml-stylesheet type='text/xsl' href='VOTable2XHTML.xsl'?>"); out.write( "<VOTABLE version='1.1'>" ); out.write( "<RESOURCE>" ); out.write( "<DESCRIPTION> " + searchOutputData.versionString + " </DESCRIPTION>" ); for ( int i = 0; i < tables.length; i++ ) { VOSerializer.makeSerializer( DataFormat.TABLEDATA, tables[ i ] ).writeInlineTableElement( out ); } VOSerializer.makeSerializer( DataFormat.TABLEDATA, dstable ).writeInlineTableElement( out ); out.write( "</RESOURCE>" ); out.write( "</VOTABLE>" ); out.flush(); } static final ColumnInfo[] OBSCORE_COLINFO = private static StarTable makeSearchResultsTable(Subsurvey[] ssurv) { new ColumnInfo( "dataproduct_type", String.class, "Dataproduct Type (image|cube)" ), new ColumnInfo( "calib_level", Integer.class, "Calibration level" ), new ColumnInfo( "obs_collection", String.class, "Collection" ), new ColumnInfo( "obs_id", String.class, "Observation Id" ), new ColumnInfo( "obs_publisher_did", String.class, "Publisher Did" ), new ColumnInfo( "access_url", String.class, "Access URL" ), new ColumnInfo( "access_format", String.class, "Format (MIME type)" ), new ColumnInfo( "access_estsize", Long.class, "Extimated size (KB)" ), new ColumnInfo( "target_name", String.class, "Target" ), new ColumnInfo( "s_ra", Double.class, "Right Ascention" ), new ColumnInfo( "s_dec", Double.class, "Declination" ), new ColumnInfo( "s_fov", Double.class, "Field of view" ), new ColumnInfo( "s_region", String.class, "Region" ), new ColumnInfo( "s_xel1", Long.class, "Pixels axis1" ), new ColumnInfo( "s_xel2", Long.class, "Pixels axis2" ), new ColumnInfo( "s_resolution", Double.class, "Spatial resolution" ), new ColumnInfo( "t_min", Double.class, "Time min" ), new ColumnInfo( "t_max", Double.class, "Time max" ), new ColumnInfo( "t_exptime", Double.class, "Exposure time" ), new ColumnInfo( "t_resolution", Double.class, "Time resolution" ), new ColumnInfo( "t_xel", Long.class, "Time pixels" ), new ColumnInfo( "em_min", Double.class, "Spectrum min" ), new ColumnInfo( "em_max", Double.class, "Spectrum max" ), new ColumnInfo( "em_res_power", Double.class, "Spectrum resolution power" ), new ColumnInfo( "em_xel", Long.class, "Spectrum pixels" ), new ColumnInfo( "o_ucd", String.class, "Observable UCD" ), new ColumnInfo( "pol_states", String.class, "Polarization states" ), new ColumnInfo( "pol_xel", Long.class, "Polarization pixels" ), new ColumnInfo( "facility_name", String.class, "Facility" ), new ColumnInfo( "instrument_name", String.class, "Instrument" ), // VLKB extensions new ColumnInfo( "overlap", Integer.class, "Overlap Code" ), new ColumnInfo( "overlapSky", Integer.class, "Overlap Code for Sky axes" ), new ColumnInfo( "overlapSpec", Integer.class, "Overlap Code for Spectral axis" ), new ColumnInfo( "P1lon", Double.class, "P1 longitude" ), new ColumnInfo( "P1lat", Double.class, "P1 latitude" ), new ColumnInfo( "P2lon", Double.class, "P2 longitude" ), new ColumnInfo( "P2lat", Double.class, "P2 latitude" ), new ColumnInfo( "P3lon", Double.class, "P3 longitude" ), new ColumnInfo( "P3lat", Double.class, "P3 latitude" ), new ColumnInfo( "P4lon", Double.class, "P4 longitude" ), new ColumnInfo( "P4lat", Double.class, "P4 latitude" ), new ColumnInfo( "file_url", String.class, "Access URL: all file" ), new ColumnInfo( "cutout_url", String.class, "Access URL: cut file" ), new ColumnInfo( "merge_url", String.class, "Access URL: demosaicing files" ), // subsurvey metadata new ColumnInfo( "velocity_unit", String.class, "Velocity Unit" ), new ColumnInfo( "survey", String.class, "Survey name" ), new ColumnInfo( "species", String.class, "Species" ), new ColumnInfo( "transition", String.class, "Transition" ), new ColumnInfo( "description", String.class, "Descritpion" ) }; RowListStarTable astro = new RowListStarTable( ObscoreExt.OBSCORE_VLKB_SUBSURVEY_COLINFO ); private static Object[] obscoreRow( Dataset dataset, Subsurvey subsurvey ) for(Subsurvey subsurvey : ssurv) { return new Object[] for(Dataset dataset : subsurvey.datasetArr) { // ObsCore dataset.obsCore.dataproduct_type,//dataset.dataType, Integer.valueOf( dataset.obsCore.calib_level ), dataset.obsCore.obs_collection, dataset.obsCore.obs_id, dataset.obsCore.obs_publisher_did, if(dataset.obsCore == null) continue; // FIXME skip mergeable datasets dataset.obsCore.access_url,//dataset.access.accessCutoutUrl, dataset.obsCore.access_format, Long.valueOf( dataset.obsCore.access_estsize ), astro.addRow( ObscoreExt.obscoreVlkbSubsurveyRow(dataset, subsurvey) ); } } dataset.obsCore.target_name, return astro; } Double.valueOf(dataset.obsCore.s_ra),Double.valueOf(dataset.obsCore.s_dec), Double.valueOf(dataset.obsCore.s_fov), dataset.obsCore.s_region, Long.valueOf( dataset.obsCore.s_xel1 ), Long.valueOf( dataset.obsCore.s_xel2 ), Double.valueOf(dataset.obsCore.s_resolution), public static void serializeToVoTableBySubsurveys( PrintWriter writer, String charEncoding, SearchOutputData searchOutputData, boolean showDuration, long startTime_msec) throws IOException { StarTable[] tables = makeSubsurveyTables( searchOutputData.subsurveyArr ); BufferedWriter out = new BufferedWriter( writer ); Double.valueOf(dataset.obsCore.t_min), Double.valueOf(dataset.obsCore.t_max), Double.valueOf(dataset.obsCore.t_exptime), Double.valueOf(dataset.obsCore.t_resolution), Long.valueOf( dataset.obsCore.t_xel ), out.write( "<VOTABLE version='1.1'>" ); out.write( "<RESOURCE>" ); out.write( "<DESCRIPTION> " + searchOutputData.versionString + " </DESCRIPTION>" ); for ( int i = 0; i < tables.length; i++ ) { VOSerializer.makeSerializer( DataFormat.TABLEDATA, tables[ i ] ).writeInlineTableElement( out ); } out.write( "</RESOURCE>" ); out.write( "</VOTABLE>" ); out.flush(); } Double.valueOf(dataset.obsCore.em_min), Double.valueOf(dataset.obsCore.em_max), Double.valueOf(dataset.obsCore.em_res_power), Long.valueOf( dataset.obsCore.em_xel ), private static StarTable[] makeSubsurveyTables(Subsurvey[] subsurveyArr) { StarTable[] ssurvTableArr = new StarTable[subsurveyArr.length]; int ix = 0; dataset.obsCore.o_ucd, for(Subsurvey subsurvey : subsurveyArr) { RowListStarTable table = new RowListStarTable( ObscoreExt.OBSCORE_VLKB_COLINFO ); dataset.obsCore.pol_states, Long.valueOf( dataset.obsCore.pol_xel ), table.setParameter(new DescribedValue( new DefaultValueInfo( "subsurveyCount", Integer.class, "Count of subsurveys with found datacube(s)" ), subsurveyArr.length ) ); dataset.obsCore.facility_name, dataset.obsCore.instrument_name, table.setParameter(new DescribedValue( new DefaultValueInfo( "datacubeCount", Integer.class, "Count of all datacubes from VLKB-search" ), subsurvey.datasetArr.length ) ); // VLKB extensions Integer.valueOf( dataset.overlapCode ), Integer.valueOf( dataset.overlapCodeSky ), Integer.valueOf( dataset.overlapCodeVel ), table.setParameter(new DescribedValue( new DefaultValueInfo( "velocity_unit", String.class, "Unit of velocity in FITS header" ), subsurvey.vel_unit ) ); Double.valueOf(dataset.vertices_deg.lon[0]), Double.valueOf(dataset.vertices_deg.lat[0]), Double.valueOf(dataset.vertices_deg.lon[1]), Double.valueOf(dataset.vertices_deg.lat[1]), Double.valueOf(dataset.vertices_deg.lon[2]), Double.valueOf(dataset.vertices_deg.lat[2]), Double.valueOf(dataset.vertices_deg.lon[3]), Double.valueOf(dataset.vertices_deg.lat[3]), table.setParameter(new DescribedValue( new DefaultValueInfo( "survey", String.class, "Survey name" ), subsurvey.surveyname ) ); dataset.access.accessFileUrl, dataset.access.accessCutoutUrl, dataset.access.accessMosaicUrl, table.setParameter(new DescribedValue( new DefaultValueInfo( "species", String.class, "Species" ), subsurvey.species ) ); subsurvey.vel_unit, subsurvey.surveyname, subsurvey.species, subsurvey.transition, subsurvey.description }; } table.setParameter(new DescribedValue( new DefaultValueInfo( "transition", String.class, "Transition" ), subsurvey.transition ) ); private static StarTable makeSearchResultsTable(Subsurvey[] ssurv) { RowListStarTable astro = new RowListStarTable( OBSCORE_COLINFO ); table.setParameter(new DescribedValue( new DefaultValueInfo( "description", String.class, "Reference description" ), subsurvey.description ) ); for(Subsurvey subsurvey : ssurv) { for(Dataset dataset : subsurvey.datasetArr) { if(dataset.obsCore == null) continue; // FIXME skip mergeable datasets astro.addRow( obscoreRow(dataset, subsurvey) ); table.addRow( ObscoreExt.obscoreVlkbRow(dataset) ); } ssurvTableArr[ix++] = table; } return astro; return ssurvTableArr; } // legacy public static void serializeToLegacyResults(PrintWriter writer, String charEncoding, public static void serializeToLegacyResults( PrintWriter writer, String charEncoding, AuthPolicy inputAuth, Coord inputCoord, SubsurveyId inputSubsurveyId, SearchOutputData searchOutputData, boolean showDuration, long startTime_msec) Loading @@ -226,7 +164,7 @@ public final class XmlSerializer writer.println("</results>"); } public static String serialize(Coord coord) private static String serialize(Coord coord) { StringBuilder xml = new StringBuilder(); xml.append("<SkySystem>"+coord.skySystem+"</SkySystem>"); Loading @@ -251,7 +189,7 @@ public final class XmlSerializer return xml.toString(); } public static String serialize(SubsurveyId subsurveyId) private static String serialize(SubsurveyId subsurveyId) { StringBuilder xml = new StringBuilder(); if(subsurveyId.surveyName != null) xml.append("<SurveyName>"+subsurveyId.surveyName+"</SurveyName>"); Loading @@ -260,7 +198,7 @@ public final class XmlSerializer return xml.toString(); } public static String serialize(AuthPolicy auth) private static String serialize(AuthPolicy auth) { StringBuilder xml = new StringBuilder(); xml.append("<AccessPolicy>" + auth.getAccessPolicy() + "</AccessPolicy>"); Loading @@ -271,7 +209,7 @@ public final class XmlSerializer } public static void serialize(PrintWriter writer, Subsurvey subsurvey) private static void serialize(PrintWriter writer, Subsurvey subsurvey) { writer.println("<survey>"); // replace with escape the XML-predefined entities: Loading Loading @@ -301,7 +239,7 @@ public final class XmlSerializer writer.println("</survey>"); } public static String serialize(Dataset.Access access) private static String serialize(Dataset.Access access) { StringBuilder xml = new StringBuilder(); Loading @@ -321,7 +259,7 @@ public final class XmlSerializer return xml.toString(); } public static String serialize(Dataset.Vertices vertices) private static String serialize(Dataset.Vertices vertices) { StringBuilder xml = new StringBuilder(); xml.append("<vertices>"); Loading @@ -340,7 +278,7 @@ public final class XmlSerializer } public static String serialize(Dataset dataset) private static String serialize(Dataset dataset) { StringBuilder xml = new StringBuilder(); Loading @@ -364,7 +302,7 @@ public final class XmlSerializer } public static String serializeOverlapCode(String tagName, int ovCode) private static String serializeOverlapCode(String tagName, int ovCode) { final String[] overString = { Loading data-discovery/src/main/java/vlkb/webapi/FormatResponseFilter.java +6 −2 Original line number Diff line number Diff line Loading @@ -137,10 +137,14 @@ public class FormatResponseFilter implements Filter searchOutputData, showDuration,startTime_msec); } else if(respFormat.equals("application/x-votable+xml")) else if(respFormat.startsWith("application/x-votable+xml")) { response.setContentType("application/xml"); boolean showDuration = false; if(respFormat.contains("mode=bysubsurveys")) XmlSerializer.serializeToVoTableBySubsurveys(responseWriter, RESPONSE_ENCODING, searchOutputData,showDuration,startTime_msec); else XmlSerializer.serializeToVoTable(responseWriter, RESPONSE_ENCODING, searchOutputData,showDuration,startTime_msec); } else Loading Loading
data-discovery/src/main/java/vlkb/output/ObscoreExt.java 0 → 100644 +191 −0 Original line number Diff line number Diff line import uk.ac.starlink.table.*;// ColumnInfo needed class ObscoreExt { public static final ColumnInfo[] OBSCORE_COLINFO = { new ColumnInfo( "dataproduct_type", String.class, "Dataproduct Type (image|cube)" ), new ColumnInfo( "calib_level", Integer.class, "Calibration level" ), new ColumnInfo( "obs_collection", String.class, "Collection" ), new ColumnInfo( "obs_id", String.class, "Observation Id" ), new ColumnInfo( "obs_publisher_did", String.class, "Publisher Did" ), new ColumnInfo( "access_url", String.class, "Access URL" ), new ColumnInfo( "access_format", String.class, "Format (MIME type)" ), new ColumnInfo( "access_estsize", Long.class, "Extimated size (KB)" ), new ColumnInfo( "target_name", String.class, "Target" ), new ColumnInfo( "s_ra", Double.class, "Right Ascention" ), new ColumnInfo( "s_dec", Double.class, "Declination" ), new ColumnInfo( "s_fov", Double.class, "Field of view" ), new ColumnInfo( "s_region", String.class, "Region" ), new ColumnInfo( "s_xel1", Long.class, "Pixels axis1" ), new ColumnInfo( "s_xel2", Long.class, "Pixels axis2" ), new ColumnInfo( "s_resolution", Double.class, "Spatial resolution" ), new ColumnInfo( "t_min", Double.class, "Time min" ), new ColumnInfo( "t_max", Double.class, "Time max" ), new ColumnInfo( "t_exptime", Double.class, "Exposure time" ), new ColumnInfo( "t_resolution", Double.class, "Time resolution" ), new ColumnInfo( "t_xel", Long.class, "Time pixels" ), new ColumnInfo( "em_min", Double.class, "Spectrum min" ), new ColumnInfo( "em_max", Double.class, "Spectrum max" ), new ColumnInfo( "em_res_power", Double.class, "Spectrum resolution power" ), new ColumnInfo( "em_xel", Long.class, "Spectrum pixels" ), new ColumnInfo( "o_ucd", String.class, "Observable UCD" ), new ColumnInfo( "pol_states", String.class, "Polarization states" ), new ColumnInfo( "pol_xel", Long.class, "Polarization pixels" ), new ColumnInfo( "facility_name", String.class, "Facility" ), new ColumnInfo( "instrument_name", String.class, "Instrument" ), }; public static Object[] obscoreRow( Dataset dataset ) { return new Object[] { dataset.obsCore.dataproduct_type,//dataset.dataType, Integer.valueOf( dataset.obsCore.calib_level ), dataset.obsCore.obs_collection, dataset.obsCore.obs_id, dataset.obsCore.obs_publisher_did, dataset.obsCore.access_url,//dataset.access.accessCutoutUrl, dataset.obsCore.access_format, Long.valueOf( dataset.obsCore.access_estsize ), dataset.obsCore.target_name, Double.valueOf(dataset.obsCore.s_ra),Double.valueOf(dataset.obsCore.s_dec), Double.valueOf(dataset.obsCore.s_fov), dataset.obsCore.s_region, Long.valueOf( dataset.obsCore.s_xel1 ), Long.valueOf( dataset.obsCore.s_xel2 ), Double.valueOf(dataset.obsCore.s_resolution), Double.valueOf(dataset.obsCore.t_min), Double.valueOf(dataset.obsCore.t_max), Double.valueOf(dataset.obsCore.t_exptime), Double.valueOf(dataset.obsCore.t_resolution), Long.valueOf( dataset.obsCore.t_xel ), Double.valueOf(dataset.obsCore.em_min), Double.valueOf(dataset.obsCore.em_max), Double.valueOf(dataset.obsCore.em_res_power), Long.valueOf( dataset.obsCore.em_xel ), dataset.obsCore.o_ucd, dataset.obsCore.pol_states, Long.valueOf( dataset.obsCore.pol_xel ), dataset.obsCore.facility_name, dataset.obsCore.instrument_name, }; } public static final ColumnInfo[] VLKB_COLINFO = { new ColumnInfo( "overlap", Integer.class, "Overlap Code" ), new ColumnInfo( "overlapSky", Integer.class, "Overlap Code for Sky axes" ), new ColumnInfo( "overlapSpec", Integer.class, "Overlap Code for Spectral axis" ), new ColumnInfo( "P1lon", Double.class, "P1 longitude" ), new ColumnInfo( "P1lat", Double.class, "P1 latitude" ), new ColumnInfo( "P2lon", Double.class, "P2 longitude" ), new ColumnInfo( "P2lat", Double.class, "P2 latitude" ), new ColumnInfo( "P3lon", Double.class, "P3 longitude" ), new ColumnInfo( "P3lat", Double.class, "P3 latitude" ), new ColumnInfo( "P4lon", Double.class, "P4 longitude" ), new ColumnInfo( "P4lat", Double.class, "P4 latitude" ), new ColumnInfo( "file_url", String.class, "Access URL: all file" ), new ColumnInfo( "cutout_url", String.class, "Access URL: cut file" ), new ColumnInfo( "merge_url", String.class, "Access URL: demosaicing files" ), }; public static Object[] vlkbRow( Dataset dataset ) { return new Object[] { Integer.valueOf( dataset.overlapCode ), Integer.valueOf( dataset.overlapCodeSky ), Integer.valueOf( dataset.overlapCodeVel ), Double.valueOf(dataset.vertices_deg.lon[0]), Double.valueOf(dataset.vertices_deg.lat[0]), Double.valueOf(dataset.vertices_deg.lon[1]), Double.valueOf(dataset.vertices_deg.lat[1]), Double.valueOf(dataset.vertices_deg.lon[2]), Double.valueOf(dataset.vertices_deg.lat[2]), Double.valueOf(dataset.vertices_deg.lon[3]), Double.valueOf(dataset.vertices_deg.lat[3]), dataset.access.accessFileUrl, dataset.access.accessCutoutUrl, dataset.access.accessMosaicUrl, }; } public static final ColumnInfo[] SUBSURVEY_COLINFO = { new ColumnInfo( "velocity_unit", String.class, "Velocity Unit" ), new ColumnInfo( "survey", String.class, "Survey name" ), new ColumnInfo( "species", String.class, "Species" ), new ColumnInfo( "transition", String.class, "Transition" ), new ColumnInfo( "description", String.class, "Descritpion" ) }; public static Object[] subsurveyRow( Subsurvey subsurvey ) { return new Object[] { subsurvey.vel_unit, subsurvey.surveyname, subsurvey.species, subsurvey.transition, subsurvey.description }; } public static final ColumnInfo[] OBSCORE_VLKB_COLINFO = concat(OBSCORE_COLINFO, VLKB_COLINFO); public static Object[] obscoreVlkbRow( Dataset dataset ) { return concat(obscoreRow(dataset),vlkbRow(dataset)); } public static final ColumnInfo[] OBSCORE_VLKB_SUBSURVEY_COLINFO = concat(concat(OBSCORE_COLINFO, VLKB_COLINFO), SUBSURVEY_COLINFO); public static Object[] obscoreVlkbSubsurveyRow( Dataset dataset, Subsurvey subsurvey ) { return concat(concat(obscoreRow(dataset),vlkbRow(dataset)), subsurveyRow(subsurvey)); } private static ColumnInfo[] concat(ColumnInfo[] arr1, ColumnInfo[] arr2) { ColumnInfo[] oc = new ColumnInfo[arr1.length + arr2.length]; System.arraycopy(arr1, 0, oc, 0, arr1.length); System.arraycopy(arr2, 0, oc, arr1.length, arr2.length); return oc; }; private static Object[] concat(Object[] arr1, Object[] arr2) { Object[] oc = new Object[arr1.length + arr2.length]; System.arraycopy(arr1, 0, oc, 0, arr1.length); System.arraycopy(arr2, 0, oc, arr1.length, arr2.length); return oc; }; }
data-discovery/src/main/java/vlkb/output/XmlSerializer.java +81 −143 Original line number Diff line number Diff line //import java.util.logging.Logger; import java.io.PrintWriter; // VOTable Loading @@ -12,16 +11,15 @@ import java.io.BufferedWriter; public final class XmlSerializer final class XmlSerializer { //private static final Logger LOGGER = Logger.getLogger(ServletCutout.class.getName()); private XmlSerializer() {} // disables instatiation private XmlSerializer() {} // VOTable public static void serializeToVoTable(PrintWriter writer, String charEncoding, SearchOutputData searchOutputData, public static void serializeToVoTable( PrintWriter writer, String charEncoding, SearchOutputData searchOutputData, boolean showDuration, long startTime_msec) throws IOException { StarTable dstable = makeSearchResultsTable( searchOutputData.subsurveyArr ); Loading @@ -34,173 +32,113 @@ public final class XmlSerializer new DefaultValueInfo( "datacubeCount", Integer.class, "Count of all datacubes from VLKB-search" ), searchOutputData.datacubeCount ) ); StarTable[] tables = {dstable}; BufferedWriter out = new BufferedWriter( writer ); out.write("<?xml-stylesheet type='text/xsl' href='VOTable2XHTML.xsl'?>"); out.write( "<VOTABLE version='1.1'>" ); out.write( "<RESOURCE>" ); out.write( "<DESCRIPTION> " + searchOutputData.versionString + " </DESCRIPTION>" ); for ( int i = 0; i < tables.length; i++ ) { VOSerializer.makeSerializer( DataFormat.TABLEDATA, tables[ i ] ).writeInlineTableElement( out ); } VOSerializer.makeSerializer( DataFormat.TABLEDATA, dstable ).writeInlineTableElement( out ); out.write( "</RESOURCE>" ); out.write( "</VOTABLE>" ); out.flush(); } static final ColumnInfo[] OBSCORE_COLINFO = private static StarTable makeSearchResultsTable(Subsurvey[] ssurv) { new ColumnInfo( "dataproduct_type", String.class, "Dataproduct Type (image|cube)" ), new ColumnInfo( "calib_level", Integer.class, "Calibration level" ), new ColumnInfo( "obs_collection", String.class, "Collection" ), new ColumnInfo( "obs_id", String.class, "Observation Id" ), new ColumnInfo( "obs_publisher_did", String.class, "Publisher Did" ), new ColumnInfo( "access_url", String.class, "Access URL" ), new ColumnInfo( "access_format", String.class, "Format (MIME type)" ), new ColumnInfo( "access_estsize", Long.class, "Extimated size (KB)" ), new ColumnInfo( "target_name", String.class, "Target" ), new ColumnInfo( "s_ra", Double.class, "Right Ascention" ), new ColumnInfo( "s_dec", Double.class, "Declination" ), new ColumnInfo( "s_fov", Double.class, "Field of view" ), new ColumnInfo( "s_region", String.class, "Region" ), new ColumnInfo( "s_xel1", Long.class, "Pixels axis1" ), new ColumnInfo( "s_xel2", Long.class, "Pixels axis2" ), new ColumnInfo( "s_resolution", Double.class, "Spatial resolution" ), new ColumnInfo( "t_min", Double.class, "Time min" ), new ColumnInfo( "t_max", Double.class, "Time max" ), new ColumnInfo( "t_exptime", Double.class, "Exposure time" ), new ColumnInfo( "t_resolution", Double.class, "Time resolution" ), new ColumnInfo( "t_xel", Long.class, "Time pixels" ), new ColumnInfo( "em_min", Double.class, "Spectrum min" ), new ColumnInfo( "em_max", Double.class, "Spectrum max" ), new ColumnInfo( "em_res_power", Double.class, "Spectrum resolution power" ), new ColumnInfo( "em_xel", Long.class, "Spectrum pixels" ), new ColumnInfo( "o_ucd", String.class, "Observable UCD" ), new ColumnInfo( "pol_states", String.class, "Polarization states" ), new ColumnInfo( "pol_xel", Long.class, "Polarization pixels" ), new ColumnInfo( "facility_name", String.class, "Facility" ), new ColumnInfo( "instrument_name", String.class, "Instrument" ), // VLKB extensions new ColumnInfo( "overlap", Integer.class, "Overlap Code" ), new ColumnInfo( "overlapSky", Integer.class, "Overlap Code for Sky axes" ), new ColumnInfo( "overlapSpec", Integer.class, "Overlap Code for Spectral axis" ), new ColumnInfo( "P1lon", Double.class, "P1 longitude" ), new ColumnInfo( "P1lat", Double.class, "P1 latitude" ), new ColumnInfo( "P2lon", Double.class, "P2 longitude" ), new ColumnInfo( "P2lat", Double.class, "P2 latitude" ), new ColumnInfo( "P3lon", Double.class, "P3 longitude" ), new ColumnInfo( "P3lat", Double.class, "P3 latitude" ), new ColumnInfo( "P4lon", Double.class, "P4 longitude" ), new ColumnInfo( "P4lat", Double.class, "P4 latitude" ), new ColumnInfo( "file_url", String.class, "Access URL: all file" ), new ColumnInfo( "cutout_url", String.class, "Access URL: cut file" ), new ColumnInfo( "merge_url", String.class, "Access URL: demosaicing files" ), // subsurvey metadata new ColumnInfo( "velocity_unit", String.class, "Velocity Unit" ), new ColumnInfo( "survey", String.class, "Survey name" ), new ColumnInfo( "species", String.class, "Species" ), new ColumnInfo( "transition", String.class, "Transition" ), new ColumnInfo( "description", String.class, "Descritpion" ) }; RowListStarTable astro = new RowListStarTable( ObscoreExt.OBSCORE_VLKB_SUBSURVEY_COLINFO ); private static Object[] obscoreRow( Dataset dataset, Subsurvey subsurvey ) for(Subsurvey subsurvey : ssurv) { return new Object[] for(Dataset dataset : subsurvey.datasetArr) { // ObsCore dataset.obsCore.dataproduct_type,//dataset.dataType, Integer.valueOf( dataset.obsCore.calib_level ), dataset.obsCore.obs_collection, dataset.obsCore.obs_id, dataset.obsCore.obs_publisher_did, if(dataset.obsCore == null) continue; // FIXME skip mergeable datasets dataset.obsCore.access_url,//dataset.access.accessCutoutUrl, dataset.obsCore.access_format, Long.valueOf( dataset.obsCore.access_estsize ), astro.addRow( ObscoreExt.obscoreVlkbSubsurveyRow(dataset, subsurvey) ); } } dataset.obsCore.target_name, return astro; } Double.valueOf(dataset.obsCore.s_ra),Double.valueOf(dataset.obsCore.s_dec), Double.valueOf(dataset.obsCore.s_fov), dataset.obsCore.s_region, Long.valueOf( dataset.obsCore.s_xel1 ), Long.valueOf( dataset.obsCore.s_xel2 ), Double.valueOf(dataset.obsCore.s_resolution), public static void serializeToVoTableBySubsurveys( PrintWriter writer, String charEncoding, SearchOutputData searchOutputData, boolean showDuration, long startTime_msec) throws IOException { StarTable[] tables = makeSubsurveyTables( searchOutputData.subsurveyArr ); BufferedWriter out = new BufferedWriter( writer ); Double.valueOf(dataset.obsCore.t_min), Double.valueOf(dataset.obsCore.t_max), Double.valueOf(dataset.obsCore.t_exptime), Double.valueOf(dataset.obsCore.t_resolution), Long.valueOf( dataset.obsCore.t_xel ), out.write( "<VOTABLE version='1.1'>" ); out.write( "<RESOURCE>" ); out.write( "<DESCRIPTION> " + searchOutputData.versionString + " </DESCRIPTION>" ); for ( int i = 0; i < tables.length; i++ ) { VOSerializer.makeSerializer( DataFormat.TABLEDATA, tables[ i ] ).writeInlineTableElement( out ); } out.write( "</RESOURCE>" ); out.write( "</VOTABLE>" ); out.flush(); } Double.valueOf(dataset.obsCore.em_min), Double.valueOf(dataset.obsCore.em_max), Double.valueOf(dataset.obsCore.em_res_power), Long.valueOf( dataset.obsCore.em_xel ), private static StarTable[] makeSubsurveyTables(Subsurvey[] subsurveyArr) { StarTable[] ssurvTableArr = new StarTable[subsurveyArr.length]; int ix = 0; dataset.obsCore.o_ucd, for(Subsurvey subsurvey : subsurveyArr) { RowListStarTable table = new RowListStarTable( ObscoreExt.OBSCORE_VLKB_COLINFO ); dataset.obsCore.pol_states, Long.valueOf( dataset.obsCore.pol_xel ), table.setParameter(new DescribedValue( new DefaultValueInfo( "subsurveyCount", Integer.class, "Count of subsurveys with found datacube(s)" ), subsurveyArr.length ) ); dataset.obsCore.facility_name, dataset.obsCore.instrument_name, table.setParameter(new DescribedValue( new DefaultValueInfo( "datacubeCount", Integer.class, "Count of all datacubes from VLKB-search" ), subsurvey.datasetArr.length ) ); // VLKB extensions Integer.valueOf( dataset.overlapCode ), Integer.valueOf( dataset.overlapCodeSky ), Integer.valueOf( dataset.overlapCodeVel ), table.setParameter(new DescribedValue( new DefaultValueInfo( "velocity_unit", String.class, "Unit of velocity in FITS header" ), subsurvey.vel_unit ) ); Double.valueOf(dataset.vertices_deg.lon[0]), Double.valueOf(dataset.vertices_deg.lat[0]), Double.valueOf(dataset.vertices_deg.lon[1]), Double.valueOf(dataset.vertices_deg.lat[1]), Double.valueOf(dataset.vertices_deg.lon[2]), Double.valueOf(dataset.vertices_deg.lat[2]), Double.valueOf(dataset.vertices_deg.lon[3]), Double.valueOf(dataset.vertices_deg.lat[3]), table.setParameter(new DescribedValue( new DefaultValueInfo( "survey", String.class, "Survey name" ), subsurvey.surveyname ) ); dataset.access.accessFileUrl, dataset.access.accessCutoutUrl, dataset.access.accessMosaicUrl, table.setParameter(new DescribedValue( new DefaultValueInfo( "species", String.class, "Species" ), subsurvey.species ) ); subsurvey.vel_unit, subsurvey.surveyname, subsurvey.species, subsurvey.transition, subsurvey.description }; } table.setParameter(new DescribedValue( new DefaultValueInfo( "transition", String.class, "Transition" ), subsurvey.transition ) ); private static StarTable makeSearchResultsTable(Subsurvey[] ssurv) { RowListStarTable astro = new RowListStarTable( OBSCORE_COLINFO ); table.setParameter(new DescribedValue( new DefaultValueInfo( "description", String.class, "Reference description" ), subsurvey.description ) ); for(Subsurvey subsurvey : ssurv) { for(Dataset dataset : subsurvey.datasetArr) { if(dataset.obsCore == null) continue; // FIXME skip mergeable datasets astro.addRow( obscoreRow(dataset, subsurvey) ); table.addRow( ObscoreExt.obscoreVlkbRow(dataset) ); } ssurvTableArr[ix++] = table; } return astro; return ssurvTableArr; } // legacy public static void serializeToLegacyResults(PrintWriter writer, String charEncoding, public static void serializeToLegacyResults( PrintWriter writer, String charEncoding, AuthPolicy inputAuth, Coord inputCoord, SubsurveyId inputSubsurveyId, SearchOutputData searchOutputData, boolean showDuration, long startTime_msec) Loading @@ -226,7 +164,7 @@ public final class XmlSerializer writer.println("</results>"); } public static String serialize(Coord coord) private static String serialize(Coord coord) { StringBuilder xml = new StringBuilder(); xml.append("<SkySystem>"+coord.skySystem+"</SkySystem>"); Loading @@ -251,7 +189,7 @@ public final class XmlSerializer return xml.toString(); } public static String serialize(SubsurveyId subsurveyId) private static String serialize(SubsurveyId subsurveyId) { StringBuilder xml = new StringBuilder(); if(subsurveyId.surveyName != null) xml.append("<SurveyName>"+subsurveyId.surveyName+"</SurveyName>"); Loading @@ -260,7 +198,7 @@ public final class XmlSerializer return xml.toString(); } public static String serialize(AuthPolicy auth) private static String serialize(AuthPolicy auth) { StringBuilder xml = new StringBuilder(); xml.append("<AccessPolicy>" + auth.getAccessPolicy() + "</AccessPolicy>"); Loading @@ -271,7 +209,7 @@ public final class XmlSerializer } public static void serialize(PrintWriter writer, Subsurvey subsurvey) private static void serialize(PrintWriter writer, Subsurvey subsurvey) { writer.println("<survey>"); // replace with escape the XML-predefined entities: Loading Loading @@ -301,7 +239,7 @@ public final class XmlSerializer writer.println("</survey>"); } public static String serialize(Dataset.Access access) private static String serialize(Dataset.Access access) { StringBuilder xml = new StringBuilder(); Loading @@ -321,7 +259,7 @@ public final class XmlSerializer return xml.toString(); } public static String serialize(Dataset.Vertices vertices) private static String serialize(Dataset.Vertices vertices) { StringBuilder xml = new StringBuilder(); xml.append("<vertices>"); Loading @@ -340,7 +278,7 @@ public final class XmlSerializer } public static String serialize(Dataset dataset) private static String serialize(Dataset dataset) { StringBuilder xml = new StringBuilder(); Loading @@ -364,7 +302,7 @@ public final class XmlSerializer } public static String serializeOverlapCode(String tagName, int ovCode) private static String serializeOverlapCode(String tagName, int ovCode) { final String[] overString = { Loading
data-discovery/src/main/java/vlkb/webapi/FormatResponseFilter.java +6 −2 Original line number Diff line number Diff line Loading @@ -137,10 +137,14 @@ public class FormatResponseFilter implements Filter searchOutputData, showDuration,startTime_msec); } else if(respFormat.equals("application/x-votable+xml")) else if(respFormat.startsWith("application/x-votable+xml")) { response.setContentType("application/xml"); boolean showDuration = false; if(respFormat.contains("mode=bysubsurveys")) XmlSerializer.serializeToVoTableBySubsurveys(responseWriter, RESPONSE_ENCODING, searchOutputData,showDuration,startTime_msec); else XmlSerializer.serializeToVoTable(responseWriter, RESPONSE_ENCODING, searchOutputData,showDuration,startTime_msec); } else Loading