Skip to content

Commit cef6587

Browse files
authored
Merge pull request #348 from GeoscienceAustralia/dr-fix-346
Remove DynaML.xsd, including unit tests
2 parents 37d6009 + f2da835 commit cef6587

8 files changed

Lines changed: 60 additions & 1017 deletions

File tree

dynadjust/CMakeLists.txt

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1106,6 +1106,28 @@ if (BUILD_TESTING)
11061106
add_test (NAME reftran-source-test COMMAND $<TARGET_FILE:${DNAREFTRAN_TARGET}> srctest -r itrf2014 -e 01.01.2020 --export-xml)
11071107
add_test (NAME check-source-reftran COMMAND bash check_source_tags.sh srctest.ITRF2014.01.01.2020msr.xml CAMPAIGN_2023A CAMPAIGN_2023B EMPTY)
11081108

1109+
# 8a. XML import with and without xsi:noNamespaceSchemaLocation (issue #346)
1110+
# Verify dnaimport handles XML files regardless of whether the schema location
1111+
# attribute is present. Strip the attribute and import each sample data pair.
1112+
1113+
# gnss-network: with schema location (original files)
1114+
add_test (NAME import-xml-gnss-with-xsd COMMAND $<TARGET_FILE:${DNAIMPORT_TARGET}> -n xsd_gnss gnss-networkstn.xml gnss-networkmsr.xml -r GDA2020)
1115+
# gnss-network: without schema location
1116+
add_test (NAME import-xml-gnss-strip COMMAND bash strip_schema_location.sh gnss-networkstn.xml gnss-networkstn-noxsd.xml)
1117+
add_test (NAME import-xml-gnss-strip-msr COMMAND bash strip_schema_location.sh gnss-networkmsr.xml gnss-networkmsr-noxsd.xml)
1118+
add_test (NAME import-xml-gnss-without-xsd COMMAND $<TARGET_FILE:${DNAIMPORT_TARGET}> -n xsd_gnss gnss-networkstn-noxsd.xml gnss-networkmsr-noxsd.xml -r GDA2020)
1119+
set_tests_properties(import-xml-gnss-strip import-xml-gnss-strip-msr PROPERTIES FIXTURES_SETUP gnss_strip)
1120+
set_tests_properties(import-xml-gnss-without-xsd PROPERTIES FIXTURES_REQUIRED gnss_strip)
1121+
1122+
# urban-network: with schema location
1123+
add_test (NAME import-xml-urban-with-xsd COMMAND $<TARGET_FILE:${DNAIMPORT_TARGET}> -n xsd_urban urban-networkstn.xml urban-networkmsr.xml -r GDA2020)
1124+
# urban-network: without schema location
1125+
add_test (NAME import-xml-urban-strip COMMAND bash strip_schema_location.sh urban-networkstn.xml urban-networkstn-noxsd.xml)
1126+
add_test (NAME import-xml-urban-strip-msr COMMAND bash strip_schema_location.sh urban-networkmsr.xml urban-networkmsr-noxsd.xml)
1127+
add_test (NAME import-xml-urban-without-xsd COMMAND $<TARGET_FILE:${DNAIMPORT_TARGET}> -n xsd_urban urban-networkstn-noxsd.xml urban-networkmsr-noxsd.xml -r GDA2020)
1128+
set_tests_properties(import-xml-urban-strip import-xml-urban-strip-msr PROPERTIES FIXTURES_SETUP urban_strip)
1129+
set_tests_properties(import-xml-urban-without-xsd PROPERTIES FIXTURES_REQUIRED urban_strip)
1130+
11091131
# 9. gnss reference frame transformations
11101132
add_test (NAME ref-gnss01-network COMMAND $<TARGET_FILE:${DNAREFTRAN_TARGET}> gnss -r itrf2014 -e 01.01.2020)
11111133
add_test (NAME ref-gnss02-network COMMAND $<TARGET_FILE:${DNAREFTRAN_TARGET}> gnss -r itrf1988 -e 03.12.1995)
@@ -1744,16 +1766,8 @@ if (BUILD_TESTING)
17441766
add_test (NAME import-no-frame COMMAND $<TARGET_FILE:${DNAIMPORT_TARGET}> -n sample -r itrf1975 dsg.stn dsg.msr)
17451767
# no stations and measurements (generated above)
17461768
add_test (NAME import-no-data COMMAND $<TARGET_FILE:${DNAIMPORT_TARGET}> -n null ./null.stn ./null.msr)
1747-
# no DynaML.xsd - remove file in platform-independent manner (using CMake command) by setting up a test dependency
1748-
add_test (NAME import-no-xsd-file-remove COMMAND ${CMAKE_COMMAND} -E remove DynaML.xsd)
1749-
add_test (NAME import-no-xsd-file COMMAND $<TARGET_FILE:${DNAIMPORT_TARGET}> -n gnss gnss-networkstn.xml gnss-networkmsr.xml)
1750-
set_tests_properties(import-no-xsd-file PROPERTIES DEPENDS import-no-xsd-file-remove TIMEOUT 5)
1751-
# Restore DynaML.xsd after testing its absence
1752-
add_test (NAME import-no-xsd-file-restore COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../sampleData/DynaML.xsd DynaML.xsd)
1753-
set_tests_properties(import-no-xsd-file-restore PROPERTIES DEPENDS import-no-xsd-file)
17541769
# no geoid file
17551770
add_test (NAME import-no-geoid COMMAND $<TARGET_FILE:${DNAIMPORT_TARGET}> -n geoid --geo-file ./nofile.geo)
1756-
set_tests_properties(import-no-geoid PROPERTIES DEPENDS import-no-xsd-file-restore)
17571771
# no project file
17581772
add_test (NAME import-no-project COMMAND $<TARGET_FILE:${DNAIMPORT_TARGET}> -p ./nofile.dnaproj)
17591773
# measurement stns not in station file
@@ -1765,7 +1779,7 @@ if (BUILD_TESTING)
17651779
add_test (NAME import-misc-network-size COMMAND $<TARGET_FILE:${DNAIMPORT_TARGET}> -n contig --import-contiguous-stn-msr 5000 --export-dna)
17661780

