dcc 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +16 -0
- data/.rspec +3 -0
- data/.rubocop.yml +16 -0
- data/.rubocop_todo.yml +10 -0
- data/CHANGELOG.adoc +54 -0
- data/CONTRIBUTING.adoc +64 -0
- data/Gemfile +25 -0
- data/LICENSE +21 -0
- data/README.adoc +69 -0
- data/Rakefile +13 -0
- data/dcc.gemspec +41 -0
- data/docs/cli-reference.adoc +67 -0
- data/docs/getting-started.adoc +117 -0
- data/docs/schema-versions.adoc +65 -0
- data/examples/build_minimal_dcc.rb +23 -0
- data/examples/convert_all_formats.rb +19 -0
- data/examples/parse_and_inspect.rb +19 -0
- data/examples/quantity_math_demo.rb +32 -0
- data/examples/validate_full.rb +27 -0
- data/exe/dcc +7 -0
- data/lib/dcc/base/administrative_data.rb +43 -0
- data/lib/dcc/base/byte_data.rb +36 -0
- data/lib/dcc/base/calibration_laboratory.rb +29 -0
- data/lib/dcc/base/comment.rb +23 -0
- data/lib/dcc/base/condition.rb +34 -0
- data/lib/dcc/base/contact.rb +38 -0
- data/lib/dcc/base/contact_not_strict.rb +38 -0
- data/lib/dcc/base/core_data.rb +44 -0
- data/lib/dcc/base/data.rb +42 -0
- data/lib/dcc/base/digital_calibration_certificate.rb +32 -0
- data/lib/dcc/base/equipment_class.rb +24 -0
- data/lib/dcc/base/formula.rb +33 -0
- data/lib/dcc/base/hash_type.rb +34 -0
- data/lib/dcc/base/identification.rb +27 -0
- data/lib/dcc/base/identifications.rb +27 -0
- data/lib/dcc/base/influence_condition.rb +16 -0
- data/lib/dcc/base/influence_condition_list.rb +40 -0
- data/lib/dcc/base/item.rb +38 -0
- data/lib/dcc/base/item_list.rb +38 -0
- data/lib/dcc/base/list.rb +44 -0
- data/lib/dcc/base/location.rb +36 -0
- data/lib/dcc/base/measurement_meta_data.rb +15 -0
- data/lib/dcc/base/measurement_meta_data_list.rb +27 -0
- data/lib/dcc/base/measurement_result.rb +41 -0
- data/lib/dcc/base/measurement_result_list.rb +28 -0
- data/lib/dcc/base/measuring_equipment.rb +41 -0
- data/lib/dcc/base/measuring_equipment_list.rb +38 -0
- data/lib/dcc/base/quantity.rb +61 -0
- data/lib/dcc/base/ref_type_definition.rb +36 -0
- data/lib/dcc/base/ref_type_definition_list.rb +21 -0
- data/lib/dcc/base/resp_person.rb +38 -0
- data/lib/dcc/base/resp_person_list.rb +27 -0
- data/lib/dcc/base/result.rb +31 -0
- data/lib/dcc/base/result_list.rb +27 -0
- data/lib/dcc/base/rich_content.rb +34 -0
- data/lib/dcc/base/software.rb +35 -0
- data/lib/dcc/base/software_list.rb +27 -0
- data/lib/dcc/base/statement.rb +50 -0
- data/lib/dcc/base/statement_list.rb +27 -0
- data/lib/dcc/base/string_with_lang.rb +24 -0
- data/lib/dcc/base/text.rb +33 -0
- data/lib/dcc/base/used_method.rb +31 -0
- data/lib/dcc/base/used_method_list.rb +27 -0
- data/lib/dcc/base/xml_blob.rb +20 -0
- data/lib/dcc/base.rb +58 -0
- data/lib/dcc/builder/dsl.rb +10 -0
- data/lib/dcc/builder/session.rb +170 -0
- data/lib/dcc/builder.rb +34 -0
- data/lib/dcc/cli/cli.rb +149 -0
- data/lib/dcc/cli/formatters.rb +77 -0
- data/lib/dcc/cli.rb +7 -0
- data/lib/dcc/common_elements.rb +20 -0
- data/lib/dcc/context_configuration.rb +167 -0
- data/lib/dcc/context_options.rb +47 -0
- data/lib/dcc/convert/csv.rb +129 -0
- data/lib/dcc/convert/html.rb +127 -0
- data/lib/dcc/convert/json.rb +62 -0
- data/lib/dcc/convert/result.rb +51 -0
- data/lib/dcc/convert/yaml.rb +21 -0
- data/lib/dcc/convert.rb +14 -0
- data/lib/dcc/diff/change.rb +21 -0
- data/lib/dcc/diff/result.rb +58 -0
- data/lib/dcc/diff.rb +83 -0
- data/lib/dcc/error.rb +54 -0
- data/lib/dcc/extract/file.rb +143 -0
- data/lib/dcc/extract/ring.rb +28 -0
- data/lib/dcc/extract.rb +9 -0
- data/lib/dcc/i18n/text_lookup.rb +67 -0
- data/lib/dcc/i18n.rb +12 -0
- data/lib/dcc/inspect/report.rb +139 -0
- data/lib/dcc/inspect.rb +9 -0
- data/lib/dcc/migrate.rb +41 -0
- data/lib/dcc/namespace/dcc.rb +30 -0
- data/lib/dcc/namespace/dsig.rb +15 -0
- data/lib/dcc/namespace/math_ml.rb +14 -0
- data/lib/dcc/namespace/qudt.rb +15 -0
- data/lib/dcc/namespace/si.rb +26 -0
- data/lib/dcc/namespace.rb +18 -0
- data/lib/dcc/plugin/registry.rb +45 -0
- data/lib/dcc/plugin.rb +42 -0
- data/lib/dcc/quantity_format/formatter.rb +90 -0
- data/lib/dcc/quantity_format.rb +10 -0
- data/lib/dcc/quantity_math/quantity.rb +46 -0
- data/lib/dcc/quantity_math/real.rb +116 -0
- data/lib/dcc/quantity_math.rb +14 -0
- data/lib/dcc/schema/resources/dcc/dsi/v1.0.1.xsd +415 -0
- data/lib/dcc/schema/resources/dcc/dsi/v1.3.0.xsd +814 -0
- data/lib/dcc/schema/resources/dcc/dsi/v1.3.1.xsd +814 -0
- data/lib/dcc/schema/resources/dcc/dsi/v2.0.0.xsd +869 -0
- data/lib/dcc/schema/resources/dcc/dsi/v2.1.0.xsd +1031 -0
- data/lib/dcc/schema/resources/dcc/dsi/v2.2.1.xsd +1574 -0
- data/lib/dcc/schema/resources/dcc/qudt/v2.2.1.xsd +44 -0
- data/lib/dcc/schema/resources/dcc/v2.1.0/dcc.xsd +650 -0
- data/lib/dcc/schema/resources/dcc/v2.1.1/dcc.xsd +669 -0
- data/lib/dcc/schema/resources/dcc/v2.2.0/dcc.xsd +730 -0
- data/lib/dcc/schema/resources/dcc/v2.3.0/dcc.xsd +708 -0
- data/lib/dcc/schema/resources/dcc/v2.4.0/dcc.xsd +725 -0
- data/lib/dcc/schema/resources/dcc/v3.0.0/dcc.xsd +749 -0
- data/lib/dcc/schema/resources/dcc/v3.1.0/dcc.xsd +843 -0
- data/lib/dcc/schema/resources/dcc/v3.1.1/dcc.xsd +843 -0
- data/lib/dcc/schema/resources/dcc/v3.1.2/dcc.xsd +844 -0
- data/lib/dcc/schema/resources/dcc/v3.2.0/dcc.xsd +940 -0
- data/lib/dcc/schema/resources/dcc/v3.2.1/dcc.xsd +963 -0
- data/lib/dcc/schema/resources/dcc/v3.3.0/dcc.xsd +1008 -0
- data/lib/dcc/schema/resources/dcc/xmldsig-core-schema.xsd +312 -0
- data/lib/dcc/schema/resources/dsi/qudt/v2.2.1.xsd +44 -0
- data/lib/dcc/schema/resources/dsi/v1.0.1/SI_Format.xsd +415 -0
- data/lib/dcc/schema/resources/dsi/v1.3.0/SI_Format.xsd +814 -0
- data/lib/dcc/schema/resources/dsi/v1.3.1/SI_Format.xsd +814 -0
- data/lib/dcc/schema/resources/dsi/v2.0.0/SI_Format.xsd +869 -0
- data/lib/dcc/schema/resources/dsi/v2.1.0/SI_Format.xsd +1031 -0
- data/lib/dcc/schema/resources/dsi/v2.2.1/SI_Format.xsd +1574 -0
- data/lib/dcc/schema/resources/qudt/qudt.xsd +44 -0
- data/lib/dcc/schema/resources/schematron/dcc.sch +523 -0
- data/lib/dcc/schema/resources/schematron/dcc.svrl +2302 -0
- data/lib/dcc/schema/resources/xmldsig/xmldsig-core-schema.xsd +312 -0
- data/lib/dcc/schema/version.rb +94 -0
- data/lib/dcc/schema.rb +35 -0
- data/lib/dcc/server/app.rb +133 -0
- data/lib/dcc/server/storage/entry.rb +15 -0
- data/lib/dcc/server/storage/memory.rb +57 -0
- data/lib/dcc/server/storage.rb +13 -0
- data/lib/dcc/server.rb +33 -0
- data/lib/dcc/si/base/complex.rb +43 -0
- data/lib/dcc/si/base/complex_list_xml_list.rb +39 -0
- data/lib/dcc/si/base/constant.rb +39 -0
- data/lib/dcc/si/base/coverage_interval_mu.rb +31 -0
- data/lib/dcc/si/base/expanded_mu.rb +29 -0
- data/lib/dcc/si/base/expanded_unc_xml_list.rb +30 -0
- data/lib/dcc/si/base/hybrid.rb +42 -0
- data/lib/dcc/si/base/measurement_uncertainty_univariate.rb +28 -0
- data/lib/dcc/si/base/real.rb +48 -0
- data/lib/dcc/si/base/real_list_xml_list.rb +45 -0
- data/lib/dcc/si/base/si_list.rb +37 -0
- data/lib/dcc/si/base/standard_mu.rb +25 -0
- data/lib/dcc/si/base.rb +24 -0
- data/lib/dcc/si/common_elements.rb +13 -0
- data/lib/dcc/si/namespace.rb +7 -0
- data/lib/dcc/si/v1/common_elements.rb +13 -0
- data/lib/dcc/si/v1/complex.rb +8 -0
- data/lib/dcc/si/v1/complex_list_xml_list.rb +8 -0
- data/lib/dcc/si/v1/configuration.rb +13 -0
- data/lib/dcc/si/v1/constant.rb +8 -0
- data/lib/dcc/si/v1/coverage_interval_mu.rb +8 -0
- data/lib/dcc/si/v1/expanded_mu.rb +8 -0
- data/lib/dcc/si/v1/expanded_unc.rb +23 -0
- data/lib/dcc/si/v1/expanded_unc_xml_list.rb +8 -0
- data/lib/dcc/si/v1/hybrid.rb +8 -0
- data/lib/dcc/si/v1/measurement_uncertainty_univariate.rb +8 -0
- data/lib/dcc/si/v1/namespace.rb +9 -0
- data/lib/dcc/si/v1/real.rb +8 -0
- data/lib/dcc/si/v1/real_list_xml_list.rb +8 -0
- data/lib/dcc/si/v1/si_list.rb +8 -0
- data/lib/dcc/si/v1/standard_mu.rb +8 -0
- data/lib/dcc/si/v1.rb +46 -0
- data/lib/dcc/si/v2/common_elements.rb +13 -0
- data/lib/dcc/si/v2/complex.rb +8 -0
- data/lib/dcc/si/v2/complex_list_xml_list.rb +8 -0
- data/lib/dcc/si/v2/configuration.rb +13 -0
- data/lib/dcc/si/v2/constant.rb +8 -0
- data/lib/dcc/si/v2/coverage_interval_mu.rb +8 -0
- data/lib/dcc/si/v2/coverage_interval_mu_xml_list.rb +24 -0
- data/lib/dcc/si/v2/expanded_mu.rb +8 -0
- data/lib/dcc/si/v2/expanded_mu_xml_list.rb +22 -0
- data/lib/dcc/si/v2/expanded_unc_xml_list.rb +8 -0
- data/lib/dcc/si/v2/hybrid.rb +8 -0
- data/lib/dcc/si/v2/measurement_uncertainty_univariate.rb +8 -0
- data/lib/dcc/si/v2/namespace.rb +9 -0
- data/lib/dcc/si/v2/real.rb +8 -0
- data/lib/dcc/si/v2/real_list_xml_list.rb +8 -0
- data/lib/dcc/si/v2/si_list.rb +8 -0
- data/lib/dcc/si/v2/standard_mu.rb +8 -0
- data/lib/dcc/si/v2/standard_mu_xml_list.rb +18 -0
- data/lib/dcc/si/v2.rb +49 -0
- data/lib/dcc/si.rb +34 -0
- data/lib/dcc/signature/result.rb +43 -0
- data/lib/dcc/signature/signer.rb +36 -0
- data/lib/dcc/signature/verifier.rb +41 -0
- data/lib/dcc/signature.rb +13 -0
- data/lib/dcc/transform/result.rb +24 -0
- data/lib/dcc/transform/xslt.rb +72 -0
- data/lib/dcc/transform.rb +12 -0
- data/lib/dcc/type/base64_binary.rb +55 -0
- data/lib/dcc/type/decimal_xml_list.rb +47 -0
- data/lib/dcc/type/iso_country_code.rb +23 -0
- data/lib/dcc/type/iso_language_code.rb +23 -0
- data/lib/dcc/type/schema_version.rb +37 -0
- data/lib/dcc/type/si_unit.rb +26 -0
- data/lib/dcc/type.rb +16 -0
- data/lib/dcc/type_guards.rb +140 -0
- data/lib/dcc/v2/administrative_data.rb +8 -0
- data/lib/dcc/v2/byte_data.rb +8 -0
- data/lib/dcc/v2/calibration_laboratory.rb +8 -0
- data/lib/dcc/v2/comment.rb +8 -0
- data/lib/dcc/v2/common_elements.rb +13 -0
- data/lib/dcc/v2/condition.rb +8 -0
- data/lib/dcc/v2/configuration.rb +17 -0
- data/lib/dcc/v2/contact.rb +8 -0
- data/lib/dcc/v2/contact_not_strict.rb +8 -0
- data/lib/dcc/v2/core_data.rb +8 -0
- data/lib/dcc/v2/data.rb +8 -0
- data/lib/dcc/v2/digital_calibration_certificate.rb +8 -0
- data/lib/dcc/v2/equipment_class.rb +8 -0
- data/lib/dcc/v2/formula.rb +8 -0
- data/lib/dcc/v2/hash_type.rb +8 -0
- data/lib/dcc/v2/identification.rb +8 -0
- data/lib/dcc/v2/identifications.rb +8 -0
- data/lib/dcc/v2/influence_condition.rb +7 -0
- data/lib/dcc/v2/influence_condition_list.rb +8 -0
- data/lib/dcc/v2/item.rb +8 -0
- data/lib/dcc/v2/item_list.rb +8 -0
- data/lib/dcc/v2/list.rb +8 -0
- data/lib/dcc/v2/location.rb +8 -0
- data/lib/dcc/v2/measurement_meta_data.rb +8 -0
- data/lib/dcc/v2/measurement_meta_data_list.rb +8 -0
- data/lib/dcc/v2/measurement_result.rb +8 -0
- data/lib/dcc/v2/measurement_result_list.rb +8 -0
- data/lib/dcc/v2/measuring_equipment.rb +8 -0
- data/lib/dcc/v2/measuring_equipment_list.rb +8 -0
- data/lib/dcc/v2/namespace.rb +8 -0
- data/lib/dcc/v2/quantity.rb +49 -0
- data/lib/dcc/v2/ref_type_definition.rb +11 -0
- data/lib/dcc/v2/ref_type_definition_list.rb +15 -0
- data/lib/dcc/v2/resp_person.rb +8 -0
- data/lib/dcc/v2/resp_person_list.rb +8 -0
- data/lib/dcc/v2/result.rb +8 -0
- data/lib/dcc/v2/result_list.rb +8 -0
- data/lib/dcc/v2/rich_content.rb +12 -0
- data/lib/dcc/v2/software.rb +8 -0
- data/lib/dcc/v2/software_list.rb +8 -0
- data/lib/dcc/v2/statement.rb +8 -0
- data/lib/dcc/v2/statement_list.rb +8 -0
- data/lib/dcc/v2/string_with_lang.rb +8 -0
- data/lib/dcc/v2/text.rb +8 -0
- data/lib/dcc/v2/used_method.rb +8 -0
- data/lib/dcc/v2/used_method_list.rb +8 -0
- data/lib/dcc/v2/xml_blob.rb +8 -0
- data/lib/dcc/v2.rb +84 -0
- data/lib/dcc/v3/administrative_data.rb +8 -0
- data/lib/dcc/v3/byte_data.rb +8 -0
- data/lib/dcc/v3/calibration_laboratory.rb +8 -0
- data/lib/dcc/v3/comment.rb +8 -0
- data/lib/dcc/v3/common_elements.rb +11 -0
- data/lib/dcc/v3/condition.rb +8 -0
- data/lib/dcc/v3/configuration.rb +17 -0
- data/lib/dcc/v3/contact.rb +8 -0
- data/lib/dcc/v3/contact_not_strict.rb +8 -0
- data/lib/dcc/v3/core_data.rb +8 -0
- data/lib/dcc/v3/data.rb +8 -0
- data/lib/dcc/v3/digital_calibration_certificate.rb +8 -0
- data/lib/dcc/v3/equipment_class.rb +8 -0
- data/lib/dcc/v3/formula.rb +8 -0
- data/lib/dcc/v3/hash_type.rb +8 -0
- data/lib/dcc/v3/identification.rb +8 -0
- data/lib/dcc/v3/identifications.rb +8 -0
- data/lib/dcc/v3/influence_condition.rb +7 -0
- data/lib/dcc/v3/influence_condition_list.rb +8 -0
- data/lib/dcc/v3/item.rb +8 -0
- data/lib/dcc/v3/item_list.rb +8 -0
- data/lib/dcc/v3/list.rb +8 -0
- data/lib/dcc/v3/location.rb +8 -0
- data/lib/dcc/v3/measurement_meta_data.rb +8 -0
- data/lib/dcc/v3/measurement_meta_data_list.rb +8 -0
- data/lib/dcc/v3/measurement_result.rb +8 -0
- data/lib/dcc/v3/measurement_result_list.rb +8 -0
- data/lib/dcc/v3/measuring_equipment.rb +8 -0
- data/lib/dcc/v3/measuring_equipment_list.rb +8 -0
- data/lib/dcc/v3/namespace.rb +7 -0
- data/lib/dcc/v3/quantity.rb +49 -0
- data/lib/dcc/v3/ref_type_definition.rb +8 -0
- data/lib/dcc/v3/ref_type_definition_list.rb +8 -0
- data/lib/dcc/v3/resp_person.rb +8 -0
- data/lib/dcc/v3/resp_person_list.rb +8 -0
- data/lib/dcc/v3/result.rb +8 -0
- data/lib/dcc/v3/result_list.rb +8 -0
- data/lib/dcc/v3/rich_content.rb +8 -0
- data/lib/dcc/v3/software.rb +8 -0
- data/lib/dcc/v3/software_list.rb +8 -0
- data/lib/dcc/v3/statement.rb +8 -0
- data/lib/dcc/v3/statement_list.rb +8 -0
- data/lib/dcc/v3/string_with_lang.rb +8 -0
- data/lib/dcc/v3/text.rb +8 -0
- data/lib/dcc/v3/used_method.rb +8 -0
- data/lib/dcc/v3/used_method_list.rb +8 -0
- data/lib/dcc/v3/xml_blob.rb +8 -0
- data/lib/dcc/v3.rb +111 -0
- data/lib/dcc/validate/business_rules.rb +121 -0
- data/lib/dcc/validate/issue.rb +56 -0
- data/lib/dcc/validate/result.rb +105 -0
- data/lib/dcc/validate/schematron/profile.rb +64 -0
- data/lib/dcc/validate/schematron/rule.rb +49 -0
- data/lib/dcc/validate/schematron/rules/administrative_data_completeness.rb +42 -0
- data/lib/dcc/validate/schematron/rules/base.rb +15 -0
- data/lib/dcc/validate/schematron/rules/date_range_check.rb +41 -0
- data/lib/dcc/validate/schematron/rules/id_refid_linking.rb +61 -0
- data/lib/dcc/validate/schematron/rules/influence_conditions_placement.rb +58 -0
- data/lib/dcc/validate/schematron/rules/iso_code_validation.rb +53 -0
- data/lib/dcc/validate/schematron/rules/language_code_dedup.rb +39 -0
- data/lib/dcc/validate/schematron/rules/non_si_declaration.rb +82 -0
- data/lib/dcc/validate/schematron/rules/release_format_check.rb +44 -0
- data/lib/dcc/validate/schematron/rules/schema_version_check.rb +31 -0
- data/lib/dcc/validate/schematron/rules/uncertainty_consistency.rb +58 -0
- data/lib/dcc/validate/schematron/rules/unit_format_check.rb +74 -0
- data/lib/dcc/validate/schematron/rules/used_methods_placement.rb +65 -0
- data/lib/dcc/validate/schematron/rules/used_software_placement.rb +43 -0
- data/lib/dcc/validate/schematron/rules/xml_list_spacing.rb +42 -0
- data/lib/dcc/validate/schematron/rules.rb +30 -0
- data/lib/dcc/validate/schematron.rb +22 -0
- data/lib/dcc/validate/severity.rb +39 -0
- data/lib/dcc/validate/xsd.rb +97 -0
- data/lib/dcc/validate.rb +15 -0
- data/lib/dcc/version.rb +5 -0
- data/lib/dcc/versioned_parser.rb +48 -0
- data/lib/dcc.rb +141 -0
- metadata +425 -0
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
2
|
+
|
|
3
|
+
<!-- Schema for XML Signatures
|
|
4
|
+
http://www.w3.org/2000/09/xmldsig#
|
|
5
|
+
$Revision: 1.2 $ on $Date: 2013-04-16 12:48:49 $ by $Author: denis $
|
|
6
|
+
|
|
7
|
+
Copyright 2001 The Internet Society and W3C (Massachusetts Institute
|
|
8
|
+
of Technology, Institut National de Recherche en Informatique et en
|
|
9
|
+
Automatique, Keio University). All Rights Reserved.
|
|
10
|
+
http://www.w3.org/Consortium/Legal/
|
|
11
|
+
|
|
12
|
+
This document is governed by the W3C Software License [1] as described
|
|
13
|
+
in the FAQ [2].
|
|
14
|
+
|
|
15
|
+
[1] http://www.w3.org/Consortium/Legal/copyright-software-19980720
|
|
16
|
+
[2] http://www.w3.org/Consortium/Legal/IPR-FAQ-20000620.html#DTD
|
|
17
|
+
|
|
18
|
+
Modification by PTB:
|
|
19
|
+
- Removed lines 2 to 10 from W3C XMLDSig-Core scheme to avoid the use of DTD due to security risk.
|
|
20
|
+
-->
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
<schema xmlns="http://www.w3.org/2001/XMLSchema"
|
|
24
|
+
xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
|
|
25
|
+
targetNamespace="http://www.w3.org/2000/09/xmldsig#"
|
|
26
|
+
version="0.1" elementFormDefault="qualified">
|
|
27
|
+
|
|
28
|
+
<!-- Basic Types Defined for Signatures -->
|
|
29
|
+
|
|
30
|
+
<simpleType name="CryptoBinary">
|
|
31
|
+
<restriction base="base64Binary">
|
|
32
|
+
</restriction>
|
|
33
|
+
</simpleType>
|
|
34
|
+
|
|
35
|
+
<!-- Start Signature -->
|
|
36
|
+
|
|
37
|
+
<element name="Signature" type="ds:SignatureType"/>
|
|
38
|
+
<complexType name="SignatureType">
|
|
39
|
+
<sequence>
|
|
40
|
+
<element ref="ds:SignedInfo"/>
|
|
41
|
+
<element ref="ds:SignatureValue"/>
|
|
42
|
+
<element ref="ds:KeyInfo" minOccurs="0"/>
|
|
43
|
+
<element ref="ds:Object" minOccurs="0" maxOccurs="unbounded"/>
|
|
44
|
+
</sequence>
|
|
45
|
+
<attribute name="Id" type="ID" use="optional"/>
|
|
46
|
+
</complexType>
|
|
47
|
+
|
|
48
|
+
<element name="SignatureValue" type="ds:SignatureValueType"/>
|
|
49
|
+
<complexType name="SignatureValueType">
|
|
50
|
+
<simpleContent>
|
|
51
|
+
<extension base="base64Binary">
|
|
52
|
+
<attribute name="Id" type="ID" use="optional"/>
|
|
53
|
+
</extension>
|
|
54
|
+
</simpleContent>
|
|
55
|
+
</complexType>
|
|
56
|
+
|
|
57
|
+
<!-- Start SignedInfo -->
|
|
58
|
+
|
|
59
|
+
<element name="SignedInfo" type="ds:SignedInfoType"/>
|
|
60
|
+
<complexType name="SignedInfoType">
|
|
61
|
+
<sequence>
|
|
62
|
+
<element ref="ds:CanonicalizationMethod"/>
|
|
63
|
+
<element ref="ds:SignatureMethod"/>
|
|
64
|
+
<element ref="ds:Reference" maxOccurs="unbounded"/>
|
|
65
|
+
</sequence>
|
|
66
|
+
<attribute name="Id" type="ID" use="optional"/>
|
|
67
|
+
</complexType>
|
|
68
|
+
|
|
69
|
+
<element name="CanonicalizationMethod" type="ds:CanonicalizationMethodType"/>
|
|
70
|
+
<complexType name="CanonicalizationMethodType" mixed="true">
|
|
71
|
+
<sequence>
|
|
72
|
+
<any namespace="##any" minOccurs="0" maxOccurs="unbounded"/>
|
|
73
|
+
<!-- (0,unbounded) elements from (1,1) namespace -->
|
|
74
|
+
</sequence>
|
|
75
|
+
<attribute name="Algorithm" type="anyURI" use="required"/>
|
|
76
|
+
</complexType>
|
|
77
|
+
|
|
78
|
+
<element name="SignatureMethod" type="ds:SignatureMethodType"/>
|
|
79
|
+
<complexType name="SignatureMethodType" mixed="true">
|
|
80
|
+
<sequence>
|
|
81
|
+
<element name="HMACOutputLength" minOccurs="0" type="ds:HMACOutputLengthType"/>
|
|
82
|
+
<any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
|
|
83
|
+
<!-- (0,unbounded) elements from (1,1) external namespace -->
|
|
84
|
+
</sequence>
|
|
85
|
+
<attribute name="Algorithm" type="anyURI" use="required"/>
|
|
86
|
+
</complexType>
|
|
87
|
+
|
|
88
|
+
<!-- Start Reference -->
|
|
89
|
+
|
|
90
|
+
<element name="Reference" type="ds:ReferenceType"/>
|
|
91
|
+
<complexType name="ReferenceType">
|
|
92
|
+
<sequence>
|
|
93
|
+
<element ref="ds:Transforms" minOccurs="0"/>
|
|
94
|
+
<element ref="ds:DigestMethod"/>
|
|
95
|
+
<element ref="ds:DigestValue"/>
|
|
96
|
+
</sequence>
|
|
97
|
+
<attribute name="Id" type="ID" use="optional"/>
|
|
98
|
+
<attribute name="URI" type="anyURI" use="optional"/>
|
|
99
|
+
<attribute name="Type" type="anyURI" use="optional"/>
|
|
100
|
+
</complexType>
|
|
101
|
+
|
|
102
|
+
<element name="Transforms" type="ds:TransformsType"/>
|
|
103
|
+
<complexType name="TransformsType">
|
|
104
|
+
<sequence>
|
|
105
|
+
<element ref="ds:Transform" maxOccurs="unbounded"/>
|
|
106
|
+
</sequence>
|
|
107
|
+
</complexType>
|
|
108
|
+
|
|
109
|
+
<element name="Transform" type="ds:TransformType"/>
|
|
110
|
+
<complexType name="TransformType" mixed="true">
|
|
111
|
+
<choice minOccurs="0" maxOccurs="unbounded">
|
|
112
|
+
<any namespace="##other" processContents="lax"/>
|
|
113
|
+
<!-- (1,1) elements from (0,unbounded) namespaces -->
|
|
114
|
+
<element name="XPath" type="string"/>
|
|
115
|
+
</choice>
|
|
116
|
+
<attribute name="Algorithm" type="anyURI" use="required"/>
|
|
117
|
+
</complexType>
|
|
118
|
+
|
|
119
|
+
<!-- End Reference -->
|
|
120
|
+
|
|
121
|
+
<element name="DigestMethod" type="ds:DigestMethodType"/>
|
|
122
|
+
<complexType name="DigestMethodType" mixed="true">
|
|
123
|
+
<sequence>
|
|
124
|
+
<any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
|
|
125
|
+
</sequence>
|
|
126
|
+
<attribute name="Algorithm" type="anyURI" use="required"/>
|
|
127
|
+
</complexType>
|
|
128
|
+
|
|
129
|
+
<element name="DigestValue" type="ds:DigestValueType"/>
|
|
130
|
+
<simpleType name="DigestValueType">
|
|
131
|
+
<restriction base="base64Binary"/>
|
|
132
|
+
</simpleType>
|
|
133
|
+
|
|
134
|
+
<!-- End SignedInfo -->
|
|
135
|
+
|
|
136
|
+
<!-- Start KeyInfo -->
|
|
137
|
+
|
|
138
|
+
<element name="KeyInfo" type="ds:KeyInfoType"/>
|
|
139
|
+
<complexType name="KeyInfoType" mixed="true">
|
|
140
|
+
<choice maxOccurs="unbounded">
|
|
141
|
+
<element ref="ds:KeyName"/>
|
|
142
|
+
<element ref="ds:KeyValue"/>
|
|
143
|
+
<element ref="ds:RetrievalMethod"/>
|
|
144
|
+
<element ref="ds:X509Data"/>
|
|
145
|
+
<element ref="ds:PGPData"/>
|
|
146
|
+
<element ref="ds:SPKIData"/>
|
|
147
|
+
<element ref="ds:MgmtData"/>
|
|
148
|
+
<any processContents="lax" namespace="##other"/>
|
|
149
|
+
<!-- (1,1) elements from (0,unbounded) namespaces -->
|
|
150
|
+
</choice>
|
|
151
|
+
<attribute name="Id" type="ID" use="optional"/>
|
|
152
|
+
</complexType>
|
|
153
|
+
|
|
154
|
+
<element name="KeyName" type="string"/>
|
|
155
|
+
<element name="MgmtData" type="string"/>
|
|
156
|
+
|
|
157
|
+
<element name="KeyValue" type="ds:KeyValueType"/>
|
|
158
|
+
<complexType name="KeyValueType" mixed="true">
|
|
159
|
+
<choice>
|
|
160
|
+
<element ref="ds:DSAKeyValue"/>
|
|
161
|
+
<element ref="ds:RSAKeyValue"/>
|
|
162
|
+
<any namespace="##other" processContents="lax"/>
|
|
163
|
+
</choice>
|
|
164
|
+
</complexType>
|
|
165
|
+
|
|
166
|
+
<element name="RetrievalMethod" type="ds:RetrievalMethodType"/>
|
|
167
|
+
<complexType name="RetrievalMethodType">
|
|
168
|
+
<sequence>
|
|
169
|
+
<element ref="ds:Transforms" minOccurs="0"/>
|
|
170
|
+
</sequence>
|
|
171
|
+
<attribute name="URI" type="anyURI"/>
|
|
172
|
+
<attribute name="Type" type="anyURI" use="optional"/>
|
|
173
|
+
</complexType>
|
|
174
|
+
|
|
175
|
+
<!-- Start X509Data -->
|
|
176
|
+
|
|
177
|
+
<element name="X509Data" type="ds:X509DataType"/>
|
|
178
|
+
<complexType name="X509DataType">
|
|
179
|
+
<sequence maxOccurs="unbounded">
|
|
180
|
+
<choice>
|
|
181
|
+
<element name="X509IssuerSerial" type="ds:X509IssuerSerialType"/>
|
|
182
|
+
<element name="X509SKI" type="base64Binary"/>
|
|
183
|
+
<element name="X509SubjectName" type="string"/>
|
|
184
|
+
<element name="X509Certificate" type="base64Binary"/>
|
|
185
|
+
<element name="X509CRL" type="base64Binary"/>
|
|
186
|
+
<any namespace="##other" processContents="lax"/>
|
|
187
|
+
</choice>
|
|
188
|
+
</sequence>
|
|
189
|
+
</complexType>
|
|
190
|
+
|
|
191
|
+
<complexType name="X509IssuerSerialType">
|
|
192
|
+
<sequence>
|
|
193
|
+
<element name="X509IssuerName" type="string"/>
|
|
194
|
+
<element name="X509SerialNumber" type="integer"/>
|
|
195
|
+
</sequence>
|
|
196
|
+
</complexType>
|
|
197
|
+
|
|
198
|
+
<!-- End X509Data -->
|
|
199
|
+
|
|
200
|
+
<!-- Begin PGPData -->
|
|
201
|
+
|
|
202
|
+
<element name="PGPData" type="ds:PGPDataType"/>
|
|
203
|
+
<complexType name="PGPDataType">
|
|
204
|
+
<choice>
|
|
205
|
+
<sequence>
|
|
206
|
+
<element name="PGPKeyID" type="base64Binary"/>
|
|
207
|
+
<element name="PGPKeyPacket" type="base64Binary" minOccurs="0"/>
|
|
208
|
+
<any namespace="##other" processContents="lax" minOccurs="0"
|
|
209
|
+
maxOccurs="unbounded"/>
|
|
210
|
+
</sequence>
|
|
211
|
+
<sequence>
|
|
212
|
+
<element name="PGPKeyPacket" type="base64Binary"/>
|
|
213
|
+
<any namespace="##other" processContents="lax" minOccurs="0"
|
|
214
|
+
maxOccurs="unbounded"/>
|
|
215
|
+
</sequence>
|
|
216
|
+
</choice>
|
|
217
|
+
</complexType>
|
|
218
|
+
|
|
219
|
+
<!-- End PGPData -->
|
|
220
|
+
|
|
221
|
+
<!-- Begin SPKIData -->
|
|
222
|
+
|
|
223
|
+
<element name="SPKIData" type="ds:SPKIDataType"/>
|
|
224
|
+
<complexType name="SPKIDataType">
|
|
225
|
+
<sequence maxOccurs="unbounded">
|
|
226
|
+
<element name="SPKISexp" type="base64Binary"/>
|
|
227
|
+
<any namespace="##other" processContents="lax" minOccurs="0"/>
|
|
228
|
+
</sequence>
|
|
229
|
+
</complexType>
|
|
230
|
+
|
|
231
|
+
<!-- End SPKIData -->
|
|
232
|
+
|
|
233
|
+
<!-- End KeyInfo -->
|
|
234
|
+
|
|
235
|
+
<!-- Start Object (Manifest, SignatureProperty) -->
|
|
236
|
+
|
|
237
|
+
<element name="Object" type="ds:ObjectType"/>
|
|
238
|
+
<complexType name="ObjectType" mixed="true">
|
|
239
|
+
<sequence minOccurs="0" maxOccurs="unbounded">
|
|
240
|
+
<any namespace="##any" processContents="lax"/>
|
|
241
|
+
</sequence>
|
|
242
|
+
<attribute name="Id" type="ID" use="optional"/>
|
|
243
|
+
<attribute name="MimeType" type="string" use="optional"/> <!-- add a grep facet -->
|
|
244
|
+
<attribute name="Encoding" type="anyURI" use="optional"/>
|
|
245
|
+
</complexType>
|
|
246
|
+
|
|
247
|
+
<element name="Manifest" type="ds:ManifestType"/>
|
|
248
|
+
<complexType name="ManifestType">
|
|
249
|
+
<sequence>
|
|
250
|
+
<element ref="ds:Reference" maxOccurs="unbounded"/>
|
|
251
|
+
</sequence>
|
|
252
|
+
<attribute name="Id" type="ID" use="optional"/>
|
|
253
|
+
</complexType>
|
|
254
|
+
|
|
255
|
+
<element name="SignatureProperties" type="ds:SignaturePropertiesType"/>
|
|
256
|
+
<complexType name="SignaturePropertiesType">
|
|
257
|
+
<sequence>
|
|
258
|
+
<element ref="ds:SignatureProperty" maxOccurs="unbounded"/>
|
|
259
|
+
</sequence>
|
|
260
|
+
<attribute name="Id" type="ID" use="optional"/>
|
|
261
|
+
</complexType>
|
|
262
|
+
|
|
263
|
+
<element name="SignatureProperty" type="ds:SignaturePropertyType"/>
|
|
264
|
+
<complexType name="SignaturePropertyType" mixed="true">
|
|
265
|
+
<choice maxOccurs="unbounded">
|
|
266
|
+
<any namespace="##other" processContents="lax"/>
|
|
267
|
+
<!-- (1,1) elements from (1,unbounded) namespaces -->
|
|
268
|
+
</choice>
|
|
269
|
+
<attribute name="Target" type="anyURI" use="required"/>
|
|
270
|
+
<attribute name="Id" type="ID" use="optional"/>
|
|
271
|
+
</complexType>
|
|
272
|
+
|
|
273
|
+
<!-- End Object (Manifest, SignatureProperty) -->
|
|
274
|
+
|
|
275
|
+
<!-- Start Algorithm Parameters -->
|
|
276
|
+
|
|
277
|
+
<simpleType name="HMACOutputLengthType">
|
|
278
|
+
<restriction base="integer"/>
|
|
279
|
+
</simpleType>
|
|
280
|
+
|
|
281
|
+
<!-- Start KeyValue Element-types -->
|
|
282
|
+
|
|
283
|
+
<element name="DSAKeyValue" type="ds:DSAKeyValueType"/>
|
|
284
|
+
<complexType name="DSAKeyValueType">
|
|
285
|
+
<sequence>
|
|
286
|
+
<sequence minOccurs="0">
|
|
287
|
+
<element name="P" type="ds:CryptoBinary"/>
|
|
288
|
+
<element name="Q" type="ds:CryptoBinary"/>
|
|
289
|
+
</sequence>
|
|
290
|
+
<element name="G" type="ds:CryptoBinary" minOccurs="0"/>
|
|
291
|
+
<element name="Y" type="ds:CryptoBinary"/>
|
|
292
|
+
<element name="J" type="ds:CryptoBinary" minOccurs="0"/>
|
|
293
|
+
<sequence minOccurs="0">
|
|
294
|
+
<element name="Seed" type="ds:CryptoBinary"/>
|
|
295
|
+
<element name="PgenCounter" type="ds:CryptoBinary"/>
|
|
296
|
+
</sequence>
|
|
297
|
+
</sequence>
|
|
298
|
+
</complexType>
|
|
299
|
+
|
|
300
|
+
<element name="RSAKeyValue" type="ds:RSAKeyValueType"/>
|
|
301
|
+
<complexType name="RSAKeyValueType">
|
|
302
|
+
<sequence>
|
|
303
|
+
<element name="Modulus" type="ds:CryptoBinary"/>
|
|
304
|
+
<element name="Exponent" type="ds:CryptoBinary"/>
|
|
305
|
+
</sequence>
|
|
306
|
+
</complexType>
|
|
307
|
+
|
|
308
|
+
<!-- End KeyValue Element-types -->
|
|
309
|
+
|
|
310
|
+
<!-- End Signature -->
|
|
311
|
+
|
|
312
|
+
</schema>
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# `Dcc::Schema::Version` enumerates the bundled DCC and D-SI schema versions
|
|
4
|
+
# and provides lookup helpers. Versions are stored as Strings in semver form
|
|
5
|
+
# (e.g. `"3.3.0"`) with an optional `"v"` prefix tolerated on input.
|
|
6
|
+
module Dcc
|
|
7
|
+
module Schema
|
|
8
|
+
module Version
|
|
9
|
+
DCC_ALL = %w[
|
|
10
|
+
2.1.0 2.1.1 2.2.0 2.3.0 2.4.0
|
|
11
|
+
3.0.0 3.1.0 3.1.1 3.1.2 3.2.0 3.2.1 3.3.0
|
|
12
|
+
].freeze
|
|
13
|
+
|
|
14
|
+
DCC_LATEST = "3.3.0"
|
|
15
|
+
DCC_DEFAULT = DCC_LATEST
|
|
16
|
+
|
|
17
|
+
DSI_ALL = %w[
|
|
18
|
+
1.0.1 1.3.0 1.3.1 2.0.0 2.1.0 2.2.1
|
|
19
|
+
].freeze
|
|
20
|
+
|
|
21
|
+
DSI_LATEST = "2.2.1"
|
|
22
|
+
DSI_DEFAULT = DSI_LATEST
|
|
23
|
+
|
|
24
|
+
QUDT_VERSION = "2.2.1"
|
|
25
|
+
|
|
26
|
+
class << self
|
|
27
|
+
# Normalize a version input to a bare `"X.Y.Z"` String.
|
|
28
|
+
# @param v [String, Symbol] e.g. `:v3_3_0`, `"3.3.0"`, `"v3.3.0"`.
|
|
29
|
+
# @return [String, nil]
|
|
30
|
+
def normalize(v)
|
|
31
|
+
return nil if v.nil?
|
|
32
|
+
|
|
33
|
+
s = v.to_s.sub(/\Av/, "").gsub(/_/, ".")
|
|
34
|
+
s.empty? ? nil : s
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# @param v [String, Symbol] candidate version.
|
|
38
|
+
# @return [Boolean] whether the version is a known DCC release.
|
|
39
|
+
def dcc?(v)
|
|
40
|
+
DCC_ALL.include?(normalize(v))
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# @param v [String, Symbol] candidate version.
|
|
44
|
+
# @return [Boolean] whether the version is a known D-SI release.
|
|
45
|
+
def dsi?(v)
|
|
46
|
+
DSI_ALL.include?(normalize(v))
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Major version of a semver string (`"3.3.0"` → `3`).
|
|
50
|
+
def major(v)
|
|
51
|
+
Integer(normalize(v).split(".").first)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Resolve `:auto`, `nil`, `"latest"`, or a specific version string to
|
|
55
|
+
# a concrete DCC version. The `:auto` strategy reads `schemaVersion`
|
|
56
|
+
# from the XML body.
|
|
57
|
+
def resolve_dcc(version, xml: nil)
|
|
58
|
+
v = normalize(version)
|
|
59
|
+
return detect_from_xml(xml) if v.nil? || v == "auto"
|
|
60
|
+
return DCC_LATEST if v == "latest"
|
|
61
|
+
|
|
62
|
+
unless dcc?(v)
|
|
63
|
+
raise ::Dcc::UnknownVersionError,
|
|
64
|
+
"Unknown DCC schema version: #{version.inspect}"
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
v
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def resolve_dsi(version, xml: nil)
|
|
71
|
+
v = normalize(version)
|
|
72
|
+
return DSI_LATEST if v.nil? || v == "auto" || v == "latest"
|
|
73
|
+
|
|
74
|
+
unless dsi?(v)
|
|
75
|
+
raise ::Dcc::UnknownVersionError,
|
|
76
|
+
"Unknown D-SI schema version: #{version.inspect}"
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
v
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# Extract the `schemaVersion` attribute from an XML string.
|
|
83
|
+
# @return [String, nil]
|
|
84
|
+
def detect_from_xml(xml)
|
|
85
|
+
return nil unless xml
|
|
86
|
+
|
|
87
|
+
str = ::Dcc.read_input(xml)
|
|
88
|
+
match = str.match(/schemaVersion\s*=\s*["']([^"']+)["']/)
|
|
89
|
+
match && match[1]
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
data/lib/dcc/schema.rb
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# `Dcc::Schema` provides access to the bundled XSD, Schematron, and QUDT
|
|
4
|
+
# resources that ship with the gem under `lib/dcc/schema/resources/`.
|
|
5
|
+
#
|
|
6
|
+
# Use `Dcc::Schema.path("dcc/v3.3.0/dcc.xsd")` to get the absolute filesystem
|
|
7
|
+
# path of a bundled resource. Use `Dcc::Schema::Version` for the canonical
|
|
8
|
+
# list of supported versions.
|
|
9
|
+
module Dcc
|
|
10
|
+
module Schema
|
|
11
|
+
RESOURCES_DIR = File.expand_path("schema/resources", __dir__).freeze
|
|
12
|
+
|
|
13
|
+
autoload :Version, "dcc/schema/version"
|
|
14
|
+
|
|
15
|
+
class << self
|
|
16
|
+
# @param relative_path [String, Array<String>] resource path relative to
|
|
17
|
+
# `lib/dcc/schema/resources/`, e.g. `"dcc/v3.3.0/dcc.xsd"`.
|
|
18
|
+
# @return [String] absolute filesystem path.
|
|
19
|
+
def path(relative_path)
|
|
20
|
+
File.join(RESOURCES_DIR, *Array(relative_path))
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# @return [Boolean] whether the bundled resource exists.
|
|
24
|
+
def exists?(relative_path)
|
|
25
|
+
File.file?(path(relative_path))
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Read a bundled resource's contents.
|
|
29
|
+
# @return [String]
|
|
30
|
+
def read(relative_path)
|
|
31
|
+
File.read(path(relative_path))
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Loads Sinatra lazily so the gem works without it installed.
|
|
4
|
+
begin
|
|
5
|
+
require "sinatra/base"
|
|
6
|
+
SINATRA_AVAILABLE = true
|
|
7
|
+
rescue ::LoadError
|
|
8
|
+
SINATRA_AVAILABLE = false
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
module Dcc
|
|
12
|
+
module Server
|
|
13
|
+
# Sinatra application exposing the DCC REST API. Mirrors PTB dcclib's
|
|
14
|
+
# endpoints: POST /dccs, GET /dccs/:id, DELETE /dccs/:id,
|
|
15
|
+
# POST /dccs/:id/validate/{xsd,schematron}, /convert/json,
|
|
16
|
+
# /extract/{files,formulae}, /signature, /transform/xslt.
|
|
17
|
+
#
|
|
18
|
+
# Run via:
|
|
19
|
+
# require "dcc/server"
|
|
20
|
+
# Dcc::Server::App.run!
|
|
21
|
+
class App < ::Sinatra::Base
|
|
22
|
+
before do
|
|
23
|
+
content_type :json
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Storage instance — override in config.ru for production swaps.
|
|
27
|
+
set :storage, ::Dcc::Server::Storage::Memory.new
|
|
28
|
+
|
|
29
|
+
get "/" do
|
|
30
|
+
{
|
|
31
|
+
title: "dcc gem REST API",
|
|
32
|
+
version: ::Dcc::VERSION,
|
|
33
|
+
endpoints: [
|
|
34
|
+
"POST /dccs",
|
|
35
|
+
"GET /dccs/:id",
|
|
36
|
+
"DELETE /dccs/:id",
|
|
37
|
+
"POST /dccs/:id/validate/xsd",
|
|
38
|
+
"POST /dccs/:id/validate/schematron",
|
|
39
|
+
"POST /dccs/:id/convert/json",
|
|
40
|
+
"GET /dccs/:id/extract/files",
|
|
41
|
+
"POST /dccs/:id/transform/xslt",
|
|
42
|
+
],
|
|
43
|
+
}.to_json
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
post "/dccs" do
|
|
47
|
+
ensure_loaded!
|
|
48
|
+
body = JSON.parse(request.body.read)
|
|
49
|
+
xml = body.fetch("xml")
|
|
50
|
+
entry = settings.storage.put(xml)
|
|
51
|
+
status 201
|
|
52
|
+
{ id: entry.id, expires: entry.expires_at }.to_json
|
|
53
|
+
rescue ::KeyError
|
|
54
|
+
status 400
|
|
55
|
+
{ error: "missing 'xml' in request body" }.to_json
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
get "/dccs/:id" do
|
|
59
|
+
entry = settings.storage.get(params[:id])
|
|
60
|
+
halt 404, { error: "not found" }.to_json unless entry
|
|
61
|
+
|
|
62
|
+
{ id: entry.id, xml: entry.xml, expires: entry.expires_at }.to_json
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
delete "/dccs/:id" do
|
|
66
|
+
deleted = settings.storage.delete(params[:id])
|
|
67
|
+
halt 404, { error: "not found" }.to_json unless deleted
|
|
68
|
+
|
|
69
|
+
status 204
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
post "/dccs/:id/validate/xsd" do
|
|
73
|
+
result = with_dcc(params[:id]) { |xml| ::Dcc::Validate::Xsd.call(xml) }
|
|
74
|
+
result.to_json
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
post "/dccs/:id/validate/schematron" do
|
|
78
|
+
result = with_dcc(params[:id]) { |xml| ::Dcc::Validate::Schematron.call(::Dcc.parse(xml)) }
|
|
79
|
+
result.to_json
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
post "/dccs/:id/convert/json" do
|
|
83
|
+
with_dcc(params[:id]) do |xml|
|
|
84
|
+
::Dcc::Convert::Json.call(::Dcc.parse(xml)).payload
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
get "/dccs/:id/extract/files" do
|
|
89
|
+
with_dcc(params[:id]) do |xml|
|
|
90
|
+
files = ::Dcc::Extract::File.each(::Dcc.parse(xml))
|
|
91
|
+
{
|
|
92
|
+
files: files.map do |f|
|
|
93
|
+
{
|
|
94
|
+
name: f.name, file_name: f.file_name,
|
|
95
|
+
mime_type: f.mime_type, ring: f.ring.to_s,
|
|
96
|
+
data_base64: ::Base64.strict_encode64(f.data),
|
|
97
|
+
}
|
|
98
|
+
end,
|
|
99
|
+
}.to_json
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
post "/dccs/:id/transform/xslt" do
|
|
104
|
+
body = JSON.parse(request.body.read)
|
|
105
|
+
xslt = body.fetch("xslt")
|
|
106
|
+
with_dcc(params[:id]) do |xml|
|
|
107
|
+
::Dcc::Transform::Xslt.call(xml, xslt).payload
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
private
|
|
112
|
+
|
|
113
|
+
def ensure_loaded!
|
|
114
|
+
return if @loaded
|
|
115
|
+
|
|
116
|
+
::Dcc.load_all!
|
|
117
|
+
@loaded = true
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def with_dcc(id)
|
|
121
|
+
entry = settings.storage.get(id)
|
|
122
|
+
halt 404, { error: "not found" }.to_json unless entry
|
|
123
|
+
|
|
124
|
+
ensure_loaded!
|
|
125
|
+
result = yield(entry.xml)
|
|
126
|
+
result.is_a?(::String) ? result : result.to_json
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
require "base64"
|
|
133
|
+
require "json"
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Dcc
|
|
4
|
+
module Server
|
|
5
|
+
module Storage
|
|
6
|
+
# Value object for a stored DCC entry. Carries the SHA-256 id, XML
|
|
7
|
+
# payload, and expiry timestamp.
|
|
8
|
+
Entry = ::Struct.new(:id, :xml, :expires_at, keyword_init: true) do
|
|
9
|
+
def expired?
|
|
10
|
+
expires_at && Time.now > expires_at
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "digest"
|
|
4
|
+
|
|
5
|
+
module Dcc
|
|
6
|
+
module Server
|
|
7
|
+
module Storage
|
|
8
|
+
# In-memory storage with SHA-256-keyed entries and TTL eviction.
|
|
9
|
+
# Not thread-safe without external synchronization — wrap in a
|
|
10
|
+
# Mutex for concurrent deployments.
|
|
11
|
+
class Memory
|
|
12
|
+
attr_reader :ttl_seconds
|
|
13
|
+
|
|
14
|
+
def initialize(ttl_seconds: 300)
|
|
15
|
+
@store = {}
|
|
16
|
+
@ttl_seconds = ttl_seconds
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# @param xml [String]
|
|
20
|
+
# @return [Dcc::Server::Storage::Entry]
|
|
21
|
+
def put(xml)
|
|
22
|
+
id = ::Digest::SHA256.hexdigest(xml)
|
|
23
|
+
entry = Entry.new(id: id, xml: xml, expires_at: Time.now + ttl_seconds)
|
|
24
|
+
@store[id] = entry
|
|
25
|
+
entry
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# @param id [String] SHA-256 hex.
|
|
29
|
+
# @return [Dcc::Server::Storage::Entry, nil]
|
|
30
|
+
def get(id)
|
|
31
|
+
entry = @store[id]
|
|
32
|
+
return nil unless entry
|
|
33
|
+
|
|
34
|
+
if entry.expired?
|
|
35
|
+
@store.delete(id)
|
|
36
|
+
return nil
|
|
37
|
+
end
|
|
38
|
+
entry
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# @param id [String]
|
|
42
|
+
# @return [Boolean]
|
|
43
|
+
def delete(id)
|
|
44
|
+
!!@store.delete(id)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def clear
|
|
48
|
+
@store.clear
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def size
|
|
52
|
+
@store.size
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Dcc
|
|
4
|
+
module Server
|
|
5
|
+
# Pluggable storage for uploaded DCC XML documents. The default
|
|
6
|
+
# `Memory` implementation keeps documents in-process; production
|
|
7
|
+
# deployments can swap in a disk or Redis-backed implementation.
|
|
8
|
+
module Storage
|
|
9
|
+
autoload :Memory, "dcc/server/storage/memory"
|
|
10
|
+
autoload :Entry, "dcc/server/storage/entry"
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|