17671781
set_tests_properties(import-no-option import-invalid-option import-invalid-file import-nearby import-no-files import-no-frame
1768-
import-no-data import-no-xsd-file import-no-geoid import-no-project import-no-stns import-no-help
1782+
import-no-data import-no-geoid import-no-project import-no-stns import-no-help
17691783
import-misc-block-size import-misc-network-size import-misc-07
17701784
PROPERTIES WILL_FAIL TRUE)
17711785

dynadjust/dynadjust/dnaimport/dnainterop.cpp

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@
2121

2222
#include <dynadjust/dnaimport/dnainterop.hpp>
2323

24-
//#include <include/io/DynaML-schema.hxx>
25-
2624
using namespace dynadjust::epsg;
2725

2826
MsrTally g_map_tally;
@@ -400,18 +398,6 @@ void dna_import::ParseXML(const std::string& fileName, vdnaStnPtr* vStations, PU
400398
_filespecifiedreferenceframe = false;
401399
_filespecifiedepoch = false;
402400

403-
// Check if DynaML.xsd exists in the current directory
404-
// This prevents the XML parser from hanging when the schema file is missing
405-
if (!std::filesystem::exists("DynaML.xsd"))
406-
{
407-
import_file_mutex.unlock();
408-
std::stringstream ss;
409-
ss << "ParseXML(): DynaML.xsd schema file not found in the current directory." << std::endl;
410-
ss << " The XML parser requires this file to validate XML input files." << std::endl;
411-
ss << " Please ensure DynaML.xsd is present in the working directory.";
412-
SignalExceptionParse(ss.str(), 0);
413-
}
414-
415401
try
416402
{
417403
// Instantiate individual parsers.
@@ -473,7 +459,7 @@ void dna_import::ParseXML(const std::string& fileName, vdnaStnPtr* vStations, PU
473459
::xml_schema::document doc_p (DnaXmlFormat_p, "DnaXmlFormat");
474460

475461
DnaXmlFormat_p.pre();
476-
doc_p.parse (*ifsInputFILE_);
462+
doc_p.parse (*ifsInputFILE_, ::xml_schema::flags::dont_validate);
477463
DnaXmlFormat_p.post_DnaXmlFormat (vStations, vMeasurements);
478464

479465
// unlock after parsing
@@ -553,6 +539,7 @@ void dna_import::ParseXML(const std::string& fileName, vdnaStnPtr* vStations, PU
553539
{
554540
std::stringstream ss;
555541
ss << "The default input file reference frame \"" << referenceframe_p.str() << "\" is not recognised.";
542+
import_file_mutex.unlock();
556543
SignalExceptionParse(static_cast<std::string>(ss.str()), 0);
557544
}
558545

@@ -580,6 +567,7 @@ void dna_import::ParseXML(const std::string& fileName, vdnaStnPtr* vStations, PU
580567
}
581568
std::stringstream ss;
582569
ss << "ParseXML(): An std::ios_base failure was encountered while parsing " << fileName << "." << std::endl << " " << f.what();
570+
import_file_mutex.unlock();
583571
SignalExceptionParse(static_cast<std::string>(ss.str()), 0);
584572
}
585573
catch (const std::system_error& e)
@@ -598,20 +586,22 @@ void dna_import::ParseXML(const std::string& fileName, vdnaStnPtr* vStations, PU
598586
}
599587
std::stringstream ss;
600588
ss << "ParseXML(): An std::ios_base failure was encountered while parsing " << fileName << "." << std::endl << " " << e.what();
589+
import_file_mutex.unlock();
601590
SignalExceptionParse(static_cast<std::string>(ss.str()), 0);
602591
}
603-
catch (const XMLInteropException& e)
592+
catch (const XMLInteropException& e)
604593
{
605594
std::stringstream ss;
606595
ss << "ParseXML(): An exception was encountered while parsing " << fileName << "." << std::endl << " " << e.what();
596+
import_file_mutex.unlock();
607597
SignalExceptionParse(static_cast<std::string>(ss.str()), 0);
608598
}
609599
catch (const ::xml_schema::parsing& e)
610600
{
611601
std::stringstream ss("");
612602
ss << e.what();
613603

614-
::xsd::cxx::parser::diagnostics<char>::const_iterator _it;
604+
::xsd::cxx::parser::diagnostics<char>::const_iterator _it;
615605
for (_it=e.diagnostics().begin(); _it!=e.diagnostics().end(); _it++)
616606
{
617607
ss << std::endl;
@@ -620,19 +610,29 @@ void dna_import::ParseXML(const std::string& fileName, vdnaStnPtr* vStations, PU
620610
ss << ", severity " << _it->severity() << std::endl;
621611
ss << " - " << _it->message();
622612
}
613+
import_file_mutex.unlock();
623614
SignalExceptionParse(ss.str(), 0);
624615
}
625616
catch (const ::xml_schema::exception& e)
626617
{
627618
std::stringstream ss;
628619
ss << "ParseXML(): An xml_schema exception was encountered while parsing " << fileName << "." << std::endl << " " << e.what();
620+
import_file_mutex.unlock();
629621
SignalExceptionParse(static_cast<std::string>(ss.str()), 0);
630622
}
623+
catch (const std::exception& e)
624+
{
625+
std::stringstream ss;
626+
ss << "ParseXML(): An error was encountered while parsing " << fileName << "." << std::endl << " " << e.what();
627+
import_file_mutex.unlock();
628+
SignalExceptionParse(ss.str(), 0);
629+
}
631630
catch (...)
632631
{
633632
std::stringstream ss;
634633
ss << "ParseXML(): An unknown error was encountered while parsing " << fileName << "." << std::endl;
635-
SignalExceptionParse(ss.str(), 0);
634+
import_file_mutex.unlock();
635+
SignalExceptionParse(ss.str(), 0);
636636
}
637637

638638
if (parseStatus_ != PARSE_SUCCESS)

dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@
1010
#include <dynadjust/dnaimport/dnaparser_pimpl.hxx>
1111
#include <include/measurement_types/dnastntally.hpp>
1212

13-
#include <include/io/DynaML-schema.hxx>
14-
1513
using namespace dynadjust::measurements;
1614
using namespace dynadjust::epsg;
1715
using namespace dynadjust::exception;
@@ -942,6 +940,19 @@ DnaXmlFormat_pimpl::DnaXmlFormat_pimpl(std::ifstream* is, PUINT32 clusterID, con
942940
_referenceframe = referenceframe;
943941
_epoch = epoch;
944942

943+
// Initialise file EPSG and epoch from the default reference frame.
944+
// Previously these were set by the XSD attribute defaults during
945+
// validation. With dont_validate, the attribute parsers are only
946+
// called when the attributes are present in the XML, so we need
947+
// sensible fallbacks.
948+
try {
949+
_fileEpsg = epsgStringFromName<std::string>(_referenceframe);
950+
}
951+
catch (...) {
952+
_fileEpsg.clear();
953+
}
954+
_fileEpoch = epoch;
955+
945956
// capture first file flag
946957
_firstFile = firstFile;
947958

dynadjust/dynadjust/dnaimport/dnaparser_pskel.cxx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,6 @@
3838

3939
#include <dynadjust/dnaimport/dnaparser_pskel.hxx>
4040

41-
#include <include/io/DynaML-schema.hxx>
42-
4341
using namespace dynadjust::measurements;
4442

4543
// Clusterpoint_pskel

dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1739,20 +1739,11 @@ int main(int argc, char* argv[]) {
17391739
}
17401740
// Import data as normal
17411741
else {
1742-
// Change current directory to the import folder
1743-
// A hack to circumvent the problem caused by importing DynaML files in
1744-
// different directories to where import is run from, causing errors
1745-
// because DynaML.xsd cannot be found.
1746-
std::filesystem::path currentPath(std::filesystem::current_path());
1747-
std::filesystem::current_path(std::filesystem::path(p.g.input_folder));
1748-
17491742
// Import all data as-is.
17501743
// All filtering is performed later below
17511744
if (ImportDataFiles(parserDynaML, &vStations, &vMeasurements, &vstationsTotal, &vmeasurementsTotal, &imp_file,
17521745
&vinput_file_meta, &parsestnTally, &parsemsrTally, errorCount, p) != EXIT_SUCCESS)
17531746
return EXIT_FAILURE;
1754-
1755-
current_path(currentPath);
17561747
}
17571748

17581749
epsgCode = epsgCodeFromName<UINT32>(p.i.reference_frame);

0 commit comments

Comments
 (0)