From fed2d08dc9a56d74bccc7b08193097fe99d8694b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20Sta=CC=88rk?= Date: Sun, 24 May 2020 10:45:04 +0200 Subject: [PATCH] Removed server. Moved libraryBasic to library and libraryExtended to validator to prevent confusion with profiles. --- History.md | 3 +- Mustang-Server/Dockerfile | 37 -- Mustang-Server/History.md | 14 - Mustang-Server/LICENSE | 201 ------ Mustang-Server/README.md | 45 -- Mustang-Server/README_screenshot.png | Bin 118916 -> 0 bytes Mustang-Server/config.yml | 13 - Mustang-Server/dwstart.keystore | Bin 2065 -> 0 bytes Mustang-Server/pom.xml | 147 ----- .../src/main/java/api/ApiApplication.java | 51 -- .../src/main/java/api/ApiConfiguration.java | 12 - .../src/main/java/api/BasicAuthenticator.java | 18 - .../src/main/java/api/BasicAuthorizer.java | 11 - Mustang-Server/src/main/java/api/User.java | 15 - .../main/java/mustang/MustangResource.java | 166 ----- .../test/java/mustangAPI/IntegrationTest.java | 50 -- NOTICE | 6 +- NOTICE.txt | 14 - .../ZUV-Architektur.graphml | 0 {libraryExtended => doc}/ZUV-Architektur.svg | 0 {libraryBasic => library}/pom.xml | 6 +- .../org/mustangproject/ZUGFeRD/Version.java | 0 .../java/org/mustangproject/XMLTools.java | 0 .../org/mustangproject/ZUGFeRD/Contact.java | 0 .../ZUGFeRD/CustomXMLProvider.java | 0 .../ZUGFeRD/IExporterFactory.java | 0 .../ZUGFeRD/IProfileProvider.java | 0 .../mustangproject/ZUGFeRD/IXMLProvider.java | 0 .../ZUGFeRD/IZUGFeRDAllowanceCharge.java | 0 .../mustangproject/ZUGFeRD/IZUGFeRDDate.java | 0 .../ZUGFeRD/IZUGFeRDExportableContact.java | 0 .../ZUGFeRD/IZUGFeRDExportableItem.java | 0 .../ZUGFeRD/IZUGFeRDExportableProduct.java | 0 .../IZUGFeRDExportableTransaction.java | 0 .../ZUGFeRD/IZUGFeRDPaymentDiscountTerms.java | 0 .../ZUGFeRD/IZUGFeRDPaymentTerms.java | 0 .../ZUGFeRD/IZUGFeRDTradeSettlement.java | 0 .../ZUGFeRD/IZUGFeRDTradeSettlementDebit.java | 0 .../IZUGFeRDTradeSettlementPayment.java | 0 .../java/org/mustangproject/ZUGFeRD/Item.java | 0 .../ZUGFeRD/PDFAConformanceLevel.java | 0 .../org/mustangproject/ZUGFeRD/Product.java | 0 .../org/mustangproject/ZUGFeRD/VATAmount.java | 0 .../ZUGFeRD/XMPSchemaPDFAExtensions.java | 0 .../ZUGFeRD/XMPSchemaZugferd.java | 0 .../ZUGFeRD/ZUGFeRD1PullProvider.java | 0 .../ZUGFeRD/ZUGFeRD2PullProvider.java | 3 +- .../ZUGFeRD/ZUGFeRD2PushProvider.java | 0 .../ZUGFeRD/ZUGFeRDConformanceLevel.java | 0 .../ZUGFeRD/ZUGFeRDDateFormat.java | 0 .../ZUGFeRD/ZUGFeRDExportException.java | 0 .../ZUGFeRD/ZUGFeRDExporter.java | 0 .../ZUGFeRD/ZUGFeRDExporterFromA1Factory.java | 0 .../ZUGFeRD/ZUGFeRDExporterFromA3Factory.java | 0 .../ZUGFeRD/ZUGFeRDImporter.java | 0 .../ZUGFeRD/ZUGFeRDImporterException.java | 0 .../ZUGFeRD/ZUGFeRDInvoiceImporter.java | 0 .../ZUGFeRD/ZUGFeRDMigrator.java | 0 .../ZUGFeRDTransactionModelConverter.java | 0 .../ZUGFeRD/ZUGFeRDVisualizer.java | 0 .../ZUGFeRD/model/DateTimeTypeConstants.java | 0 .../model/DocumentCodeTypeConstants.java | 0 ...DocumentContextParameterTypeConstants.java | 0 .../ZUGFeRD/model/NoteTypeConstants.java | 0 .../model/PaymentMeansCodeTypeConstants.java | 0 .../ZUGFeRD/model/QuantityTypeConstants.java | 0 .../model/TaxCategoryCodeTypeConstants.java | 0 .../model/TaxRegistrationTypeConstants.java | 0 .../model/TaxTypeCodeTypeConstants.java | 0 .../model/ZFNamespacePrefixMapper.java | 0 .../src/main/resources/COMFORTtoEN16931.xsl | 0 .../src/main/resources/schema/ZUGFeRD1p0.xsd | 0 ...act_data_standard_QualifiedDataType_12.xsd | 0 ...eAggregateBusinessInformationEntity_12.xsd | 0 ...t_data_standard_UnqualifiedDataType_15.xsd | 0 .../stylesheets/ZUGFeRD_1p0_c1p0_s1p0.xslt | 0 .../ZUGFeRD/BackwardCompatibilityTest.java | 0 .../org/mustangproject/ZUGFeRD/BaseTest.java | 0 .../ZUGFeRD/IZUGFeRDAllowanceChargeImpl.java | 0 .../ZUGFeRD/IZUGFeRDDateImpl.java | 0 .../IZUGFeRDExportableContactImpl.java | 0 .../ZUGFeRD/IZUGFeRDExportableItemImpl.java | 0 .../IZUGFeRDExportableProductImpl.java | 0 .../IZUGFeRDExportableTransactionImpl.java | 0 .../IZUGFeRDTradeSettlementPaymentImpl.java | 0 .../ZUGFeRD/MustangReaderTestCase.java | 0 .../MustangReaderWriterCustomXMLTest.java | 0 .../ZUGFeRD/MustangReaderWriterEdgeTest.java | 0 .../ZUGFeRD/MustangReaderWriterTest.java | 0 .../ZUGFeRD/ResourceUtilities.java | 0 .../ZUGFeRD/VersionMigrationTest.java | 0 .../mustangproject/ZUGFeRD/ZF2EdgeTest.java | 0 .../mustangproject/ZUGFeRD/ZF2PushTest.java | 0 .../org/mustangproject/ZUGFeRD/ZF2Test.java | 0 .../ZUGFeRD/ZF2ZInvoiceImporterTest.java | 0 .../ZUGFeRDTransactionModelConverterTest.java | 0 .../ZUGFeRD/ZUGFeRDXMLAssert.java | 0 ...ngGnuaccountingBeispielRE-20170509_505.pdf | Bin ...accountingBeispielRE-20170509_505PDF14.pdf | Bin ...accountingBeispielRE-20170509_505PDFA3.pdf | Bin ...ccountingBeispielRE-20170509_505blanko.pdf | Bin ...ccountingBeispielRE-20171118_506blanko.pdf | Bin ...ccountingBeispielRE-20190610_507blanko.pdf | Bin .../src/test/resources/ZUGFeRD_1p0.scmt | 0 .../input/ZUGFeRD1-invoice-adjusted.xml | 0 .../migration/input/ZUGFeRD1-invoice.xml | 0 .../input/ZUGFeRD1_COMFORT_Einfach.xml | 0 .../input/ZUGFeRD1_EXTENDED_Warenrechnung.xml | 0 .../reference/ZUGFeRD2-invoice-adjusted.xml | 0 .../migration/reference/ZUGFeRD2-invoice.xml | 0 .../reference/ZUGFeRD2_COMFORT_Einfach.xml | 0 .../ZUGFeRD2_EXTENDED_Warenrechnung.xml | 0 .../src/test/resources/zugferd_invoice.pdf | Bin .../mustangproject/toecount/FileChecker.java | 95 --- .../toecount/FileTraverser.java | 75 --- .../org/mustangproject/toecount/StatRun.java | 99 --- .../org/mustangproject/toecount/Toecount.java | 621 ------------------ libraryExtended/mvnw | 310 --------- libraryExtended/mvnw.cmd | 182 ----- libraryExtended/pom.xml | 237 ------- pom.xml | 164 ++--- {libraryExtended => validator}/History.md | 0 {libraryExtended => validator}/LICENSE | 0 ...ngGnuaccountingBeispielRE-20170509_505.pdf | Bin {libraryExtended => validator}/README.md | 0 validator/pom.xml | 240 +++++++ .../library/extended/EPart.java | 0 .../library/extended/ESeverity.java | 0 .../IrrecoverableValidationError.java | 0 .../mustangproject/library/extended/Main.java | 0 .../library/extended/PDFValidator.java | 0 .../library/extended/SchematronPipeline.java | 0 .../library/extended/ValidationContext.java | 0 .../extended/ValidationResultItem.java | 0 .../library/extended/Validator.java | 0 .../library/extended/XMLTools.java | 0 .../library/extended/XMLValidator.java | 0 .../library/extended/ZUGFeRDValidator.java | 0 .../ZUGFeRDSchematronStylesheetXSLT1.xsl | 0 .../ZUGFeRDSchematronStylesheetXSLT2.xsl | 0 .../src/main/resources/ZUGFeRD_1p0.sch | 0 .../main/resources/iso_abstract_expand.xsl | 0 .../src/main/resources/iso_dsdl_include.xsl | 0 .../main/resources/iso_schematron_message.xsl | 0 .../iso_schematron_skeleton_for_xslt1.xsl | 0 .../src/main/resources/iso_svrl_for_xslt1.xsl | 0 .../src/main/resources/logback.xml | 0 .../ad/basic/additional_data_base_schema.xsd | 0 .../main/resources/schema/zf1/ZUGFeRD1p0.xsd | 0 ...act_data_standard_QualifiedDataType_12.xsd | 0 ...eAggregateBusinessInformationEntity_12.xsd | 0 ...t_data_standard_UnqualifiedDataType_15.xsd | 0 .../schema/zf2/BASIC-WL/FACTUR-X_BASIC-WL.xsd | 0 ...ct_data_standard_QualifiedDataType_100.xsd | 0 ...AggregateBusinessInformationEntity_100.xsd | 0 ..._data_standard_UnqualifiedDataType_100.xsd | 0 .../schema/zf2/BASIC/FACTUR-X_BASIC.xsd | 0 ...ct_data_standard_QualifiedDataType_100.xsd | 0 ...AggregateBusinessInformationEntity_100.xsd | 0 ..._data_standard_UnqualifiedDataType_100.xsd | 0 .../schema/zf2/EN16931/FACTUR-X_EN16931.xsd | 0 ...ct_data_standard_QualifiedDataType_100.xsd | 0 ...AggregateBusinessInformationEntity_100.xsd | 0 ..._data_standard_UnqualifiedDataType_100.xsd | 0 .../schema/zf2/EXTENDED/FACTUR-X_EXTENDED.xsd | 0 ...ct_data_standard_QualifiedDataType_100.xsd | 0 ...AggregateBusinessInformationEntity_100.xsd | 0 ..._data_standard_UnqualifiedDataType_100.xsd | 0 .../schema/zf2/MINIMUM/FACTUR-X_MINIMUM.xsd | 0 ...ct_data_standard_QualifiedDataType_100.xsd | 0 ...AggregateBusinessInformationEntity_100.xsd | 0 ..._data_standard_UnqualifiedDataType_100.xsd | 0 .../xslt/EN16931-CII-validation.xslt | 0 .../xslt/FACTUR-X_BASIC-WL_codedb.xml | 0 .../resources/xslt/FACTUR-X_BASIC_codedb.xml | 0 .../xslt/FACTUR-X_EN16931_codedb.xml | 0 .../xslt/FACTUR-X_EXTENDED_codedb.xml | 0 .../xslt/FACTUR-X_MINIMUM_codedb.xml | 0 .../xslt/XRechnung-CII-validation.xslt | 0 .../src/main/resources/xslt/ZUGFeRD_1p0.xslt | 0 .../EN16931-CII-validation.xslt | 0 .../main/resources/xslt/zugferd21_basic.xsl | 0 .../main/resources/xslt/zugferd21_basicwl.xsl | 0 .../main/resources/xslt/zugferd21_en16931.xsl | 0 .../resources/xslt/zugferd21_extended.xsl | 0 .../main/resources/xslt/zugferd21_minimum.xsl | 0 .../xslt/zugferd2p0_basicwl_minimum.xslt | 0 .../zugferd2p0_basicwl_minimum_codedb.xml | 0 .../resources/xslt/zugferd2p0_en16931.xslt | 0 .../xslt/zugferd2p0_en16931_codedb.xml | 0 .../resources/xslt/zugferd2p0_extended.xslt | 0 .../xslt/zugferd2p0_extended_codedb.xml | 0 .../resources/zugferd2p0_basicwl_minimum.sch | 0 .../src/main/resources/zugferd2p0_en16931.sch | 0 .../main/resources/zugferd2p0_extended.sch | 0 .../library/extended/MiscValidatorTest.java | 0 .../library/extended/PDFValidatorTest.java | 0 .../library/extended/ResourceCase.java | 0 .../library/extended/XMLValidatorTest.java | 0 .../extended/ZUGFeRDValidatorTest.java | 0 .../FAIL_zugferd_2p1_MINIMUM_Rechnung_380.xml | 0 .../src/test/resources/Facture_F20180027.pdf | 0 .../src/test/resources/XMLinvalidV2PDF.pdf | Bin ...ce_rabatte_3_abschlag_duepayableamount.xml | 0 ...rabatte_4_abschlag_taxbasistotalamount.xml | 0 ...teBasedXMP_zugferd_2p0_EN16931_Einfach.pdf | Bin ..._zugferd_2p0_EN16931_Einfach_corrected.xml | 0 .../src/test/resources/corruptedV2PDF.pdf | Bin .../src/test/resources/invalidPDF.pdf | Bin .../src/test/resources/invalidV1.xml | 0 .../src/test/resources/invalidV1ExtraTags.xml | 0 .../test/resources/invalidV1TooMinimal.xml | 0 .../src/test/resources/invalidV2.xml | 0 .../src/test/resources/invalidV2Profile.xml | 0 .../src/test/resources/invalidXMP.pdf | Bin .../validAvoir_FR_type380_BASICWL.pdf | Bin .../src/test/resources/validV1.xml | 0 .../resources/validV1WithAdditionalData.pdf | Bin .../src/test/resources/validV2.xml | 0 .../src/test/resources/validV2Basic.xml | 0 .../src/test/resources/validV2PDF.pdf | Bin .../test/resources/validZREtestZugferd.xml | 0 ...alid_Avoir_FR_type380_minimum_factur-x.xml | 0 .../utils/ZUGFeRD-Validierer-kriterien.pdf | Bin 224 files changed, 333 insertions(+), 2502 deletions(-) delete mode 100644 Mustang-Server/Dockerfile delete mode 100644 Mustang-Server/History.md delete mode 100644 Mustang-Server/LICENSE delete mode 100644 Mustang-Server/README.md delete mode 100644 Mustang-Server/README_screenshot.png delete mode 100644 Mustang-Server/config.yml delete mode 100644 Mustang-Server/dwstart.keystore delete mode 100644 Mustang-Server/pom.xml delete mode 100644 Mustang-Server/src/main/java/api/ApiApplication.java delete mode 100644 Mustang-Server/src/main/java/api/ApiConfiguration.java delete mode 100644 Mustang-Server/src/main/java/api/BasicAuthenticator.java delete mode 100644 Mustang-Server/src/main/java/api/BasicAuthorizer.java delete mode 100644 Mustang-Server/src/main/java/api/User.java delete mode 100644 Mustang-Server/src/main/java/mustang/MustangResource.java delete mode 100644 Mustang-Server/src/test/java/mustangAPI/IntegrationTest.java delete mode 100644 NOTICE.txt rename {libraryExtended => doc}/ZUV-Architektur.graphml (100%) rename {libraryExtended => doc}/ZUV-Architektur.svg (100%) rename {libraryBasic => library}/pom.xml (97%) rename {libraryBasic => library}/src/main/java-templates/org/mustangproject/ZUGFeRD/Version.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/XMLTools.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/Contact.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/CustomXMLProvider.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/IExporterFactory.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/IProfileProvider.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/IXMLProvider.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDAllowanceCharge.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDDate.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableContact.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableProduct.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableTransaction.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDPaymentDiscountTerms.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDPaymentTerms.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDTradeSettlement.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDTradeSettlementDebit.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDTradeSettlementPayment.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/Item.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/PDFAConformanceLevel.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/Product.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/VATAmount.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/XMPSchemaPDFAExtensions.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/XMPSchemaZugferd.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD1PullProvider.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java (99%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PushProvider.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDConformanceLevel.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDDateFormat.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExportException.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporter.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporterFromA1Factory.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporterFromA3Factory.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporterException.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDMigrator.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDVisualizer.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/model/DateTimeTypeConstants.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/model/DocumentCodeTypeConstants.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/model/DocumentContextParameterTypeConstants.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/model/NoteTypeConstants.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/model/PaymentMeansCodeTypeConstants.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/model/QuantityTypeConstants.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/model/TaxCategoryCodeTypeConstants.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/model/TaxRegistrationTypeConstants.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/model/TaxTypeCodeTypeConstants.java (100%) rename {libraryBasic => library}/src/main/java/org/mustangproject/ZUGFeRD/model/ZFNamespacePrefixMapper.java (100%) rename {libraryBasic => library}/src/main/resources/COMFORTtoEN16931.xsl (100%) rename {libraryBasic => library}/src/main/resources/schema/ZUGFeRD1p0.xsd (100%) rename {libraryBasic => library}/src/main/resources/schema/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_QualifiedDataType_12.xsd (100%) rename {libraryBasic => library}/src/main/resources/schema/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_12.xsd (100%) rename {libraryBasic => library}/src/main/resources/schema/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_15.xsd (100%) rename {libraryBasic => library}/src/main/resources/stylesheets/ZUGFeRD_1p0_c1p0_s1p0.xslt (100%) rename {libraryBasic => library}/src/test/java/org/mustangproject/ZUGFeRD/BackwardCompatibilityTest.java (100%) rename {libraryBasic => library}/src/test/java/org/mustangproject/ZUGFeRD/BaseTest.java (100%) rename {libraryBasic => library}/src/test/java/org/mustangproject/ZUGFeRD/IZUGFeRDAllowanceChargeImpl.java (100%) rename {libraryBasic => library}/src/test/java/org/mustangproject/ZUGFeRD/IZUGFeRDDateImpl.java (100%) rename {libraryBasic => library}/src/test/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableContactImpl.java (100%) rename {libraryBasic => library}/src/test/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItemImpl.java (100%) rename {libraryBasic => library}/src/test/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableProductImpl.java (100%) rename {libraryBasic => library}/src/test/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableTransactionImpl.java (100%) rename {libraryBasic => library}/src/test/java/org/mustangproject/ZUGFeRD/IZUGFeRDTradeSettlementPaymentImpl.java (100%) rename {libraryBasic => library}/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderTestCase.java (100%) rename {libraryBasic => library}/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterCustomXMLTest.java (100%) rename {libraryBasic => library}/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterEdgeTest.java (100%) rename {libraryBasic => library}/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterTest.java (100%) rename {libraryBasic => library}/src/test/java/org/mustangproject/ZUGFeRD/ResourceUtilities.java (100%) rename {libraryBasic => library}/src/test/java/org/mustangproject/ZUGFeRD/VersionMigrationTest.java (100%) rename {libraryBasic => library}/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java (100%) rename {libraryBasic => library}/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java (100%) rename {libraryBasic => library}/src/test/java/org/mustangproject/ZUGFeRD/ZF2Test.java (100%) rename {libraryBasic => library}/src/test/java/org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java (100%) rename {libraryBasic => library}/src/test/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverterTest.java (100%) rename {libraryBasic => library}/src/test/java/org/mustangproject/ZUGFeRD/ZUGFeRDXMLAssert.java (100%) rename {libraryBasic => library}/src/test/resources/MustangGnuaccountingBeispielRE-20170509_505.pdf (100%) rename {libraryBasic => library}/src/test/resources/MustangGnuaccountingBeispielRE-20170509_505PDF14.pdf (100%) rename {libraryBasic => library}/src/test/resources/MustangGnuaccountingBeispielRE-20170509_505PDFA3.pdf (100%) rename {libraryBasic => library}/src/test/resources/MustangGnuaccountingBeispielRE-20170509_505blanko.pdf (100%) rename {libraryBasic => library}/src/test/resources/MustangGnuaccountingBeispielRE-20171118_506blanko.pdf (100%) rename {libraryBasic => library}/src/test/resources/MustangGnuaccountingBeispielRE-20190610_507blanko.pdf (100%) rename {libraryBasic => library}/src/test/resources/ZUGFeRD_1p0.scmt (100%) rename {libraryBasic => library}/src/test/resources/migration/input/ZUGFeRD1-invoice-adjusted.xml (100%) rename {libraryBasic => library}/src/test/resources/migration/input/ZUGFeRD1-invoice.xml (100%) rename {libraryBasic => library}/src/test/resources/migration/input/ZUGFeRD1_COMFORT_Einfach.xml (100%) rename {libraryBasic => library}/src/test/resources/migration/input/ZUGFeRD1_EXTENDED_Warenrechnung.xml (100%) rename {libraryBasic => library}/src/test/resources/migration/reference/ZUGFeRD2-invoice-adjusted.xml (100%) rename {libraryBasic => library}/src/test/resources/migration/reference/ZUGFeRD2-invoice.xml (100%) rename {libraryBasic => library}/src/test/resources/migration/reference/ZUGFeRD2_COMFORT_Einfach.xml (100%) rename {libraryBasic => library}/src/test/resources/migration/reference/ZUGFeRD2_EXTENDED_Warenrechnung.xml (100%) rename {libraryBasic => library}/src/test/resources/zugferd_invoice.pdf (100%) delete mode 100755 libraryBasic/src/main/java/org/mustangproject/toecount/FileChecker.java delete mode 100755 libraryBasic/src/main/java/org/mustangproject/toecount/FileTraverser.java delete mode 100755 libraryBasic/src/main/java/org/mustangproject/toecount/StatRun.java delete mode 100755 libraryBasic/src/main/java/org/mustangproject/toecount/Toecount.java delete mode 100755 libraryExtended/mvnw delete mode 100644 libraryExtended/mvnw.cmd delete mode 100644 libraryExtended/pom.xml rename {libraryExtended => validator}/History.md (100%) rename {libraryExtended => validator}/LICENSE (100%) rename {libraryExtended => validator}/MustangGnuaccountingBeispielRE-20170509_505.pdf (100%) rename {libraryExtended => validator}/README.md (100%) create mode 100644 validator/pom.xml rename {libraryExtended => validator}/src/main/java/org/mustangproject/library/extended/EPart.java (100%) rename {libraryExtended => validator}/src/main/java/org/mustangproject/library/extended/ESeverity.java (100%) rename {libraryExtended => validator}/src/main/java/org/mustangproject/library/extended/IrrecoverableValidationError.java (100%) rename {libraryExtended => validator}/src/main/java/org/mustangproject/library/extended/Main.java (100%) rename {libraryExtended => validator}/src/main/java/org/mustangproject/library/extended/PDFValidator.java (100%) rename {libraryExtended => validator}/src/main/java/org/mustangproject/library/extended/SchematronPipeline.java (100%) rename {libraryExtended => validator}/src/main/java/org/mustangproject/library/extended/ValidationContext.java (100%) rename {libraryExtended => validator}/src/main/java/org/mustangproject/library/extended/ValidationResultItem.java (100%) rename {libraryExtended => validator}/src/main/java/org/mustangproject/library/extended/Validator.java (100%) rename {libraryExtended => validator}/src/main/java/org/mustangproject/library/extended/XMLTools.java (100%) rename {libraryExtended => validator}/src/main/java/org/mustangproject/library/extended/XMLValidator.java (100%) rename {libraryExtended => validator}/src/main/java/org/mustangproject/library/extended/ZUGFeRDValidator.java (100%) rename {libraryExtended => validator}/src/main/resources/ZUGFeRDSchematronStylesheetXSLT1.xsl (100%) rename {libraryExtended => validator}/src/main/resources/ZUGFeRDSchematronStylesheetXSLT2.xsl (100%) rename {libraryExtended => validator}/src/main/resources/ZUGFeRD_1p0.sch (100%) rename {libraryExtended => validator}/src/main/resources/iso_abstract_expand.xsl (100%) rename {libraryExtended => validator}/src/main/resources/iso_dsdl_include.xsl (100%) rename {libraryExtended => validator}/src/main/resources/iso_schematron_message.xsl (100%) rename {libraryExtended => validator}/src/main/resources/iso_schematron_skeleton_for_xslt1.xsl (100%) rename {libraryExtended => validator}/src/main/resources/iso_svrl_for_xslt1.xsl (100%) rename {libraryExtended => validator}/src/main/resources/logback.xml (100%) rename {libraryExtended => validator}/src/main/resources/schema/ad/basic/additional_data_base_schema.xsd (100%) rename {libraryExtended => validator}/src/main/resources/schema/zf1/ZUGFeRD1p0.xsd (100%) rename {libraryExtended => validator}/src/main/resources/schema/zf1/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_QualifiedDataType_12.xsd (100%) rename {libraryExtended => validator}/src/main/resources/schema/zf1/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_12.xsd (100%) rename {libraryExtended => validator}/src/main/resources/schema/zf1/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_15.xsd (100%) rename {libraryExtended => validator}/src/main/resources/schema/zf2/BASIC-WL/FACTUR-X_BASIC-WL.xsd (100%) rename {libraryExtended => validator}/src/main/resources/schema/zf2/BASIC-WL/FACTUR-X_BASIC-WL_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd (100%) rename {libraryExtended => validator}/src/main/resources/schema/zf2/BASIC-WL/FACTUR-X_BASIC-WL_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd (100%) rename {libraryExtended => validator}/src/main/resources/schema/zf2/BASIC-WL/FACTUR-X_BASIC-WL_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd (100%) rename {libraryExtended => validator}/src/main/resources/schema/zf2/BASIC/FACTUR-X_BASIC.xsd (100%) rename {libraryExtended => validator}/src/main/resources/schema/zf2/BASIC/FACTUR-X_BASIC_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd (100%) rename {libraryExtended => validator}/src/main/resources/schema/zf2/BASIC/FACTUR-X_BASIC_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd (100%) rename {libraryExtended => validator}/src/main/resources/schema/zf2/BASIC/FACTUR-X_BASIC_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd (100%) rename {libraryExtended => validator}/src/main/resources/schema/zf2/EN16931/FACTUR-X_EN16931.xsd (100%) rename {libraryExtended => validator}/src/main/resources/schema/zf2/EN16931/FACTUR-X_EN16931_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd (100%) rename {libraryExtended => validator}/src/main/resources/schema/zf2/EN16931/FACTUR-X_EN16931_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd (100%) rename {libraryExtended => validator}/src/main/resources/schema/zf2/EN16931/FACTUR-X_EN16931_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd (100%) rename {libraryExtended => validator}/src/main/resources/schema/zf2/EXTENDED/FACTUR-X_EXTENDED.xsd (100%) rename {libraryExtended => validator}/src/main/resources/schema/zf2/EXTENDED/FACTUR-X_EXTENDED_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd (100%) rename {libraryExtended => validator}/src/main/resources/schema/zf2/EXTENDED/FACTUR-X_EXTENDED_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd (100%) rename {libraryExtended => validator}/src/main/resources/schema/zf2/EXTENDED/FACTUR-X_EXTENDED_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd (100%) rename {libraryExtended => validator}/src/main/resources/schema/zf2/MINIMUM/FACTUR-X_MINIMUM.xsd (100%) rename {libraryExtended => validator}/src/main/resources/schema/zf2/MINIMUM/FACTUR-X_MINIMUM_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd (100%) rename {libraryExtended => validator}/src/main/resources/schema/zf2/MINIMUM/FACTUR-X_MINIMUM_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd (100%) rename {libraryExtended => validator}/src/main/resources/schema/zf2/MINIMUM/FACTUR-X_MINIMUM_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd (100%) rename {libraryExtended => validator}/src/main/resources/xslt/EN16931-CII-validation.xslt (100%) rename {libraryExtended => validator}/src/main/resources/xslt/FACTUR-X_BASIC-WL_codedb.xml (100%) rename {libraryExtended => validator}/src/main/resources/xslt/FACTUR-X_BASIC_codedb.xml (100%) rename {libraryExtended => validator}/src/main/resources/xslt/FACTUR-X_EN16931_codedb.xml (100%) rename {libraryExtended => validator}/src/main/resources/xslt/FACTUR-X_EXTENDED_codedb.xml (100%) rename {libraryExtended => validator}/src/main/resources/xslt/FACTUR-X_MINIMUM_codedb.xml (100%) rename {libraryExtended => validator}/src/main/resources/xslt/XRechnung-CII-validation.xslt (100%) rename {libraryExtended => validator}/src/main/resources/xslt/ZUGFeRD_1p0.xslt (100%) rename {libraryExtended => validator}/src/main/resources/xslt/cii16931schematron/EN16931-CII-validation.xslt (100%) rename {libraryExtended => validator}/src/main/resources/xslt/zugferd21_basic.xsl (100%) rename {libraryExtended => validator}/src/main/resources/xslt/zugferd21_basicwl.xsl (100%) rename {libraryExtended => validator}/src/main/resources/xslt/zugferd21_en16931.xsl (100%) rename {libraryExtended => validator}/src/main/resources/xslt/zugferd21_extended.xsl (100%) rename {libraryExtended => validator}/src/main/resources/xslt/zugferd21_minimum.xsl (100%) rename {libraryExtended => validator}/src/main/resources/xslt/zugferd2p0_basicwl_minimum.xslt (100%) rename {libraryExtended => validator}/src/main/resources/xslt/zugferd2p0_basicwl_minimum_codedb.xml (100%) rename {libraryExtended => validator}/src/main/resources/xslt/zugferd2p0_en16931.xslt (100%) rename {libraryExtended => validator}/src/main/resources/xslt/zugferd2p0_en16931_codedb.xml (100%) rename {libraryExtended => validator}/src/main/resources/xslt/zugferd2p0_extended.xslt (100%) rename {libraryExtended => validator}/src/main/resources/xslt/zugferd2p0_extended_codedb.xml (100%) rename {libraryExtended => validator}/src/main/resources/zugferd2p0_basicwl_minimum.sch (100%) rename {libraryExtended => validator}/src/main/resources/zugferd2p0_en16931.sch (100%) rename {libraryExtended => validator}/src/main/resources/zugferd2p0_extended.sch (100%) rename {libraryExtended => validator}/src/test/java/org/mustangproject/library/extended/MiscValidatorTest.java (100%) rename {libraryExtended => validator}/src/test/java/org/mustangproject/library/extended/PDFValidatorTest.java (100%) rename {libraryExtended => validator}/src/test/java/org/mustangproject/library/extended/ResourceCase.java (100%) rename {libraryExtended => validator}/src/test/java/org/mustangproject/library/extended/XMLValidatorTest.java (100%) rename {libraryExtended => validator}/src/test/java/org/mustangproject/library/extended/ZUGFeRDValidatorTest.java (100%) rename {libraryExtended => validator}/src/test/resources/FAIL_zugferd_2p1_MINIMUM_Rechnung_380.xml (100%) rename {libraryExtended => validator}/src/test/resources/Facture_F20180027.pdf (100%) rename {libraryExtended => validator}/src/test/resources/XMLinvalidV2PDF.pdf (100%) rename {libraryExtended => validator}/src/test/resources/ZUGFeRD-invoice_rabatte_3_abschlag_duepayableamount.xml (100%) rename {libraryExtended => validator}/src/test/resources/ZUGFeRD-invoice_rabatte_4_abschlag_taxbasistotalamount.xml (100%) rename {libraryExtended => validator}/src/test/resources/attributeBasedXMP_zugferd_2p0_EN16931_Einfach.pdf (100%) rename {libraryExtended => validator}/src/test/resources/attributeBasedXMP_zugferd_2p0_EN16931_Einfach_corrected.xml (100%) rename {libraryExtended => validator}/src/test/resources/corruptedV2PDF.pdf (100%) rename {libraryExtended => validator}/src/test/resources/invalidPDF.pdf (100%) rename {libraryExtended => validator}/src/test/resources/invalidV1.xml (100%) rename {libraryExtended => validator}/src/test/resources/invalidV1ExtraTags.xml (100%) rename {libraryExtended => validator}/src/test/resources/invalidV1TooMinimal.xml (100%) rename {libraryExtended => validator}/src/test/resources/invalidV2.xml (100%) rename {libraryExtended => validator}/src/test/resources/invalidV2Profile.xml (100%) rename {libraryExtended => validator}/src/test/resources/invalidXMP.pdf (100%) rename {libraryExtended => validator}/src/test/resources/validAvoir_FR_type380_BASICWL.pdf (100%) rename {libraryExtended => validator}/src/test/resources/validV1.xml (100%) rename {libraryExtended => validator}/src/test/resources/validV1WithAdditionalData.pdf (100%) rename {libraryExtended => validator}/src/test/resources/validV2.xml (100%) rename {libraryExtended => validator}/src/test/resources/validV2Basic.xml (100%) rename {libraryExtended => validator}/src/test/resources/validV2PDF.pdf (100%) rename {libraryExtended => validator}/src/test/resources/validZREtestZugferd.xml (100%) rename {libraryExtended => validator}/src/test/resources/valid_Avoir_FR_type380_minimum_factur-x.xml (100%) rename {libraryExtended => validator}/utils/ZUGFeRD-Validierer-kriterien.pdf (100%) diff --git a/History.md b/History.md index bf1885ee..3d9c58d4 100644 --- a/History.md +++ b/History.md @@ -10,7 +10,8 @@ done - 2.1 now default - pushprovider -- integrates ZUV +- integrates validator +- validator now additionally supports xrechnung - integrates mustangserver - modular project setup diff --git a/Mustang-Server/Dockerfile b/Mustang-Server/Dockerfile deleted file mode 100644 index 111ce122..00000000 --- a/Mustang-Server/Dockerfile +++ /dev/null @@ -1,37 +0,0 @@ -# See https://docs.docker.com/engine/userguide/eng-image/multistage-build/ -# to build please run -# sudo docker build --tag mustang:2.0 . -# to start please run -# sudo docker run --publish 8080:8080 --detach --name mustang mustang:2.0 -# takes around 15s to start up, afterwards access http://127.0.0.1:8080 -# to remove please run -# sudo docker rm --force mustang - -FROM openjdk:8-jdk-alpine as builder -WORKDIR /build -RUN apk --no-cache add openjdk11 --repository=http://dl-cdn.alpinelinux.org/alpine/edge/community -RUN apk --update add git maven -RUN git clone https://github.com/ZUGFeRD/mustangproject.git -RUN cd mustangproject && mvn clean package - - -FROM openjdk:8-jre-alpine as runner - -ENV MUSTANG_VERSION=2.0.0-SNAPSHOT - -# Since this is a running network service we'll create an unprivileged account -# which will be used to perform the rest of the work and run the actual service: - -# Debian: -# RUN useradd --system --user-group --home-dir=/opt/mustang mustang -# Alpine / Busybox: -RUN install -d -o root -g root -m 755 /opt && adduser -h /opt/mustang -S mustang -USER mustang -WORKDIR /opt/mustang - -COPY --from=builder /build/mustangproject/Mustang-Server/target/Mustang-Server-${MUSTANG_VERSION}.jar /opt/mustang/ -COPY --from=builder /build/mustangproject/Mustang-Server/config.yml /opt/mustang/ -COPY --from=builder /build/mustangproject/Mustang-Server/dwstart.keystore /opt/mustang/ - -EXPOSE 8080 -ENTRYPOINT java -jar /opt/mustang/Mustang-Server-${MUSTANG_VERSION}.jar server config.yml diff --git a/Mustang-Server/History.md b/Mustang-Server/History.md deleted file mode 100644 index d94255a6..00000000 --- a/Mustang-Server/History.md +++ /dev/null @@ -1,14 +0,0 @@ -0.0.2 -===== -2019-09-15 - -- Https support, -- User authentication (for combine method, username good-guy password secret) -- completed mandatory swagger attributes. - - -0.0.1 -===== -2019-08-18 - -Possibility to extract/combine files, swagger support \ No newline at end of file diff --git a/Mustang-Server/LICENSE b/Mustang-Server/LICENSE deleted file mode 100644 index 261eeb9e..00000000 --- a/Mustang-Server/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/Mustang-Server/README.md b/Mustang-Server/README.md deleted file mode 100644 index 5dd6d86c..00000000 --- a/Mustang-Server/README.md +++ /dev/null @@ -1,45 +0,0 @@ -# mustangAPI -A rest API for [Mustangproject](https://www.mustangproject.org), i.e. for ZUGFeRD/Factur-X - -![Screenshot](README_screenshot.png "Screenshot Swagger API") - -## Architecture - -Using a - * [Dropwizard](https://dropwizard.io) and a - * Swagger integration - -Recommended: German 45min Dropwizard/Swagger introduction [video](https://media.ccc.de/v/froscon2017-1985-einfache_rest-apis_mit_dropwizard_und_swagger) and [slides](https://programm.froscon.de/2017/system/event_attachments/attachments/000/000/469/original/20170818_LeanIX_Presentation_Froscon.pdf) from Froscon 2017 - -## Features - - - * Integrates its own (jersey) webserver - * get the API documentation online (Human readable and as OpenAPI) - * try the API in a swagger generated demo web client - * Extract the XML from a ZUGFeRD/Factur-X invoice - * Combine custom XML and a PDF/A-1 file to a ZUGFeRD/Factur-X invoice - -Feel free to send pull requests for more functionality. - -## Compile - -`mvn clean package` - -## Start - -`java -jar target/server-0.0.2-SNAPSHOT.jar server config.yml` - -## Use - -use http://127.0.0.1:8080/swagger to try the methods (https://localhost:8443/swagger would work but is self-signed). -Access http://localhost:8080/swagger.yaml to build your clients. -For demo purposes, extract does not require authentication but combine requires http authentication with user name "good-guy" and password "secret". - -## Support - -Community support is available via the [ZUGFeRD Google Group](https://groups.google.com/forum/?hl=de#!forum/zugferd) - -## Contact - -For commercial and/or legal inquiries contact Jochen Stärk jochen@zugferd.org diff --git a/Mustang-Server/README_screenshot.png b/Mustang-Server/README_screenshot.png deleted file mode 100644 index 53e3ec3f6195810ac97fb9e210b06b5980689db3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118916 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 diff --git a/Mustang-Server/config.yml b/Mustang-Server/config.yml deleted file mode 100644 index d1943c27..00000000 --- a/Mustang-Server/config.yml +++ /dev/null @@ -1,13 +0,0 @@ -swagger: - resourcePackage: mustang -server: - applicationConnectors: - - type: http - port: 8080 - - type: https - port: 8443 - # keytool -genkeypair -keyalg RSA -dname "CN=localhost" -keystore dwstart.keystore -keypass crimson -storepass crimson - keyStorePath: ./dwstart.keystore - keyStorePassword: "crimson" - validateCerts: false - validatePeers: false \ No newline at end of file diff --git a/Mustang-Server/dwstart.keystore b/Mustang-Server/dwstart.keystore deleted file mode 100644 index 745f3a096299d7611c8ad274be4fea91d9a79ea2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2065 zcmZ{kX*iS%8^`CF%`}-Aifm=e)`T8|vXw2RB5Lf8;>c?`V{GTxrkV^9BKy9kY^524 zEM+TOwxpOEWE+}DWD5yw`pGKm0%3_lMtoUB8`$odpO40^JMnpCG(L{%{M~ zYu;*MSq=~g0s_+DJP?aSA4dXk01p)e00ab1gLBo*zcg0!hgZs5%1GM_<*MtS_m3#M zq7d!8qH-+!)|eHKV;(*-d?hBeZy^e(k~7JF9a^cf+xlLy`^!Gz z6A>5S)P<3-R$!f@F^PUNu!60LU>*NTM}=qa6Z*F9AWMZpDkBtug0iQ1I?rhmEy4{g97?tX))tXkkuPRZv88 zDyD4lSAyuIW?P{$9Ahh~7rk0XKYZ~mj&C+U(OGny;l>V@)UJ=uGW2Mwo%0H@B*co$ zvj5sA2upFC>9w3+MmyTmrX>en=`I(=RY{PM;q0Y*6r&s41nFGKwr#hLDRrH?$m<1( z^#J~iegB*Ep6@&L;#r9?$>*n@m}C}%QZWebW4Jrl2pZ#%E!V1Ja6Pm8{RdJoYm{at z4rF>buzyk>=C}#{hBL+Ur5bC-%v0)Gnzq$4TB!bIjn!W>bJNX)J4Qy6qiPLu&DNRr zXV#o%%wSDMuW%xHsX9yAwTgY7C#;L(Geo=_CYz$mgAdlZ+whNVWYMXcrIMA#aZ{Oy zoynmqC9KSX(2Q8H9Dk!#TT{r$(Njpc!ARUIK=%dHcNpSvRB8OU1~K9V*b1pw5q9*X zw9XOcgG`Wl<7^AA=f%-D^H{O;w4p?7rELmthOsuwHgr26w?I^=9#l4eZ;sw3`=;ktu#pr7I& z6)HB9=`iKiQ8-OFjr&orjfdU2Ejk)G=J=FSW{j8t2*}5}Y=*$QjNh9bj$F>8YTOn* zg*3bKyu@R=0`B)>k@##zRXTQQ0-p!;)vf9jSJYO02?_Sy_;FNmedFCs3Jzl*C%6Ia z6*0f~c?M}}ucD-W_qusk6xx!dv=%n_Xw9l!pK^;zXk@!TiEWQ45qs%MAW58@*^Rk% z^S3O;(~ygq(80C=ra>X8x6}DF41fi0>q6(By9<}}8}c+HElZO86p~q4hYD?7{f^ss zS@@pFNR@_h?*wB)f6ck>kwM4^?lvR^jnUj zVM~LU{s-I=3iXOFD)1{&PQU&Kf)t*vRm9}BkOsN^xWE3ZMLShZPiZDWrA)6hOkP;jn}INItGEBoCi}KS4_5-%xfezQaC=e)&`=rxKvL#ybGg=0Xvs})sYoSq z%Jt}is{9Xh#wEUhg7NqT;KZ?cEWtUXkxJ$3Peh16Yd14@BM_J|+B!VkfPR+-lK z?JUoHTorH$ltWqEhiud1{|RyLM|%(f2;$P!OI|xHe2+Ctf)Pbdc)Q;9wVaV&D#R8Ix%wYJ`PyxK#{P+sbqvKw!tNNZl?ENcC4vP8T; diff --git a/Mustang-Server/pom.xml b/Mustang-Server/pom.xml deleted file mode 100644 index 5e7bd058..00000000 --- a/Mustang-Server/pom.xml +++ /dev/null @@ -1,147 +0,0 @@ - - - org.mustangproject - core - 2.0.0-SNAPSHOT - - 4.0.0 - org.mustangproject - Mustang-Server - 2.0.0-SNAPSHOT - Mustang Server - A rest API for ZUGFeRD, Factur-X and XRechnung - - UTF-8 - 1.8 - 1.8 - 1.3.12 - - - - - - org.mustangproject - libraryExtended - 2.0.0-SNAPSHOT - - - - io.dropwizard - dropwizard-core - ${dropwizard.version} - - - com.smoketurner - dropwizard-swagger - 1.3.12-1 - - - io.dropwizard - dropwizard-forms - ${dropwizard.version} - pom - - - io.dropwizard - dropwizard-auth - ${dropwizard.version} - pom - - - - - - org.junit - junit5-api - 5.0.0-ALPHA - test - - - org.junit - junit5-engine - 5.0.0-ALPHA - test - - - - org.apache.pdfbox - pdfbox-tools - 2.0.3 - - - net.sf.cssbox - pdf2dom - 1.6 - - - com.itextpdf - itextpdf - 5.5.10 - - - com.itextpdf.tool - xmlworker - 5.5.10 - - - org.apache.poi - poi-ooxml - 3.15 - - - org.apache.poi - poi-scratchpad - 3.15 - - - - - - org.apache.maven.plugins - maven-shade-plugin - 2.3 - - true - - - *:* - - META-INF/*.SF - META-INF/*.DSA - META-INF/*.RSA - - - - - - - - package - - shade - - - - - - - - api.ApiApplication - - - - - - - - - \ No newline at end of file diff --git a/Mustang-Server/src/main/java/api/ApiApplication.java b/Mustang-Server/src/main/java/api/ApiApplication.java deleted file mode 100644 index 1408976b..00000000 --- a/Mustang-Server/src/main/java/api/ApiApplication.java +++ /dev/null @@ -1,51 +0,0 @@ -package api; - -import org.glassfish.jersey.media.multipart.MultiPartFeature; -import org.glassfish.jersey.server.filter.RolesAllowedDynamicFeature; - -import io.dropwizard.Application; -import io.dropwizard.auth.AuthDynamicFeature; -import io.dropwizard.auth.AuthValueFactoryProvider; -import io.dropwizard.auth.basic.BasicCredentialAuthFilter; -import io.dropwizard.setup.Bootstrap; -import io.dropwizard.setup.Environment; -import io.federecio.dropwizard.swagger.SwaggerBundle; -import io.federecio.dropwizard.swagger.SwaggerBundleConfiguration; -import mustang.MustangResource; - -public class ApiApplication extends Application { - public static void main(String[] args) throws Exception { - new ApiApplication().run(args); - } - - @Override - public String getName() { - return "Mustang Server"; - } - - @Override - public void initialize(Bootstrap bootstrap) { - - bootstrap.addBundle(new SwaggerBundle() { - @Override - protected SwaggerBundleConfiguration getSwaggerBundleConfiguration(ApiConfiguration configuration) { - return configuration.swaggerBundleConfiguration; - } - }); - } - - @Override - public void run(ApiConfiguration configuration, Environment environment) { - final MustangResource resource = new MustangResource(); - - environment.jersey() - .register(new AuthDynamicFeature(new BasicCredentialAuthFilter.Builder() - .setAuthenticator(new BasicAuthenticator()).setAuthorizer(new BasicAuthorizer()) - .setRealm("Rest API access").buildAuthFilter())); - environment.jersey().register(RolesAllowedDynamicFeature.class); - environment.jersey().register(new AuthValueFactoryProvider.Binder<>(User.class)); - environment.jersey().register(MultiPartFeature.class); - environment.jersey().register(resource); - } - -} \ No newline at end of file diff --git a/Mustang-Server/src/main/java/api/ApiConfiguration.java b/Mustang-Server/src/main/java/api/ApiConfiguration.java deleted file mode 100644 index 23d7071f..00000000 --- a/Mustang-Server/src/main/java/api/ApiConfiguration.java +++ /dev/null @@ -1,12 +0,0 @@ -package api; -import io.dropwizard.Configuration; -import io.federecio.dropwizard.swagger.SwaggerBundleConfiguration; - -import com.fasterxml.jackson.annotation.JsonProperty; - -public class ApiConfiguration extends Configuration { - - @JsonProperty("swagger") - public SwaggerBundleConfiguration swaggerBundleConfiguration; - -} \ No newline at end of file diff --git a/Mustang-Server/src/main/java/api/BasicAuthenticator.java b/Mustang-Server/src/main/java/api/BasicAuthenticator.java deleted file mode 100644 index c69a5468..00000000 --- a/Mustang-Server/src/main/java/api/BasicAuthenticator.java +++ /dev/null @@ -1,18 +0,0 @@ -package api; - - -import java.util.Optional; - -import io.dropwizard.auth.AuthenticationException; -import io.dropwizard.auth.Authenticator; -import io.dropwizard.auth.basic.BasicCredentials; - -public class BasicAuthenticator implements Authenticator { - @Override - public Optional authenticate(BasicCredentials credentials) throws AuthenticationException { - if ("secret".equals(credentials.getPassword())) { - return Optional.of(new User(credentials.getUsername())); - } - return Optional.empty(); - } -} \ No newline at end of file diff --git a/Mustang-Server/src/main/java/api/BasicAuthorizer.java b/Mustang-Server/src/main/java/api/BasicAuthorizer.java deleted file mode 100644 index ff53d53c..00000000 --- a/Mustang-Server/src/main/java/api/BasicAuthorizer.java +++ /dev/null @@ -1,11 +0,0 @@ -package api; - - -import io.dropwizard.auth.Authorizer; - -public class BasicAuthorizer implements Authorizer { - @Override - public boolean authorize(User user, String role) { - return user.getName().equals("good-guy") && role.equals("ADMIN"); - } -} \ No newline at end of file diff --git a/Mustang-Server/src/main/java/api/User.java b/Mustang-Server/src/main/java/api/User.java deleted file mode 100644 index 67e02a66..00000000 --- a/Mustang-Server/src/main/java/api/User.java +++ /dev/null @@ -1,15 +0,0 @@ -package api; - -import io.dropwizard.auth.PrincipalImpl; - -public class User extends PrincipalImpl { - String username; - - public User(String name) { - super(name); - username=name; - } - - - -} diff --git a/Mustang-Server/src/main/java/mustang/MustangResource.java b/Mustang-Server/src/main/java/mustang/MustangResource.java deleted file mode 100644 index d1eb218e..00000000 --- a/Mustang-Server/src/main/java/mustang/MustangResource.java +++ /dev/null @@ -1,166 +0,0 @@ -package mustang; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.File; -import java.nio.file.*; - -import javax.annotation.security.RolesAllowed; -import javax.ws.rs.Consumes; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; - -import org.glassfish.jersey.media.multipart.FormDataContentDisposition; -import org.glassfish.jersey.media.multipart.FormDataParam; -import org.mustangproject.ZUGFeRD.ZUGFeRDConformanceLevel; -import org.mustangproject.ZUGFeRD.ZUGFeRDExporter; -import org.mustangproject.ZUGFeRD.ZUGFeRDExporterFromA1Factory; -import org.mustangproject.ZUGFeRD.ZUGFeRDImporter; - -import org.mustangproject.library.extended.ZUGFeRDValidator; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.itextpdf.text.Document; -import com.itextpdf.text.DocumentException; -import com.itextpdf.text.pdf.PdfWriter; -import com.itextpdf.tool.xml.XMLWorkerHelper; - -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import io.swagger.annotations.License; -import io.swagger.annotations.Info; -import io.swagger.annotations.SwaggerDefinition; - -@Path("/mustang") -@Produces(MediaType.APPLICATION_JSON) -@Api(value = "Mustang") -@SwaggerDefinition(info = @Info(description = "Rest API to read/write hybrid (ZUGFeRD/Factur-X) e-invoices with a Mustang Server", version = "V0.0.2", title = "Mustangproject API", license = @License(name = "Apache 2.0", url = "http://www.apache.org") - -), schemes = { SwaggerDefinition.Scheme.HTTP, SwaggerDefinition.Scheme.HTTPS }) -public class MustangResource { - - Logger logger = LoggerFactory.getLogger(MustangResource.class.getName()); - - public MustangResource() { - } - - @POST - @Path("/extract") - // @RolesAllowed("ADMIN") - @Consumes(MediaType.MULTIPART_FORM_DATA) - @Produces(MediaType.APPLICATION_XML) - @ApiOperation(value = "Extracts XML from a zf/fx PDF", notes = "Input PDF must be ZUGFeRD or Factur-X") - public String extractFile( - @ApiParam(required = true, value = "Input ZUGFeRD/Factur-X file") @FormDataParam("file") final InputStream fileInputStream, - @FormDataParam("file") final FormDataContentDisposition contentDispositionHeader) { - - ZUGFeRDImporter zi; - logger.debug("Reading..."); - zi = new ZUGFeRDImporter(fileInputStream); - return "" + zi.getUTF8() + ""; - } - - @POST - @Path("/validateFX") - // @RolesAllowed("ADMIN") - @Consumes(MediaType.MULTIPART_FORM_DATA) - @Produces(MediaType.APPLICATION_XML) - @ApiOperation(value = "Validates a ZUGFeRD PDF file", notes = "Input PDF must be ZUGFeRD or Factur-X") - public String validateFX( - @ApiParam(required = true, value = "Input ZUGFeRD/Factur-X file") @FormDataParam("file") final InputStream fileInputStream, - @FormDataParam("file") final FormDataContentDisposition contentDispositionHeader) { - ZUGFeRDValidator zfv = new ZUGFeRDValidator(); - String validationResult = ""; - try { - - final File tempFile = File.createTempFile("tovalidate", ".pdf"); - tempFile.deleteOnExit(); - - Files.copy(fileInputStream, tempFile.toPath(), StandardCopyOption.REPLACE_EXISTING); - - validationResult = zfv.validate(tempFile.getAbsolutePath()); - } catch (Exception ex) { - logger.error(ex.getMessage(),ex); - } - - logger.debug("Validating..."); - return validationResult; - } - - @POST - @Path("/combine") - @RolesAllowed("ADMIN") - @Consumes(MediaType.MULTIPART_FORM_DATA) - @Produces(MediaType.APPLICATION_OCTET_STREAM) - @ApiOperation(value = "Combine PDF file and custom XML to zf/fx PDF", notes = "Input PDF must be PDF/A-1, output PDF will be a ZUGFeRD/Factur-X PDF/A-3 file called invoice.pdf. Demo authentication good-guy:secret") - public Response combineFile( - @ApiParam(required = true, value = "Input PDF/A-1 file") @FormDataParam("file") final InputStream fileInputStream, - @FormDataParam("file") final FormDataContentDisposition contentDispositionHeader, - @ApiParam(required = true, value = "The zf/fx XML to add to the file") @FormDataParam("xml") String XML, - @ApiParam(required = true, defaultValue = "zf", value = "zf|fx:zf for ZUGFeRD, fx for Factur-X") @FormDataParam("format") String format, - @ApiParam(required = true, defaultValue = "2", value = "version, i.e. fx 1 or zf 1 or 2") @FormDataParam("version") int version, - @ApiParam(required = true, defaultValue = "EN16931", value = "Profile: BASIC|COMFORT|EXTENDED for zf1, MINIMUM|BASICWL|BASIC|CIUS|EN16931|EXTENDED for zf2/fx1") @FormDataParam("profile") String profile) { - - ZUGFeRDExporter ze; - ByteArrayOutputStream output = new ByteArrayOutputStream(); - - try { - logger.debug("Converting to PDF/A-3u"); - - if ((version < 1) || (version > 2)) { - // this should be checked with annotations but I did not get it to work - throw new IllegalArgumentException("invalid version"); - } - - // this should be restricted to the enum with annotations but I did not get it - // to work - ZUGFeRDConformanceLevel prof = ZUGFeRDConformanceLevel.valueOf(profile); - /* - * Add .setZUGFeRDVersion and .setZUGFeRDConformanceLevel in the next lines to - * set the ZUGFeRD version respective profile of the XML you are inserting. - */ - ze = new ZUGFeRDExporterFromA1Factory().setProducer("Mustang API") - .setCreator(System.getProperty("user.name")).setZUGFeRDVersion(version) - .setZUGFeRDConformanceLevel(prof).load(fileInputStream); - logger.debug("Attaching ZUGFeRD-Data"); - if (format.equalsIgnoreCase("fx")) { - ze.setFacturX(); - } - ze.setZUGFeRDXMLData(XML.getBytes("UTF-8")); - logger.debug("Writing ZUGFeRD-PDF"); - - ze.export(output); - } catch (IOException e) { - e.printStackTrace(); - } - byte[] bytes = output.toByteArray(); - InputStream inputStream = new ByteArrayInputStream(bytes); - - return Response.ok(inputStream).header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"invoice.pdf\"") - .build(); - - } - - @POST - @Path("/test") - @Consumes(MediaType.APPLICATION_JSON) - @Produces(MediaType.APPLICATION_JSON) - @ApiOperation(value = "Returns a hello world", notes = "Just a test") - public Response test() { - - return Response.status(Response.Status.OK).entity("{\"payload\":\"test\"}").build(); - - } - -} \ No newline at end of file diff --git a/Mustang-Server/src/test/java/mustangAPI/IntegrationTest.java b/Mustang-Server/src/test/java/mustangAPI/IntegrationTest.java deleted file mode 100644 index 3c8389e8..00000000 --- a/Mustang-Server/src/test/java/mustangAPI/IntegrationTest.java +++ /dev/null @@ -1,50 +0,0 @@ -package mustangAPI; - -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.core.MediaType; - -import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature; -import api.ApiApplication; - -public class IntegrationTest { - /*@ClassRule - public static final DropwizardAppRule RULE - = new DropwizardAppRule<>(ApiApplication.class, - "config.yml"); - @Test - public void testGetGreeting() { - //test w/ssl - * //Create SSL Configurator - SslConfigurator sslConfigurator = SslConfigurator.newInstance(); - //Register a keystore - sslConfigurator.trustStoreFile("dwstart.keystore") - .trustStorePassword("crimson"); - //Create SSL Context - SSLContext sSLContext = sslConfigurator.createSSLContext(); - //Obtain client - Client client = ClientBuilder - .newBuilder() - .sslContext(sSLContext) - .build(); - - - - - String expected = "Hello world!"; - //Obtain client - Client client = ClientBuilder.newClient(); - //Build a feature in basic authentication mode - HttpAuthenticationFeature feature - = HttpAuthenticationFeature.basic("javaeeeee", "crimson"); - //Register the feature - client.register(feature); - //Get actual resul string - String actual = client - .target("http://localhost:8080/secured_hello") - .request(MediaType.TEXT_PLAIN) - .get(String.class); - //Do an assertion - assertEquals(expected, actual); - }*/ - } diff --git a/NOTICE b/NOTICE index 75b846a1..85b08d6a 100644 --- a/NOTICE +++ b/NOTICE @@ -22,4 +22,8 @@ Copyright (c) 2002-2007, www.pdfbox.org Copyright (c) 2006-2007, www.jempbox.org Apache PDFBox was based on source code originally developed in the PaDaF project. -Copyright (c) 2010 Atos Worldline SAS \ No newline at end of file +Copyright (c) 2010 Atos Worldline SAS + +Based on VeraPDF-library https://github.com/veraPDF/veraPDF-library licensed under the MPL 2.0 +Based on PH-Schematron https://github.com/phax/ph-schematron licensed under the APL2.0 +Based on https://github.com/itplr-kosit/xrechnung-schematron licensed under the APL2.0 diff --git a/NOTICE.txt b/NOTICE.txt deleted file mode 100644 index 2d28d372..00000000 --- a/NOTICE.txt +++ /dev/null @@ -1,14 +0,0 @@ -Apache PDFBox -Copyright 2014 The Apache Software Foundation - -This product includes software developed at -The Apache Software Foundation (http://www.apache.org/). - -Based on source code originally developed in the PDFBox, JempBox and -FontBox projects. -Copyright (c) 2002-2007, www.pdfbox.org -Copyright (c) 2006-2007, www.jempbox.org - -Based on source code originally developed in the PaDaF project. -Copyright (c) 2010 Atos Worldline SAS - diff --git a/libraryExtended/ZUV-Architektur.graphml b/doc/ZUV-Architektur.graphml similarity index 100% rename from libraryExtended/ZUV-Architektur.graphml rename to doc/ZUV-Architektur.graphml diff --git a/libraryExtended/ZUV-Architektur.svg b/doc/ZUV-Architektur.svg similarity index 100% rename from libraryExtended/ZUV-Architektur.svg rename to doc/ZUV-Architektur.svg diff --git a/libraryBasic/pom.xml b/library/pom.xml similarity index 97% rename from libraryBasic/pom.xml rename to library/pom.xml index d006d1be..a063478c 100644 --- a/libraryBasic/pom.xml +++ b/library/pom.xml @@ -8,10 +8,10 @@ 4.0.0 org.mustangproject - libraryBasic + library 2.0.0-SNAPSHOT jar - libraryBasic + Library for to write and read FacturX 1.0 and ZUGFeRD 1.0 and 2.1 e-invoices. A PDF/A file is required, the XML can be generated or provided. The Mustang project is a java library to read and write ZUGFeRD meta data inside your invoice PDFs http://www.mustangproject.org/ @@ -19,7 +19,7 @@ scm:git:https://github.com/ZUGFeRD/mustangproject.git scm:git:https://github.com/ZUGFeRD/mustangproject.git https://github.com/ZUGFeRD/mustangproject - mustang-1.7.3 + mustang-2.0.0-SNAPSHOT diff --git a/libraryBasic/src/main/java-templates/org/mustangproject/ZUGFeRD/Version.java b/library/src/main/java-templates/org/mustangproject/ZUGFeRD/Version.java similarity index 100% rename from libraryBasic/src/main/java-templates/org/mustangproject/ZUGFeRD/Version.java rename to library/src/main/java-templates/org/mustangproject/ZUGFeRD/Version.java diff --git a/libraryBasic/src/main/java/org/mustangproject/XMLTools.java b/library/src/main/java/org/mustangproject/XMLTools.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/XMLTools.java rename to library/src/main/java/org/mustangproject/XMLTools.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/Contact.java b/library/src/main/java/org/mustangproject/ZUGFeRD/Contact.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/Contact.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/Contact.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/CustomXMLProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/CustomXMLProvider.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/CustomXMLProvider.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/CustomXMLProvider.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/IExporterFactory.java b/library/src/main/java/org/mustangproject/ZUGFeRD/IExporterFactory.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/IExporterFactory.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/IExporterFactory.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/IProfileProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/IProfileProvider.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/IProfileProvider.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/IProfileProvider.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/IXMLProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/IXMLProvider.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/IXMLProvider.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/IXMLProvider.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDAllowanceCharge.java b/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDAllowanceCharge.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDAllowanceCharge.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDAllowanceCharge.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDDate.java b/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDDate.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDDate.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDDate.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableContact.java b/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableContact.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableContact.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableContact.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java b/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableProduct.java b/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableProduct.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableProduct.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableProduct.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableTransaction.java b/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableTransaction.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableTransaction.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableTransaction.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDPaymentDiscountTerms.java b/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDPaymentDiscountTerms.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDPaymentDiscountTerms.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDPaymentDiscountTerms.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDPaymentTerms.java b/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDPaymentTerms.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDPaymentTerms.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDPaymentTerms.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDTradeSettlement.java b/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDTradeSettlement.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDTradeSettlement.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDTradeSettlement.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDTradeSettlementDebit.java b/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDTradeSettlementDebit.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDTradeSettlementDebit.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDTradeSettlementDebit.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDTradeSettlementPayment.java b/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDTradeSettlementPayment.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDTradeSettlementPayment.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDTradeSettlementPayment.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/Item.java b/library/src/main/java/org/mustangproject/ZUGFeRD/Item.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/Item.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/Item.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/PDFAConformanceLevel.java b/library/src/main/java/org/mustangproject/ZUGFeRD/PDFAConformanceLevel.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/PDFAConformanceLevel.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/PDFAConformanceLevel.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/Product.java b/library/src/main/java/org/mustangproject/ZUGFeRD/Product.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/Product.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/Product.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/VATAmount.java b/library/src/main/java/org/mustangproject/ZUGFeRD/VATAmount.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/VATAmount.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/VATAmount.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/XMPSchemaPDFAExtensions.java b/library/src/main/java/org/mustangproject/ZUGFeRD/XMPSchemaPDFAExtensions.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/XMPSchemaPDFAExtensions.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/XMPSchemaPDFAExtensions.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/XMPSchemaZugferd.java b/library/src/main/java/org/mustangproject/ZUGFeRD/XMPSchemaZugferd.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/XMPSchemaZugferd.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/XMPSchemaZugferd.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD1PullProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD1PullProvider.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD1PullProvider.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD1PullProvider.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java similarity index 99% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java index 3b0425c4..34ce859e 100644 --- a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java @@ -35,7 +35,6 @@ import org.dom4j.DocumentHelper; import org.dom4j.io.OutputFormat; import org.dom4j.io.XMLWriter; import org.mustangproject.XMLTools; -import org.mustangproject.toecount.Toecount; public class ZUGFeRD2PullProvider implements IXMLProvider, IProfileProvider { @@ -574,7 +573,7 @@ public class ZUGFeRD2PullProvider implements IXMLProvider, IProfileProvider { zugferdData = zugferdRaw; } } catch (UnsupportedEncodingException e) { - Logger.getLogger(Toecount.class.getName()).log(Level.SEVERE, null, e); + Logger.getLogger(ZUGFeRD2PullProvider.class.getName()).log(Level.SEVERE, null, e); } // $NON-NLS-1$ } diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PushProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PushProvider.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PushProvider.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PushProvider.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDConformanceLevel.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDConformanceLevel.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDConformanceLevel.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDConformanceLevel.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDDateFormat.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDDateFormat.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDDateFormat.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDDateFormat.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExportException.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExportException.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExportException.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExportException.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporter.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporter.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporter.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporter.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporterFromA1Factory.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporterFromA1Factory.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporterFromA1Factory.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporterFromA1Factory.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporterFromA3Factory.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporterFromA3Factory.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporterFromA3Factory.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporterFromA3Factory.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporterException.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporterException.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporterException.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporterException.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDMigrator.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDMigrator.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDMigrator.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDMigrator.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDVisualizer.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDVisualizer.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDVisualizer.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDVisualizer.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/model/DateTimeTypeConstants.java b/library/src/main/java/org/mustangproject/ZUGFeRD/model/DateTimeTypeConstants.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/model/DateTimeTypeConstants.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/model/DateTimeTypeConstants.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/model/DocumentCodeTypeConstants.java b/library/src/main/java/org/mustangproject/ZUGFeRD/model/DocumentCodeTypeConstants.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/model/DocumentCodeTypeConstants.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/model/DocumentCodeTypeConstants.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/model/DocumentContextParameterTypeConstants.java b/library/src/main/java/org/mustangproject/ZUGFeRD/model/DocumentContextParameterTypeConstants.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/model/DocumentContextParameterTypeConstants.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/model/DocumentContextParameterTypeConstants.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/model/NoteTypeConstants.java b/library/src/main/java/org/mustangproject/ZUGFeRD/model/NoteTypeConstants.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/model/NoteTypeConstants.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/model/NoteTypeConstants.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/model/PaymentMeansCodeTypeConstants.java b/library/src/main/java/org/mustangproject/ZUGFeRD/model/PaymentMeansCodeTypeConstants.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/model/PaymentMeansCodeTypeConstants.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/model/PaymentMeansCodeTypeConstants.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/model/QuantityTypeConstants.java b/library/src/main/java/org/mustangproject/ZUGFeRD/model/QuantityTypeConstants.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/model/QuantityTypeConstants.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/model/QuantityTypeConstants.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/model/TaxCategoryCodeTypeConstants.java b/library/src/main/java/org/mustangproject/ZUGFeRD/model/TaxCategoryCodeTypeConstants.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/model/TaxCategoryCodeTypeConstants.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/model/TaxCategoryCodeTypeConstants.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/model/TaxRegistrationTypeConstants.java b/library/src/main/java/org/mustangproject/ZUGFeRD/model/TaxRegistrationTypeConstants.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/model/TaxRegistrationTypeConstants.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/model/TaxRegistrationTypeConstants.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/model/TaxTypeCodeTypeConstants.java b/library/src/main/java/org/mustangproject/ZUGFeRD/model/TaxTypeCodeTypeConstants.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/model/TaxTypeCodeTypeConstants.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/model/TaxTypeCodeTypeConstants.java diff --git a/libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/model/ZFNamespacePrefixMapper.java b/library/src/main/java/org/mustangproject/ZUGFeRD/model/ZFNamespacePrefixMapper.java similarity index 100% rename from libraryBasic/src/main/java/org/mustangproject/ZUGFeRD/model/ZFNamespacePrefixMapper.java rename to library/src/main/java/org/mustangproject/ZUGFeRD/model/ZFNamespacePrefixMapper.java diff --git a/libraryBasic/src/main/resources/COMFORTtoEN16931.xsl b/library/src/main/resources/COMFORTtoEN16931.xsl similarity index 100% rename from libraryBasic/src/main/resources/COMFORTtoEN16931.xsl rename to library/src/main/resources/COMFORTtoEN16931.xsl diff --git a/libraryBasic/src/main/resources/schema/ZUGFeRD1p0.xsd b/library/src/main/resources/schema/ZUGFeRD1p0.xsd similarity index 100% rename from libraryBasic/src/main/resources/schema/ZUGFeRD1p0.xsd rename to library/src/main/resources/schema/ZUGFeRD1p0.xsd diff --git a/libraryBasic/src/main/resources/schema/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_QualifiedDataType_12.xsd b/library/src/main/resources/schema/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_QualifiedDataType_12.xsd similarity index 100% rename from libraryBasic/src/main/resources/schema/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_QualifiedDataType_12.xsd rename to library/src/main/resources/schema/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_QualifiedDataType_12.xsd diff --git a/libraryBasic/src/main/resources/schema/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_12.xsd b/library/src/main/resources/schema/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_12.xsd similarity index 100% rename from libraryBasic/src/main/resources/schema/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_12.xsd rename to library/src/main/resources/schema/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_12.xsd diff --git a/libraryBasic/src/main/resources/schema/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_15.xsd b/library/src/main/resources/schema/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_15.xsd similarity index 100% rename from libraryBasic/src/main/resources/schema/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_15.xsd rename to library/src/main/resources/schema/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_15.xsd diff --git a/libraryBasic/src/main/resources/stylesheets/ZUGFeRD_1p0_c1p0_s1p0.xslt b/library/src/main/resources/stylesheets/ZUGFeRD_1p0_c1p0_s1p0.xslt similarity index 100% rename from libraryBasic/src/main/resources/stylesheets/ZUGFeRD_1p0_c1p0_s1p0.xslt rename to library/src/main/resources/stylesheets/ZUGFeRD_1p0_c1p0_s1p0.xslt diff --git a/libraryBasic/src/test/java/org/mustangproject/ZUGFeRD/BackwardCompatibilityTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/BackwardCompatibilityTest.java similarity index 100% rename from libraryBasic/src/test/java/org/mustangproject/ZUGFeRD/BackwardCompatibilityTest.java rename to library/src/test/java/org/mustangproject/ZUGFeRD/BackwardCompatibilityTest.java diff --git a/libraryBasic/src/test/java/org/mustangproject/ZUGFeRD/BaseTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/BaseTest.java similarity index 100% rename from libraryBasic/src/test/java/org/mustangproject/ZUGFeRD/BaseTest.java rename to library/src/test/java/org/mustangproject/ZUGFeRD/BaseTest.java diff --git a/libraryBasic/src/test/java/org/mustangproject/ZUGFeRD/IZUGFeRDAllowanceChargeImpl.java b/library/src/test/java/org/mustangproject/ZUGFeRD/IZUGFeRDAllowanceChargeImpl.java similarity index 100% rename from libraryBasic/src/test/java/org/mustangproject/ZUGFeRD/IZUGFeRDAllowanceChargeImpl.java rename to library/src/test/java/org/mustangproject/ZUGFeRD/IZUGFeRDAllowanceChargeImpl.java diff --git a/libraryBasic/src/test/java/org/mustangproject/ZUGFeRD/IZUGFeRDDateImpl.java b/library/src/test/java/org/mustangproject/ZUGFeRD/IZUGFeRDDateImpl.java similarity index 100% rename from libraryBasic/src/test/java/org/mustangproject/ZUGFeRD/IZUGFeRDDateImpl.java rename to library/src/test/java/org/mustangproject/ZUGFeRD/IZUGFeRDDateImpl.java diff --git a/libraryBasic/src/test/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableContactImpl.java b/library/src/test/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableContactImpl.java similarity index 100% rename from libraryBasic/src/test/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableContactImpl.java rename to library/src/test/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableContactImpl.java diff --git a/libraryBasic/src/test/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItemImpl.java b/library/src/test/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItemImpl.java similarity index 100% rename from libraryBasic/src/test/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItemImpl.java rename to library/src/test/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItemImpl.java diff --git a/libraryBasic/src/test/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableProductImpl.java b/library/src/test/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableProductImpl.java similarity index 100% rename from libraryBasic/src/test/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableProductImpl.java rename to library/src/test/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableProductImpl.java diff --git a/libraryBasic/src/test/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableTransactionImpl.java b/library/src/test/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableTransactionImpl.java similarity index 100% rename from libraryBasic/src/test/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableTransactionImpl.java rename to library/src/test/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableTransactionImpl.java diff --git a/libraryBasic/src/test/java/org/mustangproject/ZUGFeRD/IZUGFeRDTradeSettlementPaymentImpl.java b/library/src/test/java/org/mustangproject/ZUGFeRD/IZUGFeRDTradeSettlementPaymentImpl.java similarity index 100% rename from libraryBasic/src/test/java/org/mustangproject/ZUGFeRD/IZUGFeRDTradeSettlementPaymentImpl.java rename to library/src/test/java/org/mustangproject/ZUGFeRD/IZUGFeRDTradeSettlementPaymentImpl.java diff --git a/libraryBasic/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderTestCase.java b/library/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderTestCase.java similarity index 100% rename from libraryBasic/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderTestCase.java rename to library/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderTestCase.java diff --git a/libraryBasic/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterCustomXMLTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterCustomXMLTest.java similarity index 100% rename from libraryBasic/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterCustomXMLTest.java rename to library/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterCustomXMLTest.java diff --git a/libraryBasic/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterEdgeTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterEdgeTest.java similarity index 100% rename from libraryBasic/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterEdgeTest.java rename to library/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterEdgeTest.java diff --git a/libraryBasic/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterTest.java similarity index 100% rename from libraryBasic/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterTest.java rename to library/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterTest.java diff --git a/libraryBasic/src/test/java/org/mustangproject/ZUGFeRD/ResourceUtilities.java b/library/src/test/java/org/mustangproject/ZUGFeRD/ResourceUtilities.java similarity index 100% rename from libraryBasic/src/test/java/org/mustangproject/ZUGFeRD/ResourceUtilities.java rename to library/src/test/java/org/mustangproject/ZUGFeRD/ResourceUtilities.java diff --git a/libraryBasic/src/test/java/org/mustangproject/ZUGFeRD/VersionMigrationTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/VersionMigrationTest.java similarity index 100% rename from libraryBasic/src/test/java/org/mustangproject/ZUGFeRD/VersionMigrationTest.java rename to library/src/test/java/org/mustangproject/ZUGFeRD/VersionMigrationTest.java diff --git a/libraryBasic/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java similarity index 100% rename from libraryBasic/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java rename to library/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java diff --git a/libraryBasic/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java similarity index 100% rename from libraryBasic/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java rename to library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java diff --git a/libraryBasic/src/test/java/org/mustangproject/ZUGFeRD/ZF2Test.java b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2Test.java similarity index 100% rename from libraryBasic/src/test/java/org/mustangproject/ZUGFeRD/ZF2Test.java rename to library/src/test/java/org/mustangproject/ZUGFeRD/ZF2Test.java diff --git a/libraryBasic/src/test/java/org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java similarity index 100% rename from libraryBasic/src/test/java/org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java rename to library/src/test/java/org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java diff --git a/libraryBasic/src/test/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverterTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverterTest.java similarity index 100% rename from libraryBasic/src/test/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverterTest.java rename to library/src/test/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverterTest.java diff --git a/libraryBasic/src/test/java/org/mustangproject/ZUGFeRD/ZUGFeRDXMLAssert.java b/library/src/test/java/org/mustangproject/ZUGFeRD/ZUGFeRDXMLAssert.java similarity index 100% rename from libraryBasic/src/test/java/org/mustangproject/ZUGFeRD/ZUGFeRDXMLAssert.java rename to library/src/test/java/org/mustangproject/ZUGFeRD/ZUGFeRDXMLAssert.java diff --git a/libraryBasic/src/test/resources/MustangGnuaccountingBeispielRE-20170509_505.pdf b/library/src/test/resources/MustangGnuaccountingBeispielRE-20170509_505.pdf similarity index 100% rename from libraryBasic/src/test/resources/MustangGnuaccountingBeispielRE-20170509_505.pdf rename to library/src/test/resources/MustangGnuaccountingBeispielRE-20170509_505.pdf diff --git a/libraryBasic/src/test/resources/MustangGnuaccountingBeispielRE-20170509_505PDF14.pdf b/library/src/test/resources/MustangGnuaccountingBeispielRE-20170509_505PDF14.pdf similarity index 100% rename from libraryBasic/src/test/resources/MustangGnuaccountingBeispielRE-20170509_505PDF14.pdf rename to library/src/test/resources/MustangGnuaccountingBeispielRE-20170509_505PDF14.pdf diff --git a/libraryBasic/src/test/resources/MustangGnuaccountingBeispielRE-20170509_505PDFA3.pdf b/library/src/test/resources/MustangGnuaccountingBeispielRE-20170509_505PDFA3.pdf similarity index 100% rename from libraryBasic/src/test/resources/MustangGnuaccountingBeispielRE-20170509_505PDFA3.pdf rename to library/src/test/resources/MustangGnuaccountingBeispielRE-20170509_505PDFA3.pdf diff --git a/libraryBasic/src/test/resources/MustangGnuaccountingBeispielRE-20170509_505blanko.pdf b/library/src/test/resources/MustangGnuaccountingBeispielRE-20170509_505blanko.pdf similarity index 100% rename from libraryBasic/src/test/resources/MustangGnuaccountingBeispielRE-20170509_505blanko.pdf rename to library/src/test/resources/MustangGnuaccountingBeispielRE-20170509_505blanko.pdf diff --git a/libraryBasic/src/test/resources/MustangGnuaccountingBeispielRE-20171118_506blanko.pdf b/library/src/test/resources/MustangGnuaccountingBeispielRE-20171118_506blanko.pdf similarity index 100% rename from libraryBasic/src/test/resources/MustangGnuaccountingBeispielRE-20171118_506blanko.pdf rename to library/src/test/resources/MustangGnuaccountingBeispielRE-20171118_506blanko.pdf diff --git a/libraryBasic/src/test/resources/MustangGnuaccountingBeispielRE-20190610_507blanko.pdf b/library/src/test/resources/MustangGnuaccountingBeispielRE-20190610_507blanko.pdf similarity index 100% rename from libraryBasic/src/test/resources/MustangGnuaccountingBeispielRE-20190610_507blanko.pdf rename to library/src/test/resources/MustangGnuaccountingBeispielRE-20190610_507blanko.pdf diff --git a/libraryBasic/src/test/resources/ZUGFeRD_1p0.scmt b/library/src/test/resources/ZUGFeRD_1p0.scmt similarity index 100% rename from libraryBasic/src/test/resources/ZUGFeRD_1p0.scmt rename to library/src/test/resources/ZUGFeRD_1p0.scmt diff --git a/libraryBasic/src/test/resources/migration/input/ZUGFeRD1-invoice-adjusted.xml b/library/src/test/resources/migration/input/ZUGFeRD1-invoice-adjusted.xml similarity index 100% rename from libraryBasic/src/test/resources/migration/input/ZUGFeRD1-invoice-adjusted.xml rename to library/src/test/resources/migration/input/ZUGFeRD1-invoice-adjusted.xml diff --git a/libraryBasic/src/test/resources/migration/input/ZUGFeRD1-invoice.xml b/library/src/test/resources/migration/input/ZUGFeRD1-invoice.xml similarity index 100% rename from libraryBasic/src/test/resources/migration/input/ZUGFeRD1-invoice.xml rename to library/src/test/resources/migration/input/ZUGFeRD1-invoice.xml diff --git a/libraryBasic/src/test/resources/migration/input/ZUGFeRD1_COMFORT_Einfach.xml b/library/src/test/resources/migration/input/ZUGFeRD1_COMFORT_Einfach.xml similarity index 100% rename from libraryBasic/src/test/resources/migration/input/ZUGFeRD1_COMFORT_Einfach.xml rename to library/src/test/resources/migration/input/ZUGFeRD1_COMFORT_Einfach.xml diff --git a/libraryBasic/src/test/resources/migration/input/ZUGFeRD1_EXTENDED_Warenrechnung.xml b/library/src/test/resources/migration/input/ZUGFeRD1_EXTENDED_Warenrechnung.xml similarity index 100% rename from libraryBasic/src/test/resources/migration/input/ZUGFeRD1_EXTENDED_Warenrechnung.xml rename to library/src/test/resources/migration/input/ZUGFeRD1_EXTENDED_Warenrechnung.xml diff --git a/libraryBasic/src/test/resources/migration/reference/ZUGFeRD2-invoice-adjusted.xml b/library/src/test/resources/migration/reference/ZUGFeRD2-invoice-adjusted.xml similarity index 100% rename from libraryBasic/src/test/resources/migration/reference/ZUGFeRD2-invoice-adjusted.xml rename to library/src/test/resources/migration/reference/ZUGFeRD2-invoice-adjusted.xml diff --git a/libraryBasic/src/test/resources/migration/reference/ZUGFeRD2-invoice.xml b/library/src/test/resources/migration/reference/ZUGFeRD2-invoice.xml similarity index 100% rename from libraryBasic/src/test/resources/migration/reference/ZUGFeRD2-invoice.xml rename to library/src/test/resources/migration/reference/ZUGFeRD2-invoice.xml diff --git a/libraryBasic/src/test/resources/migration/reference/ZUGFeRD2_COMFORT_Einfach.xml b/library/src/test/resources/migration/reference/ZUGFeRD2_COMFORT_Einfach.xml similarity index 100% rename from libraryBasic/src/test/resources/migration/reference/ZUGFeRD2_COMFORT_Einfach.xml rename to library/src/test/resources/migration/reference/ZUGFeRD2_COMFORT_Einfach.xml diff --git a/libraryBasic/src/test/resources/migration/reference/ZUGFeRD2_EXTENDED_Warenrechnung.xml b/library/src/test/resources/migration/reference/ZUGFeRD2_EXTENDED_Warenrechnung.xml similarity index 100% rename from libraryBasic/src/test/resources/migration/reference/ZUGFeRD2_EXTENDED_Warenrechnung.xml rename to library/src/test/resources/migration/reference/ZUGFeRD2_EXTENDED_Warenrechnung.xml diff --git a/libraryBasic/src/test/resources/zugferd_invoice.pdf b/library/src/test/resources/zugferd_invoice.pdf similarity index 100% rename from libraryBasic/src/test/resources/zugferd_invoice.pdf rename to library/src/test/resources/zugferd_invoice.pdf diff --git a/libraryBasic/src/main/java/org/mustangproject/toecount/FileChecker.java b/libraryBasic/src/main/java/org/mustangproject/toecount/FileChecker.java deleted file mode 100755 index 27273e2e..00000000 --- a/libraryBasic/src/main/java/org/mustangproject/toecount/FileChecker.java +++ /dev/null @@ -1,95 +0,0 @@ -/** ********************************************************************** - * - * Copyright 2018 Jochen Staerk - * - * Use is subject to license terms. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy - * of the License at http://www.apache.org/licenses/LICENSE-2.0. - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * - * See the License for the specific language governing permissions and - * limitations under the License. - * - *********************************************************************** */ -package org.mustangproject.toecount; - -import java.math.BigDecimal; - -import org.mustangproject.ZUGFeRD.ZUGFeRDImporter; - -public class FileChecker { - String filename; - StatRun thisRun; - boolean isPDF = false; - - public FileChecker(String filename, StatRun statistics) { - this.filename = filename; - thisRun = statistics; - thisRun.incFileCount(); - String extension = ""; - if (!thisRun.shallIgnoreFileExt()) { - int extIndex = filename.lastIndexOf("."); - if (extIndex >= 0) { - extension = filename.substring(extIndex).toLowerCase(); - isPDF = extension.equals(".pdf");// alternative check for PDF: File starts with %PDF- - if (isPDF) { - thisRun.incPDFCount(); - } - } - - } else { - thisRun.incPDFCount(); - } - } - - public boolean checkForZUGFeRD() { - if ((!isPDF) && (!thisRun.shallIgnoreFileExt())) { - return false; - } - ZUGFeRDImporter zi = new ZUGFeRDImporter(filename); - try { - if (zi.canParse()) { - thisRun.incZUGFeRDCount(zi.getVersion()); - thisRun.incTotal(new BigDecimal(zi.getAmount())); - return true; - } else { - return false; - } - } catch (NullPointerException e) { - // something really rare happened -- corrupted ZF? - /*** - * e.g. Exception in thread "main" java.lang.NullPointerException - at org.mustangproject.ZUGFeRD.ZUGFeRDImporter.extractLowLevel(ZUGFeRDImporter.java:90) - at org.mustangproject.ZUGFeRD.ZUGFeRDImporter.extract(ZUGFeRDImporter.java:64) - at toecount.FileChecker.checkForZUGFeRD(FileChecker.java:33) - at toecount.Toecount.main(Toecount.java:111) - * - */ - // Ignore nevertheless, most likely we're batch processing - return false; - } catch (Exception e2) { - /** - * probably thrown up from - AM org.apache.pdfbox.pdfparser.PDFParser parse, most likely - INFORMATION: Document is encrypted - but also other internal PDF errors possible like - ..Okt 23, 2015 11:17:53 AM org.apache.pdfbox.pdfparser.XrefTrailerResolver setStartxref - */ - return false; - } - } - - public boolean isPDF() { - return isPDF; - } - - public String getOutputLine() { - return thisRun.getOutputLine(); - } - -} diff --git a/libraryBasic/src/main/java/org/mustangproject/toecount/FileTraverser.java b/libraryBasic/src/main/java/org/mustangproject/toecount/FileTraverser.java deleted file mode 100755 index da530782..00000000 --- a/libraryBasic/src/main/java/org/mustangproject/toecount/FileTraverser.java +++ /dev/null @@ -1,75 +0,0 @@ -/** ********************************************************************** - * - * Copyright 2018 Jochen Staerk - * - * Use is subject to license terms. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy - * of the License at http://www.apache.org/licenses/LICENSE-2.0. - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * - * See the License for the specific language governing permissions and - * limitations under the License. - * - *********************************************************************** */ -package org.mustangproject.toecount; - -import java.io.IOException; -import java.nio.file.FileVisitResult; -import java.nio.file.Path; -import java.nio.file.SimpleFileVisitor; -import java.nio.file.attribute.BasicFileAttributes; - -import static java.nio.file.FileVisitResult.CONTINUE; - -public class FileTraverser extends SimpleFileVisitor { - - - private StatRun thisRun; - - public FileTraverser(StatRun statistics) { - this.thisRun = statistics; - } - - /** - * check each file - */ - @Override - public FileVisitResult visitFile(Path file, BasicFileAttributes attr) { - if (attr.isSymbolicLink()) { - // Not yet handled - } else if (attr.isRegularFile()) { - String filename = file.toString(); - FileChecker fc = new FileChecker(filename, thisRun); - fc.checkForZUGFeRD(); - System.out.print(fc.getOutputLine()); - - } - return CONTINUE; - } - - /** - * for each directory - */ - @Override - public FileVisitResult postVisitDirectory(Path dir, IOException exc) { - // System.out.format("Directory: %s%n", dir); - thisRun.incDirCount(); - return CONTINUE; - } - - - /** - * show errors like file permission stacktraces - */ - @Override - public FileVisitResult visitFileFailed(Path file, IOException exc) { - System.err.println(exc); - return CONTINUE; - } - -} diff --git a/libraryBasic/src/main/java/org/mustangproject/toecount/StatRun.java b/libraryBasic/src/main/java/org/mustangproject/toecount/StatRun.java deleted file mode 100755 index 8768850b..00000000 --- a/libraryBasic/src/main/java/org/mustangproject/toecount/StatRun.java +++ /dev/null @@ -1,99 +0,0 @@ -/** ********************************************************************** - * - * Copyright 2018 Jochen Staerk - * - * Use is subject to license terms. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy - * of the License at http://www.apache.org/licenses/LICENSE-2.0. - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * - * See the License for the specific language governing permissions and - * limitations under the License. - * - *********************************************************************** */ -package org.mustangproject.toecount; - -import java.math.BigDecimal; - -public class StatRun { - private int pdfCount = 0; - private int horseCount = 0; - private int fileCount = 0; - private int dirCount = 0; - private BigDecimal total = BigDecimal.ZERO; - private boolean checkFileExt = true; - - public void ignoreFileExtension() { - checkFileExt = false; - } - - public boolean shallIgnoreFileExt() { - return !checkFileExt; - } - - public void incFileCount() { - fileCount++; - } - - public void incPDFCount() { - pdfCount++; - } - - public void incZUGFeRDCount(int version) { - horseCount++; - } - - public void incDirCount() { - dirCount++; - } - - public int getFileCount() { - return fileCount; - } - - public int getPDFCount() { - return pdfCount; - } - - public int getZUGFeRDCount() { - return horseCount; - } - - public int getDirCount() { - return dirCount; - } - - /** - * returns final statistics - * - * @return english string with linefeeds detailling number of files, directories, number of pdfs and of zugferd files - */ - public String getSummaryLine() { - - return "\r\n===================================================================\r\n" + String.format( - "Files:\t%d\tDirs:\t%d\tPDF:\t%d\tZUGFeRD:\t%d\tTotal:\t%s\r\n", - getFileCount(), getDirCount(), getPDFCount(), getZUGFeRDCount(), total.toString()); - - } - - /** - * show that something is happening - * - * @return String, usually a dot - */ - public String getOutputLine() { - return "."; - } - - public void incTotal(BigDecimal delta) { - total=total.add(delta); - - } - - -} diff --git a/libraryBasic/src/main/java/org/mustangproject/toecount/Toecount.java b/libraryBasic/src/main/java/org/mustangproject/toecount/Toecount.java deleted file mode 100755 index a29e58c8..00000000 --- a/libraryBasic/src/main/java/org/mustangproject/toecount/Toecount.java +++ /dev/null @@ -1,621 +0,0 @@ -/** ********************************************************************** - * - * Copyright 2018 Jochen Staerk - * - * Use is subject to license terms. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy - * of the License at http://www.apache.org/licenses/LICENSE-2.0. - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * - * See the License for the specific language governing permissions and - * limitations under the License. - * - *********************************************************************** */ -package org.mustangproject.toecount; - -import java.io.BufferedReader; -import java.io.File; -import java.io.IOException; -import java.io.InputStreamReader; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.logging.Level; -import java.util.logging.Logger; - -import javax.xml.transform.TransformerException; - -import org.mustangproject.ZUGFeRD.ZUGFeRDConformanceLevel; -import org.mustangproject.ZUGFeRD.ZUGFeRDExporter; -import org.mustangproject.ZUGFeRD.ZUGFeRDExporterFromA1Factory; -import org.mustangproject.ZUGFeRD.ZUGFeRDImporter; -import org.mustangproject.ZUGFeRD.ZUGFeRDMigrator; - -/*** - * This is the command line interface to mustangproject - * - */ - -import com.sanityinc.jargs.CmdLineParser; -import com.sanityinc.jargs.CmdLineParser.Option; - -public class Toecount { - // build with: /opt/local/bin/mvn clean compile assembly:single - private static void printUsage() { - System.err.println(getUsage()); - } - - private static String getUsage() { - return "Usage: [-d,--directory] [-l,--listfromstdin] [-i,--ignorefileextension] | [-c,--combine] | [-e,--extract] | [-u,--upgrade] | [-a,--a3only] | [-h,--help] \r\n" - + "* Count operations\n" + " -d, --directory count ZUGFeRD files in directory to be scanned\n" - + " If it is a directory, it will recurse.\n" - + " -l, --listfromstdin count ZUGFeRD files from a list of linefeed separated files on runtime.\n" - + " It will start once a blank line has been entered.\n" + "\n" - + " Additional parameter for both count operations\n" - + " [-i, --ignorefileextension] Check for all files (*.*) instead of PDF files only (*.pdf)\n" - + "\n" + "* Merge operations\n" + " -e, --extract extract ZUGFeRD PDF to XML file\n" - + " Additional parameters (optional - user will be prompted if not defined)\n" - + " [--source ]: set input PDF file\n" - + " [--out ]: set output XML file\n" - + " -u, --upgrade upgrade ZUGFeRD XML to ZUGFeRD 2 XML\n" - + " Additional parameters (optional - user will be prompted if not defined)\n" - + " [--source ]: set input XML ZUGFeRD 1 file\n" - + " [--out ]: set output XML ZUGFeRD 2 file\n" - + " -a, --a3only upgrade from PDF/A1 to A3 only (no ZUGFeRD data attached)\n" - + " Additional parameters (optional - user will be prompted if not defined)\n" - + " [--source ]: set input PDF file\n" - + " [--out ]: set output PDF file\n" - + " -c, --combine combine XML and PDF file to ZUGFeRD PDF file\n" - + " Additional parameters (optional - user will be prompted if not defined)\n" - + " [--source ]: set input PDF file\n" - + " [--source-xml ]: set input XML file\n" - + " [--out ]: set output PDF file\n" - + " [--format ]: set ZUGFeRD or FacturX\n" - + " [--version <1|2>]: set ZUGFeRD version\n" - + " [--profile <...>]: set ZUGFeRD profile\n" - + " For ZUGFeRD v1: ASIC, OMFORT or XTENDED\n" - + " For ZUGFeRD v2: INIMUM, BASIC L, ASIC, IUS, N16931, ETENDED "; - } - - private static void printHelp() { - System.out.println("Mustangproject.org " + org.mustangproject.ZUGFeRD.Version.VERSION + " \r\n" - + "A Apache Public License library and command line tool for statistics on PDF invoices with\r\n" - + "ZUGFeRD Metadata (http://www.zugferd.org)\r\n" + "\r\n" + getUsage() + "\r\n" - + "* Count operations\r\n" + "\t-d, --directory\tcount ZUGFeRD files in directory to be scanned\r\n" - + "\t\tIf it is a directory, it will recurse.\r\n" - + "\t-l, --listfromstdin\tcount ZUGFeRD files from a list of linefeed separated files on runtime.\r\n" - + "\t\tIt will start once a blank line has been entered.\r\n" + "\r\n" - + "\tAdditional parameter for both count operations\r\n" - + "\t[-i, --ignorefileextension]\tCheck for all files (*.*) instead of PDF files only (*.pdf)\r\n" - + "\r\n" + "* Merge operations\r\n" + "\t-e, --extract\textract ZUGFeRD PDF to XML file\r\n" - + "\t\tAdditional parameters (optional - user will be prompted if not defined)\r\n" - + "\t\t[--source ]: set input PDF file\r\n" - + "\t\t[--out ]: set output XML file\r\n" - + "\t-u, --upgrade\tupgrade ZUGFeRD XML to ZUGFeRD 2 XML\r\n" - + "\t\tAdditional parameters (optional - user will be prompted if not defined)\r\n" - + "\t\t[--source ]: set input XML ZUGFeRD 1 file\r\n" - + "\t\t[--out ]: set output XML ZUGFeRD 2 file\r\n" - + "\t-a, --a3only\tupgrade from PDF/A1 to A3 only (no ZUGFeRD data attached) \r\n" - + "\t\tAdditional parameters (optional - user will be prompted if not defined)\r\n" - + "\t\t[--source ]: set input PDF file\r\n" - + "\t\t[--out ]: set output PDF file\r\n" - + "\t-c, --combine\tcombine XML and PDF file to ZUGFeRD PDF file\r\n" - + "\t\tAdditional parameters (optional - user will be prompted if not defined)\r\n" - + "\t\t[--source ]: set input PDF file\r\n" - + "\t\t[--source-xml ]: set input XML file\r\n" - + "\t\t[--out ]: set output PDF file\r\n" - + "\t\t[--format ]: enable factur-x or ZUGFeRD\r\n" - + "\t\t[--version <1|2>]: set ZUGFeRD version\r\n" + "\t\t[--profile <...>]: set ZUGFeRD profile\r\n" - + "\t\t\tFor ZUGFeRD v1: ASIC, OMFORT or XTENDED\r\n" - + "\t\t\tFor ZUGFeRD v2: INIMUM, BASIC L, ASIC, IUS, N16931, ETENDED\r\n"); - } - - /** - * Asks the user (repeatedly, if neccessary) on the command line for a String - * (offering a defaultValue) conforming to a Regex pattern - * - * @param prompt - * the question to be asked to the user - * @param defaultValue - * the default return value if user hits enter - * @param pattern - * a regex of acceptable values - * @return the user answer conforming to pattern - * @throws Exception - * if pattern not compielable or IOexception on input - */ - protected static String getStringFromUser(String prompt, String defaultValue, String pattern) throws Exception { - String input = ""; - if (!defaultValue.matches(pattern)) { - throw new Exception("Default value must match pattern"); - } - boolean firstInput = true; - do { - // for a more sophisticated dialogue maybe https://github.com/mabe02/lanterna/ - // could be taken into account - System.out.print(prompt + " (default: " + defaultValue + ")"); - if (!firstInput) { - System.out.print("\n(allowed pattern: " + pattern + ")"); - - } - System.out.print(":"); - BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in)); - try { - input = buffer.readLine(); - } catch (IOException e) { - Logger.getLogger(Toecount.class.getName()).log(Level.SEVERE, null, e); - - } - - if (input.isEmpty()) { - // pressed return without entering anything - input = defaultValue; - } - - firstInput = false; - } while (!input.matches(pattern)); - - return input; - } - - /** - * Prompts the user for a input or output filename - * - * @param prompt the text the user is asked - * @param defaultFilename a default Filename - * @param expectedExtension will warn if filename does not match expected file extension - * @param ensureFileExists will warn if file does NOT exist (for input files) - * @param ensureFileNotExists will warn if file DOES exist (for output files) - * @return String - */ - protected static String getFilenameFromUser(String prompt, String defaultFilename, String expectedExtension, - boolean ensureFileExists, boolean ensureFileNotExists) { - boolean fileExistenceOK = false; - String selectedName = ""; - do { - // for a more sophisticated dialogue maybe https://github.com/mabe02/lanterna/ - // could be taken into account - System.out.print(prompt + " (default: " + defaultFilename + "):"); - BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in)); - try { - selectedName = buffer.readLine(); - } catch (IOException e) { - Logger.getLogger(Toecount.class.getName()).log(Level.SEVERE, null, e); - - } - - if (selectedName.isEmpty()) { - // pressed return without entering anything - selectedName = defaultFilename; - } - - // error cases - if (!selectedName.toLowerCase().endsWith(expectedExtension.toLowerCase())) { - System.err.println("Expected " + expectedExtension - + " extension, this may corrupt your file. Do you still want to continue?(Y|N)"); - String selectedAnswer = ""; - try { - selectedAnswer = buffer.readLine(); - } catch (IOException e) { - Logger.getLogger(Toecount.class.getName()).log(Level.SEVERE, null, e); - } - if (!selectedAnswer.equals("Y") && !selectedAnswer.equals("y")) { - System.err.println("Aborted by user"); - System.exit(-1); - } - - } else if (ensureFileExists) { - if (fileExists(selectedName)) { - fileExistenceOK = true; - } else { - System.out.println("File does not exist, try again or CTRL+C to cancel"); - // discard the input, a scanner.reset is not sufficient - fileExistenceOK = false; - } - } else { - fileExistenceOK = true; - - if (ensureFileNotExists) { - if (fileExists(selectedName)) { - fileExistenceOK = false; - System.out.println("Output file already exists, try again or CTRL+C to cancel"); - // discard the input, a scanner.reset is not sufficient - } - } else { - fileExistenceOK = true; - } - } - - } while (!fileExistenceOK); - - return selectedName; - } - - // /opt/local/bin/mvn clean compile assembly:single - public static void main(String[] args) { - try { - - CmdLineParser parser = new CmdLineParser(); - - // Option: Help - Option helpOption = parser.addBooleanOption('h', "help"); - // Option: Action - Option actionOption = parser.addStringOption('a', "action"); - - // Generic options available for multiple command - // --source: input file - Option sourceOption = parser.addStringOption("source"); - // --out: output file - Option outOption = parser.addStringOption("out"); - - // Command: Extract XML - // --extract - // (--source: input PDF file) - // (--out: output XML file) - Option extractOption = parser.addBooleanOption('e', "extract"); - - // Command: Migrating ZUGFeRD 1 to 2 - // --upgrade - // (--source: input XML ZUGFeRD 1 file) - // (--out: output XML ZUGFeRD 2 file) - Option upgradeOption = parser.addBooleanOption('u', "upgrade"); - - // Command: Convert PDF/A-1 to PDF/A-3 - // --a3only - // (--source: input PDF file) - // (--out: output PDF file) - Option a3onlyOption = parser.addBooleanOption('a', "a3only"); - - // Command: Combining PDF and XML - // --combine - // (--source: input PDF file) - // (--source-xml: input XML file) - // (--out: output PDF file) - // (--version: ZUGFeRD version) - // (--profile: ZUGFeRD profile) - Option combineOption = parser.addBooleanOption('c', "combine"); - Option sourceXmlOption = parser.addStringOption("source-xml"); - Option formatOption = parser.addStringOption('f', "format"); - Option zugferdVersionOption = parser.addStringOption("version"); - Option zugferdProfileOption = parser.addStringOption("profile"); - - // Command: Show metrics in dir - // --directory - // (--ignorefileextension) - Option dirnameOption = parser.addStringOption('d', "directory"); - Option ignoreFileExtOption = parser.addBooleanOption('i', "ignorefileextension"); - - // Command: Show metrics from list from stdin - // --listfromstdin - Option filesFromStdInOption = parser.addBooleanOption('l', "listfromstdin"); - - try { - parser.parse(args); - } catch (CmdLineParser.OptionException e) { - System.err.println(e.getMessage()); - printUsage(); - System.exit(2); - } - - // Retrieve all options - String action = parser.getOptionValue(actionOption); - String directoryName = parser.getOptionValue(dirnameOption); - Boolean filesFromStdIn = parser.getOptionValue(filesFromStdInOption, Boolean.FALSE); - Boolean combineRequested = parser.getOptionValue(combineOption, Boolean.FALSE) || ((action!=null)&&(action.equals("combine"))); - Boolean extractRequested = parser.getOptionValue(extractOption, Boolean.FALSE) || ((action!=null)&&(action.equals("extract"))); - Boolean helpRequested = parser.getOptionValue(helpOption, Boolean.FALSE) || ((action!=null)&&(action.equals("help"))); - Boolean upgradeRequested = parser.getOptionValue(upgradeOption, Boolean.FALSE) || ((action!=null)&&(action.equals("upgrade"))); - Boolean ignoreFileExt = parser.getOptionValue(ignoreFileExtOption, Boolean.FALSE); - Boolean a3only = parser.getOptionValue(a3onlyOption, Boolean.FALSE) || ((action!=null)&&(action.equals("a3"))); - String sourceName = parser.getOptionValue(sourceOption); - String sourceXMLName = parser.getOptionValue(sourceXmlOption); - String outName = parser.getOptionValue(outOption); - String format = parser.getOptionValue(formatOption); - String zugferdVersion = parser.getOptionValue(zugferdVersionOption); - String zugferdProfile = parser.getOptionValue(zugferdProfileOption); - - if (helpRequested) { - printHelp(); - } else if (((directoryName != null) && (directoryName.length() > 0)) || filesFromStdIn.booleanValue()) { - performMetrics(directoryName, filesFromStdIn, ignoreFileExt); - } else if (combineRequested) { - performCombine(sourceName, sourceXMLName, outName, format, zugferdVersion, zugferdProfile); - } else if (extractRequested) { - performExtract(sourceName, outName); - } else if (a3only) { - performConvert(sourceName, outName); - } else if (upgradeRequested) { - performUpgrade(sourceName, outName); - } else { - // no argument or argument unknown - printUsage(); - System.exit(2); - } - } catch (Exception e) { - - Logger.getLogger(Toecount.class.getName()).log(Level.SEVERE, null, e); - System.exit(-1); - } - - } - - private static void performUpgrade(String xmlName, String outName) throws IOException, TransformerException { - - // Get params from user if not already defined - if (xmlName == null) { - xmlName = getFilenameFromUser("ZUGFeRD 1.0 XML source", "ZUGFeRD-invoice.xml", "xml", true, false); - } else { - System.out.println("ZUGFeRD 1.0 XML source set to " + xmlName); - } - if (outName == null) { - outName = getFilenameFromUser("ZUGFeRD 2.0 XML target", "zugferd-invoice.xml", "xml", false, true); - } else { - System.out.println("ZUGFeRD 1.0 XML source set to " + outName); - } - - // Verify params - ensureFileExists(xmlName); - ensureFileNotExists(outName); - - // All params are good! continue... - ZUGFeRDMigrator zmi = new ZUGFeRDMigrator(); - String xml = null; - xml = zmi.migrateFromV1ToV2(xmlName); - Files.write(Paths.get(outName), xml.getBytes()); - System.out.println("Written to " + outName); - /* - * } catch (FileNotFoundException ex) { - * Logger.getLogger(Toecount.class.getName()).log(Level.SEVERE, null, ex); - */ - } - - private static void performConvert(String pdfName, String outName) throws IOException { - /* - * ZUGFeRDExporter ze= new ZUGFeRDExporterFromA1Factory() - * .setProducer("toecount") .setCreator(System.getProperty("user.name")) - * .loadFromPDFA1("invoice.pdf"); - */ - // Get params from user if not already defined - if (pdfName == null) { - pdfName = getFilenameFromUser("Source PDF", "invoice.pdf", "pdf", true, false); - } else { - System.out.println("Source PDF set to " + pdfName); - } - if (outName == null) { - outName = getFilenameFromUser("Target PDF", "invoice.a3.pdf", "pdf", false, true); - } else { - System.out.println("Target PDF set to " + outName); - } - - // Verify params - ensureFileExists(pdfName); - ensureFileNotExists(outName); - - // All params are good! continue... - ZUGFeRDExporter ze = new ZUGFeRDExporterFromA1Factory().setAttachZUGFeRDHeaders(false).load(pdfName); - - ze.export(outName); - System.out.println("Written to " + outName); - } - - private static void performExtract(String pdfName, String xmlName) throws IOException { - // Get params from user if not already defined - if (pdfName == null) { - pdfName = getFilenameFromUser("Source PDF", "invoice.pdf", "pdf", true, false); - } else { - System.out.println("Source PDF set to " + pdfName); - } - if (xmlName == null) { - xmlName = getFilenameFromUser("ZUGFeRD XML", "ZUGFeRD-invoice.xml", "xml", false, true); - } else { - System.out.println("ZUGFeRD XML set to " + pdfName); - } - - // Verify params - ensureFileExists(pdfName); - ensureFileNotExists(xmlName); - - // All params are good! continue... - ZUGFeRDImporter zi = new ZUGFeRDImporter(pdfName); - byte[] XMLContent = zi.getRawXML(); - if (XMLContent == null) { - System.err.println("No ZUGFeRD XML found in PDF file"); - - } else { - Files.write(Paths.get(xmlName), XMLContent); - System.out.println("Written to " + xmlName); - } - } - - private static void performCombine(String pdfName, String xmlName, String outName, String format, String zfVersion, - String zfProfile) throws Exception { - /* - * ZUGFeRDExporter ze= new ZUGFeRDExporterFromA1Factory() - * .setProducer("toecount") .setCreator(System.getProperty("user.name")) - * .loadFromPDFA1("invoice.pdf"); - */ - try { - int zfIntVersion = ZUGFeRDExporter.DefaultZUGFeRDVersion; - ZUGFeRDConformanceLevel zfConformanceLevelProfile = ZUGFeRDConformanceLevel.EXTENDED; - - if (pdfName == null) { - pdfName = getFilenameFromUser("Source PDF", "invoice.pdf", "pdf", true, false); - } else { - System.out.println("Source PDF set to " + pdfName); - } - - if (xmlName == null) { - xmlName = getFilenameFromUser("ZUGFeRD XML", "ZUGFeRD-invoice.xml", "xml", true, false); - } else { - System.out.println("ZUGFeRD XML set to " + xmlName); - } - - if (outName == null) { - outName = getFilenameFromUser("Ouput PDF", "invoice.ZUGFeRD.pdf", "pdf", false, true); - } else { - System.out.println("Ouput PDF set to " + outName); - } - - if (format == null) { - try { - format = getStringFromUser("Format (fx=Factur-X, zf=ZUGFeRD,)", "zf", "fx|zf"); - } catch (Exception e) { - Logger.getLogger(Toecount.class.getName()).log(Level.SEVERE, null, e); - } - } else { - System.out.println("Format set to " + format); - } - - if (zfVersion == null) { - try { - zfVersion = getStringFromUser("Version (1 or 2)", "1", "1|2"); - } catch (Exception e) { - Logger.getLogger(Toecount.class.getName()).log(Level.SEVERE, null, e); - } - } else { - System.out.println("Version set to " + zfVersion); - } - zfIntVersion = Integer.valueOf(zfVersion); - - if (zfProfile == null) { - try { - if (format.equals("zf") && (zfIntVersion == 1)) { - zfProfile = getStringFromUser("Profile b)asic, c)omfort or e)xtended", "e", "B|b|C|c|E|e"); - } else { - zfProfile = getStringFromUser( - "Profile [M]INIMUM, BASIC [W]L, [B]ASIC,\n" + "[C]IUS, [E]N16931, E[X]TENDED", "E", - "M|m|W|w|B|b|C|c|E|e|X|x|"); - } - } catch (Exception e) { - Logger.getLogger(Toecount.class.getName()).log(Level.SEVERE, null, e); - - } - } else { - System.out.println("Profile set to " + zfProfile); - } - zfProfile = zfProfile.toLowerCase(); - - // Verify params - ensureFileExists(pdfName); - ensureFileExists(xmlName); - ensureFileNotExists(outName); - - if ((format.equals("fx")) && (zfIntVersion > 1)) { - throw new Exception("Factur-X is only available in version 1 (roughly corresponding to ZF2)"); - } - - if ((format.equals("zf")) && (zfIntVersion == 1)) { - if (zfProfile.equals("b")) { - zfConformanceLevelProfile = ZUGFeRDConformanceLevel.BASIC; - } else if (zfProfile.equals("c")) { - zfConformanceLevelProfile = ZUGFeRDConformanceLevel.COMFORT; - } else if (zfProfile.equals("e")) { - zfConformanceLevelProfile = ZUGFeRDConformanceLevel.EXTENDED; - } else { - throw new Exception(String.format("Unknown ZUGFeRD profile '%s'", zfProfile)); - } - } else if (((format.equals("zf")) && (zfIntVersion == 2)) || (format.equals("fx"))) { - if (zfProfile.equals("m")) { - zfConformanceLevelProfile = ZUGFeRDConformanceLevel.MINIMUM; - } else if (zfProfile.equals("w")) { - zfConformanceLevelProfile = ZUGFeRDConformanceLevel.BASICWL; - } else if (zfProfile.equals("b")) { - zfConformanceLevelProfile = ZUGFeRDConformanceLevel.BASIC; - } else if (zfProfile.equals("c")) { - zfConformanceLevelProfile = ZUGFeRDConformanceLevel.CIUS; - } else if (zfProfile.equals("e")) { - zfConformanceLevelProfile = ZUGFeRDConformanceLevel.EN16931; - } else if (zfProfile.equals("x")) { - zfConformanceLevelProfile = ZUGFeRDConformanceLevel.EXTENDED; - } else { - throw new Exception(String.format("Unknown ZUGFeRD profile '%s'", zfProfile)); - } - } else { - throw new Exception(String.format("Unknown version '%i'", zfIntVersion)); - } - - // All params are good! continue... - ZUGFeRDExporter ze = new ZUGFeRDExporterFromA1Factory().setProducer("Toecount") - .setZUGFeRDVersion(zfIntVersion) - .setCreator(System.getProperty("user.name")).setZUGFeRDConformanceLevel(zfConformanceLevelProfile) - .load(pdfName); - - if (format.equals("fx")) { - ze.setFacturX(); - } - - ze.setZUGFeRDXMLData(Files.readAllBytes(Paths.get(xmlName))); - - ze.export(outName); - - System.out.println("Written to " + outName); - - } catch (IOException e) { - Logger.getLogger(Toecount.class.getName()).log(Level.SEVERE, null, e); - - } - } - - private static void performMetrics(String directoryName, Boolean filesFromStdIn, Boolean ignoreFileExt) - throws IOException { - - StatRun sr = new StatRun(); - if (ignoreFileExt) { - sr.ignoreFileExtension(); - } - if (directoryName != null) { - Path startingDir = Paths.get(directoryName); - - if (Files.isRegularFile(startingDir)) { - String filename = startingDir.toString(); - FileChecker fc = new FileChecker(filename, sr); - - fc.checkForZUGFeRD(); - System.out.print(fc.getOutputLine()); - - } else if (Files.isDirectory(startingDir)) { - FileTraverser pf = new FileTraverser(sr); - Files.walkFileTree(startingDir, pf); - } - } - - if (filesFromStdIn) { - BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); - String s; - while ((s = in.readLine()) != null && s.length() != 0) { - FileChecker fc = new FileChecker(s, sr); - - fc.checkForZUGFeRD(); - System.out.print(fc.getOutputLine()); - - } - - } - System.out.println(sr.getSummaryLine()); - } - - private static void ensureFileExists(String fileName) throws IOException { - if (!fileExists(fileName)) { - throw new IOException(String.format("File %s does not exists", fileName)); - } - } - - private static void ensureFileNotExists(String fileName) throws IOException { - if (fileExists(fileName)) { - throw new IOException(String.format("File %s does not exists", fileName)); - } - } - - private static Boolean fileExists(String fileName) { - if (fileName == null) - return false; - File f = new File(fileName); - return f.exists(); - } - -} diff --git a/libraryExtended/mvnw b/libraryExtended/mvnw deleted file mode 100755 index 41c0f0c2..00000000 --- a/libraryExtended/mvnw +++ /dev/null @@ -1,310 +0,0 @@ -#!/bin/sh -# ---------------------------------------------------------------------------- -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# ---------------------------------------------------------------------------- - -# ---------------------------------------------------------------------------- -# Maven Start Up Batch script -# -# Required ENV vars: -# ------------------ -# JAVA_HOME - location of a JDK home dir -# -# Optional ENV vars -# ----------------- -# M2_HOME - location of maven2's installed home dir -# MAVEN_OPTS - parameters passed to the Java VM when running Maven -# e.g. to debug Maven itself, use -# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -# MAVEN_SKIP_RC - flag to disable loading of mavenrc files -# ---------------------------------------------------------------------------- - -if [ -z "$MAVEN_SKIP_RC" ] ; then - - if [ -f /etc/mavenrc ] ; then - . /etc/mavenrc - fi - - if [ -f "$HOME/.mavenrc" ] ; then - . "$HOME/.mavenrc" - fi - -fi - -# OS specific support. $var _must_ be set to either true or false. -cygwin=false; -darwin=false; -mingw=false -case "`uname`" in - CYGWIN*) cygwin=true ;; - MINGW*) mingw=true;; - Darwin*) darwin=true - # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home - # See https://developer.apple.com/library/mac/qa/qa1170/_index.html - if [ -z "$JAVA_HOME" ]; then - if [ -x "/usr/libexec/java_home" ]; then - export JAVA_HOME="`/usr/libexec/java_home`" - else - export JAVA_HOME="/Library/Java/Home" - fi - fi - ;; -esac - -if [ -z "$JAVA_HOME" ] ; then - if [ -r /etc/gentoo-release ] ; then - JAVA_HOME=`java-config --jre-home` - fi -fi - -if [ -z "$M2_HOME" ] ; then - ## resolve links - $0 may be a link to maven's home - PRG="$0" - - # need this for relative symlinks - while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG="`dirname "$PRG"`/$link" - fi - done - - saveddir=`pwd` - - M2_HOME=`dirname "$PRG"`/.. - - # make it fully qualified - M2_HOME=`cd "$M2_HOME" && pwd` - - cd "$saveddir" - # echo Using m2 at $M2_HOME -fi - -# For Cygwin, ensure paths are in UNIX format before anything is touched -if $cygwin ; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --unix "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --unix "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --unix "$CLASSPATH"` -fi - -# For Mingw, ensure paths are in UNIX format before anything is touched -if $mingw ; then - [ -n "$M2_HOME" ] && - M2_HOME="`(cd "$M2_HOME"; pwd)`" - [ -n "$JAVA_HOME" ] && - JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" -fi - -if [ -z "$JAVA_HOME" ]; then - javaExecutable="`which javac`" - if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then - # readlink(1) is not available as standard on Solaris 10. - readLink=`which readlink` - if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then - if $darwin ; then - javaHome="`dirname \"$javaExecutable\"`" - javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" - else - javaExecutable="`readlink -f \"$javaExecutable\"`" - fi - javaHome="`dirname \"$javaExecutable\"`" - javaHome=`expr "$javaHome" : '\(.*\)/bin'` - JAVA_HOME="$javaHome" - export JAVA_HOME - fi - fi -fi - -if [ -z "$JAVACMD" ] ; then - if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - else - JAVACMD="`which java`" - fi -fi - -if [ ! -x "$JAVACMD" ] ; then - echo "Error: JAVA_HOME is not defined correctly." >&2 - echo " We cannot execute $JAVACMD" >&2 - exit 1 -fi - -if [ -z "$JAVA_HOME" ] ; then - echo "Warning: JAVA_HOME environment variable is not set." -fi - -CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher - -# traverses directory structure from process work directory to filesystem root -# first directory with .mvn subdirectory is considered project base directory -find_maven_basedir() { - - if [ -z "$1" ] - then - echo "Path not specified to find_maven_basedir" - return 1 - fi - - basedir="$1" - wdir="$1" - while [ "$wdir" != '/' ] ; do - if [ -d "$wdir"/.mvn ] ; then - basedir=$wdir - break - fi - # workaround for JBEAP-8937 (on Solaris 10/Sparc) - if [ -d "${wdir}" ]; then - wdir=`cd "$wdir/.."; pwd` - fi - # end of workaround - done - echo "${basedir}" -} - -# concatenates all lines of a file -concat_lines() { - if [ -f "$1" ]; then - echo "$(tr -s '\n' ' ' < "$1")" - fi -} - -BASE_DIR=`find_maven_basedir "$(pwd)"` -if [ -z "$BASE_DIR" ]; then - exit 1; -fi - -########################################################################################## -# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -# This allows using the maven wrapper in projects that prohibit checking in binary data. -########################################################################################## -if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found .mvn/wrapper/maven-wrapper.jar" - fi -else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." - fi - if [ -n "$MVNW_REPOURL" ]; then - jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - else - jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - fi - while IFS="=" read key value; do - case "$key" in (wrapperUrl) jarUrl="$value"; break ;; - esac - done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" - if [ "$MVNW_VERBOSE" = true ]; then - echo "Downloading from: $jarUrl" - fi - wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" - if $cygwin; then - wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` - fi - - if command -v wget > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found wget ... using wget" - fi - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - wget "$jarUrl" -O "$wrapperJarPath" - else - wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" - fi - elif command -v curl > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found curl ... using curl" - fi - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - curl -o "$wrapperJarPath" "$jarUrl" -f - else - curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f - fi - - else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Falling back to using Java to download" - fi - javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" - # For Cygwin, switch paths to Windows format before running javac - if $cygwin; then - javaClass=`cygpath --path --windows "$javaClass"` - fi - if [ -e "$javaClass" ]; then - if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Compiling MavenWrapperDownloader.java ..." - fi - # Compiling the Java class - ("$JAVA_HOME/bin/javac" "$javaClass") - fi - if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - # Running the downloader - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Running MavenWrapperDownloader.java ..." - fi - ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") - fi - fi - fi -fi -########################################################################################## -# End of extension -########################################################################################## - -export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} -if [ "$MVNW_VERBOSE" = true ]; then - echo $MAVEN_PROJECTBASEDIR -fi -MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" - -# For Cygwin, switch paths to Windows format before running java -if $cygwin; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --path --windows "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --windows "$CLASSPATH"` - [ -n "$MAVEN_PROJECTBASEDIR" ] && - MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` -fi - -# Provide a "standardized" way to retrieve the CLI args that will -# work with both Windows and non-Windows executions. -MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" -export MAVEN_CMD_LINE_ARGS - -WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -exec "$JAVACMD" \ - $MAVEN_OPTS \ - -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/libraryExtended/mvnw.cmd b/libraryExtended/mvnw.cmd deleted file mode 100644 index 86115719..00000000 --- a/libraryExtended/mvnw.cmd +++ /dev/null @@ -1,182 +0,0 @@ -@REM ---------------------------------------------------------------------------- -@REM Licensed to the Apache Software Foundation (ASF) under one -@REM or more contributor license agreements. See the NOTICE file -@REM distributed with this work for additional information -@REM regarding copyright ownership. The ASF licenses this file -@REM to you under the Apache License, Version 2.0 (the -@REM "License"); you may not use this file except in compliance -@REM with the License. You may obtain a copy of the License at -@REM -@REM http://www.apache.org/licenses/LICENSE-2.0 -@REM -@REM Unless required by applicable law or agreed to in writing, -@REM software distributed under the License is distributed on an -@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -@REM KIND, either express or implied. See the License for the -@REM specific language governing permissions and limitations -@REM under the License. -@REM ---------------------------------------------------------------------------- - -@REM ---------------------------------------------------------------------------- -@REM Maven Start Up Batch script -@REM -@REM Required ENV vars: -@REM JAVA_HOME - location of a JDK home dir -@REM -@REM Optional ENV vars -@REM M2_HOME - location of maven2's installed home dir -@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending -@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven -@REM e.g. to debug Maven itself, use -@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files -@REM ---------------------------------------------------------------------------- - -@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' -@echo off -@REM set title of command window -title %0 -@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' -@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% - -@REM set %HOME% to equivalent of $HOME -if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") - -@REM Execute a user defined script before this one -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre -@REM check for pre script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" -if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" -:skipRcPre - -@setlocal - -set ERROR_CODE=0 - -@REM To isolate internal variables from possible post scripts, we use another setlocal -@setlocal - -@REM ==== START VALIDATION ==== -if not "%JAVA_HOME%" == "" goto OkJHome - -echo. -echo Error: JAVA_HOME not found in your environment. >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -:OkJHome -if exist "%JAVA_HOME%\bin\java.exe" goto init - -echo. -echo Error: JAVA_HOME is set to an invalid directory. >&2 -echo JAVA_HOME = "%JAVA_HOME%" >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -@REM ==== END VALIDATION ==== - -:init - -@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". -@REM Fallback to current working directory if not found. - -set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% -IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir - -set EXEC_DIR=%CD% -set WDIR=%EXEC_DIR% -:findBaseDir -IF EXIST "%WDIR%"\.mvn goto baseDirFound -cd .. -IF "%WDIR%"=="%CD%" goto baseDirNotFound -set WDIR=%CD% -goto findBaseDir - -:baseDirFound -set MAVEN_PROJECTBASEDIR=%WDIR% -cd "%EXEC_DIR%" -goto endDetectBaseDir - -:baseDirNotFound -set MAVEN_PROJECTBASEDIR=%EXEC_DIR% -cd "%EXEC_DIR%" - -:endDetectBaseDir - -IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig - -@setlocal EnableExtensions EnableDelayedExpansion -for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a -@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% - -:endReadAdditionalConfig - -SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" -set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" -set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - -FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( - IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B -) - -@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -@REM This allows using the maven wrapper in projects that prohibit checking in binary data. -if exist %WRAPPER_JAR% ( - if "%MVNW_VERBOSE%" == "true" ( - echo Found %WRAPPER_JAR% - ) -) else ( - if not "%MVNW_REPOURL%" == "" ( - SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - ) - if "%MVNW_VERBOSE%" == "true" ( - echo Couldn't find %WRAPPER_JAR%, downloading it ... - echo Downloading from: %DOWNLOAD_URL% - ) - - powershell -Command "&{"^ - "$webclient = new-object System.Net.WebClient;"^ - "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ - "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ - "}"^ - "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ - "}" - if "%MVNW_VERBOSE%" == "true" ( - echo Finished downloading %WRAPPER_JAR% - ) -) -@REM End of extension - -@REM Provide a "standardized" way to retrieve the CLI args that will -@REM work with both Windows and non-Windows executions. -set MAVEN_CMD_LINE_ARGS=%* - -%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* -if ERRORLEVEL 1 goto error -goto end - -:error -set ERROR_CODE=1 - -:end -@endlocal & set ERROR_CODE=%ERROR_CODE% - -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost -@REM check for post script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" -if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" -:skipRcPost - -@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' -if "%MAVEN_BATCH_PAUSE%" == "on" pause - -if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% - -exit /B %ERROR_CODE% diff --git a/libraryExtended/pom.xml b/libraryExtended/pom.xml deleted file mode 100644 index 4527336e..00000000 --- a/libraryExtended/pom.xml +++ /dev/null @@ -1,237 +0,0 @@ - - - - org.mustangproject - core - 2.0.0-SNAPSHOT - - 4.0.0 - org.mustangproject - libraryExtended - jar - 2.0.0-SNAPSHOT - - - - sonatype-oss-public - https://oss.sonatype.org/content/groups/public/ - - true - - - true - - - - - UTF-8 - - - - - javax.xml.bind - jaxb-api - 2.1 - - - - org.dom4j - dom4j - 2.1.1 - - - - ch.qos.logback - logback-classic - 1.2.3 - - - ch.qos.logback - logback-core - 1.2.3 - - - - com.googlecode.slf4j-maven-plugin-log - slf4j-maven-plugin-log - 1.0.0 - - - - - org.verapdf - validation-model - 1.12.1 - - - - com.helger - ph-schematron - 5.6.0 - - - org.mustangproject - libraryBasic - 2.0.0-SNAPSHOT - - - - org.xmlunit - xmlunit-core - 2.6.3 - - - org.xmlunit - xmlunit-assertj - 2.6.3 - test - - - - - com.sanityinc - jargs - 2.0-SNAPSHOT - - - org.riversun - bigdoc - 0.3.0 - - - junit - junit - 4.12 - test - - - - - - - - org.apache.maven.plugins - maven-release-plugin - 2.5.3 - - - - - - - org.apache.maven.plugins - maven-jar-plugin - - - - true - true - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 2.3.2 - - - jar-with-dependencies - - - - 1.7 - 1.7 - - - - - - org.apache.maven.plugins - maven-shade-plugin - 2.4.3 - - false - - - *:* - - META-INF/*.SF - META-INF/*.DSA - META-INF/*.RSA - - - - log4j:log4j - - ** - - - - commons-logging:commons-logging - - ** - - - - com.sun.xml.bind:jaxb-impl - - ** - - - - com.sun.xml.bind:jaxb-core - - ** - - - - - - - package - - shade - - - - - - - - - - - - - - Apache License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt - repo - A business-friendly OSS license - - - - - Jochen Stärk - jstaerk@usegroup.de - - architect - developer - - - - diff --git a/pom.xml b/pom.xml index 962cc10d..badc1aec 100644 --- a/pom.xml +++ b/pom.xml @@ -1,86 +1,86 @@ - - 4.0.0 - org.mustangproject - core - 2.0.0-SNAPSHOT - pom - Mustang - - - libraryBasic - libraryExtended - Mustang-CLI - Mustang-Server - + + 4.0.0 + org.mustangproject + core + 2.0.0-SNAPSHOT + pom + Mustang - The Mustang project is a java library to read and write ZUGFeRD meta data inside your invoice PDFs + + library + validator + Mustang-CLI + + + The Mustang project is a java library to read and write ZUGFeRD meta data inside your invoice PDFs - http://www.mustangproject.org/ - - scm:git:https://github.com/ZUGFeRD/mustangproject.git - scm:git:https://github.com/ZUGFeRD/mustangproject.git - https://github.com/ZUGFeRD/mustangproject - mustang-1.7.3 - - - - sonatype-oss-public - https://oss.sonatype.org/content/groups/public/ - - true - - - true - - - - - - internal.repo - Temporary Staging Repository - file://${project.build.directory}/mvn-repo - - - - UTF-8 - github - -Xdoclint:none - - 1.8 - 1.8 - 1.8 - - - - - User List - https://groups.google.com/forum/?hl=de#!forum/mustangproject - - - - - Apache License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt - repo - A business-friendly OSS license - - - - - Jochen Stärk - jstaerk@usegroup.de - - architect - developer - - - - Alexander Schmidt - schmidt.alexander@mail.de - - developer - - - + http://www.mustangproject.org/ + + scm:git:https://github.com/ZUGFeRD/mustangproject.git + scm:git:https://github.com/ZUGFeRD/mustangproject.git + https://github.com/ZUGFeRD/mustangproject + mustang-1.7.3 + + + + sonatype-oss-public + https://oss.sonatype.org/content/groups/public/ + + true + + + true + + + + + + internal.repo + Temporary Staging Repository + file://${project.build.directory}/mvn-repo + + + + UTF-8 + github + -Xdoclint:none + + 1.8 + 1.8 + 1.8 + + + + + User List + https://groups.google.com/forum/?hl=de#!forum/mustangproject + + + + + Apache License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + A business-friendly OSS license + + + + + Jochen Stärk + jstaerk@usegroup.de + + architect + developer + + + + Alexander Schmidt + schmidt.alexander@mail.de + + developer + + + diff --git a/libraryExtended/History.md b/validator/History.md similarity index 100% rename from libraryExtended/History.md rename to validator/History.md diff --git a/libraryExtended/LICENSE b/validator/LICENSE similarity index 100% rename from libraryExtended/LICENSE rename to validator/LICENSE diff --git a/libraryExtended/MustangGnuaccountingBeispielRE-20170509_505.pdf b/validator/MustangGnuaccountingBeispielRE-20170509_505.pdf similarity index 100% rename from libraryExtended/MustangGnuaccountingBeispielRE-20170509_505.pdf rename to validator/MustangGnuaccountingBeispielRE-20170509_505.pdf diff --git a/libraryExtended/README.md b/validator/README.md similarity index 100% rename from libraryExtended/README.md rename to validator/README.md diff --git a/validator/pom.xml b/validator/pom.xml new file mode 100644 index 00000000..6d7247a5 --- /dev/null +++ b/validator/pom.xml @@ -0,0 +1,240 @@ + + + + org.mustangproject + core + 2.0.0-SNAPSHOT + + 4.0.0 + org.mustangproject + validator + Library to validate Factur-X/ZUGFeRD 1.0 and 2.1 as well as XRechnung e-invoices. + + jar + 2.0.0-SNAPSHOT + + + + sonatype-oss-public + https://oss.sonatype.org/content/groups/public/ + + true + + + true + + + + + UTF-8 + + + + + javax.xml.bind + jaxb-api + 2.1 + + + + org.dom4j + dom4j + 2.1.1 + + + + ch.qos.logback + logback-classic + 1.2.3 + + + ch.qos.logback + logback-core + 1.2.3 + + + + com.googlecode.slf4j-maven-plugin-log + slf4j-maven-plugin-log + 1.0.0 + + + + + org.verapdf + validation-model + 1.12.1 + + + + com.helger + ph-schematron + 5.6.0 + + + org.mustangproject + libraryBasic + 2.0.0-SNAPSHOT + + + + org.xmlunit + xmlunit-core + 2.6.3 + + + org.xmlunit + xmlunit-assertj + 2.6.3 + test + + + + + com.sanityinc + jargs + 2.0-SNAPSHOT + + + org.riversun + bigdoc + 0.3.0 + + + junit + junit + 4.12 + test + + + + + + + + org.apache.maven.plugins + maven-release-plugin + 2.5.3 + + + + + + + org.apache.maven.plugins + maven-jar-plugin + + + + true + true + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + + jar-with-dependencies + + + + 1.7 + 1.7 + + + + + + org.apache.maven.plugins + maven-shade-plugin + 2.4.3 + + false + + + *:* + + META-INF/*.SF + META-INF/*.DSA + META-INF/*.RSA + + + + log4j:log4j + + ** + + + + commons-logging:commons-logging + + ** + + + + com.sun.xml.bind:jaxb-impl + + ** + + + + com.sun.xml.bind:jaxb-core + + ** + + + + + + + package + + shade + + + + + + + + + + + + + + Apache License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + A business-friendly OSS license + + + + + Jochen Stärk + jstaerk@usegroup.de + + architect + developer + + + + diff --git a/libraryExtended/src/main/java/org/mustangproject/library/extended/EPart.java b/validator/src/main/java/org/mustangproject/library/extended/EPart.java similarity index 100% rename from libraryExtended/src/main/java/org/mustangproject/library/extended/EPart.java rename to validator/src/main/java/org/mustangproject/library/extended/EPart.java diff --git a/libraryExtended/src/main/java/org/mustangproject/library/extended/ESeverity.java b/validator/src/main/java/org/mustangproject/library/extended/ESeverity.java similarity index 100% rename from libraryExtended/src/main/java/org/mustangproject/library/extended/ESeverity.java rename to validator/src/main/java/org/mustangproject/library/extended/ESeverity.java diff --git a/libraryExtended/src/main/java/org/mustangproject/library/extended/IrrecoverableValidationError.java b/validator/src/main/java/org/mustangproject/library/extended/IrrecoverableValidationError.java similarity index 100% rename from libraryExtended/src/main/java/org/mustangproject/library/extended/IrrecoverableValidationError.java rename to validator/src/main/java/org/mustangproject/library/extended/IrrecoverableValidationError.java diff --git a/libraryExtended/src/main/java/org/mustangproject/library/extended/Main.java b/validator/src/main/java/org/mustangproject/library/extended/Main.java similarity index 100% rename from libraryExtended/src/main/java/org/mustangproject/library/extended/Main.java rename to validator/src/main/java/org/mustangproject/library/extended/Main.java diff --git a/libraryExtended/src/main/java/org/mustangproject/library/extended/PDFValidator.java b/validator/src/main/java/org/mustangproject/library/extended/PDFValidator.java similarity index 100% rename from libraryExtended/src/main/java/org/mustangproject/library/extended/PDFValidator.java rename to validator/src/main/java/org/mustangproject/library/extended/PDFValidator.java diff --git a/libraryExtended/src/main/java/org/mustangproject/library/extended/SchematronPipeline.java b/validator/src/main/java/org/mustangproject/library/extended/SchematronPipeline.java similarity index 100% rename from libraryExtended/src/main/java/org/mustangproject/library/extended/SchematronPipeline.java rename to validator/src/main/java/org/mustangproject/library/extended/SchematronPipeline.java diff --git a/libraryExtended/src/main/java/org/mustangproject/library/extended/ValidationContext.java b/validator/src/main/java/org/mustangproject/library/extended/ValidationContext.java similarity index 100% rename from libraryExtended/src/main/java/org/mustangproject/library/extended/ValidationContext.java rename to validator/src/main/java/org/mustangproject/library/extended/ValidationContext.java diff --git a/libraryExtended/src/main/java/org/mustangproject/library/extended/ValidationResultItem.java b/validator/src/main/java/org/mustangproject/library/extended/ValidationResultItem.java similarity index 100% rename from libraryExtended/src/main/java/org/mustangproject/library/extended/ValidationResultItem.java rename to validator/src/main/java/org/mustangproject/library/extended/ValidationResultItem.java diff --git a/libraryExtended/src/main/java/org/mustangproject/library/extended/Validator.java b/validator/src/main/java/org/mustangproject/library/extended/Validator.java similarity index 100% rename from libraryExtended/src/main/java/org/mustangproject/library/extended/Validator.java rename to validator/src/main/java/org/mustangproject/library/extended/Validator.java diff --git a/libraryExtended/src/main/java/org/mustangproject/library/extended/XMLTools.java b/validator/src/main/java/org/mustangproject/library/extended/XMLTools.java similarity index 100% rename from libraryExtended/src/main/java/org/mustangproject/library/extended/XMLTools.java rename to validator/src/main/java/org/mustangproject/library/extended/XMLTools.java diff --git a/libraryExtended/src/main/java/org/mustangproject/library/extended/XMLValidator.java b/validator/src/main/java/org/mustangproject/library/extended/XMLValidator.java similarity index 100% rename from libraryExtended/src/main/java/org/mustangproject/library/extended/XMLValidator.java rename to validator/src/main/java/org/mustangproject/library/extended/XMLValidator.java diff --git a/libraryExtended/src/main/java/org/mustangproject/library/extended/ZUGFeRDValidator.java b/validator/src/main/java/org/mustangproject/library/extended/ZUGFeRDValidator.java similarity index 100% rename from libraryExtended/src/main/java/org/mustangproject/library/extended/ZUGFeRDValidator.java rename to validator/src/main/java/org/mustangproject/library/extended/ZUGFeRDValidator.java diff --git a/libraryExtended/src/main/resources/ZUGFeRDSchematronStylesheetXSLT1.xsl b/validator/src/main/resources/ZUGFeRDSchematronStylesheetXSLT1.xsl similarity index 100% rename from libraryExtended/src/main/resources/ZUGFeRDSchematronStylesheetXSLT1.xsl rename to validator/src/main/resources/ZUGFeRDSchematronStylesheetXSLT1.xsl diff --git a/libraryExtended/src/main/resources/ZUGFeRDSchematronStylesheetXSLT2.xsl b/validator/src/main/resources/ZUGFeRDSchematronStylesheetXSLT2.xsl similarity index 100% rename from libraryExtended/src/main/resources/ZUGFeRDSchematronStylesheetXSLT2.xsl rename to validator/src/main/resources/ZUGFeRDSchematronStylesheetXSLT2.xsl diff --git a/libraryExtended/src/main/resources/ZUGFeRD_1p0.sch b/validator/src/main/resources/ZUGFeRD_1p0.sch similarity index 100% rename from libraryExtended/src/main/resources/ZUGFeRD_1p0.sch rename to validator/src/main/resources/ZUGFeRD_1p0.sch diff --git a/libraryExtended/src/main/resources/iso_abstract_expand.xsl b/validator/src/main/resources/iso_abstract_expand.xsl similarity index 100% rename from libraryExtended/src/main/resources/iso_abstract_expand.xsl rename to validator/src/main/resources/iso_abstract_expand.xsl diff --git a/libraryExtended/src/main/resources/iso_dsdl_include.xsl b/validator/src/main/resources/iso_dsdl_include.xsl similarity index 100% rename from libraryExtended/src/main/resources/iso_dsdl_include.xsl rename to validator/src/main/resources/iso_dsdl_include.xsl diff --git a/libraryExtended/src/main/resources/iso_schematron_message.xsl b/validator/src/main/resources/iso_schematron_message.xsl similarity index 100% rename from libraryExtended/src/main/resources/iso_schematron_message.xsl rename to validator/src/main/resources/iso_schematron_message.xsl diff --git a/libraryExtended/src/main/resources/iso_schematron_skeleton_for_xslt1.xsl b/validator/src/main/resources/iso_schematron_skeleton_for_xslt1.xsl similarity index 100% rename from libraryExtended/src/main/resources/iso_schematron_skeleton_for_xslt1.xsl rename to validator/src/main/resources/iso_schematron_skeleton_for_xslt1.xsl diff --git a/libraryExtended/src/main/resources/iso_svrl_for_xslt1.xsl b/validator/src/main/resources/iso_svrl_for_xslt1.xsl similarity index 100% rename from libraryExtended/src/main/resources/iso_svrl_for_xslt1.xsl rename to validator/src/main/resources/iso_svrl_for_xslt1.xsl diff --git a/libraryExtended/src/main/resources/logback.xml b/validator/src/main/resources/logback.xml similarity index 100% rename from libraryExtended/src/main/resources/logback.xml rename to validator/src/main/resources/logback.xml diff --git a/libraryExtended/src/main/resources/schema/ad/basic/additional_data_base_schema.xsd b/validator/src/main/resources/schema/ad/basic/additional_data_base_schema.xsd similarity index 100% rename from libraryExtended/src/main/resources/schema/ad/basic/additional_data_base_schema.xsd rename to validator/src/main/resources/schema/ad/basic/additional_data_base_schema.xsd diff --git a/libraryExtended/src/main/resources/schema/zf1/ZUGFeRD1p0.xsd b/validator/src/main/resources/schema/zf1/ZUGFeRD1p0.xsd similarity index 100% rename from libraryExtended/src/main/resources/schema/zf1/ZUGFeRD1p0.xsd rename to validator/src/main/resources/schema/zf1/ZUGFeRD1p0.xsd diff --git a/libraryExtended/src/main/resources/schema/zf1/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_QualifiedDataType_12.xsd b/validator/src/main/resources/schema/zf1/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_QualifiedDataType_12.xsd similarity index 100% rename from libraryExtended/src/main/resources/schema/zf1/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_QualifiedDataType_12.xsd rename to validator/src/main/resources/schema/zf1/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_QualifiedDataType_12.xsd diff --git a/libraryExtended/src/main/resources/schema/zf1/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_12.xsd b/validator/src/main/resources/schema/zf1/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_12.xsd similarity index 100% rename from libraryExtended/src/main/resources/schema/zf1/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_12.xsd rename to validator/src/main/resources/schema/zf1/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_12.xsd diff --git a/libraryExtended/src/main/resources/schema/zf1/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_15.xsd b/validator/src/main/resources/schema/zf1/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_15.xsd similarity index 100% rename from libraryExtended/src/main/resources/schema/zf1/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_15.xsd rename to validator/src/main/resources/schema/zf1/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_15.xsd diff --git a/libraryExtended/src/main/resources/schema/zf2/BASIC-WL/FACTUR-X_BASIC-WL.xsd b/validator/src/main/resources/schema/zf2/BASIC-WL/FACTUR-X_BASIC-WL.xsd similarity index 100% rename from libraryExtended/src/main/resources/schema/zf2/BASIC-WL/FACTUR-X_BASIC-WL.xsd rename to validator/src/main/resources/schema/zf2/BASIC-WL/FACTUR-X_BASIC-WL.xsd diff --git a/libraryExtended/src/main/resources/schema/zf2/BASIC-WL/FACTUR-X_BASIC-WL_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd b/validator/src/main/resources/schema/zf2/BASIC-WL/FACTUR-X_BASIC-WL_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd similarity index 100% rename from libraryExtended/src/main/resources/schema/zf2/BASIC-WL/FACTUR-X_BASIC-WL_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd rename to validator/src/main/resources/schema/zf2/BASIC-WL/FACTUR-X_BASIC-WL_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd diff --git a/libraryExtended/src/main/resources/schema/zf2/BASIC-WL/FACTUR-X_BASIC-WL_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd b/validator/src/main/resources/schema/zf2/BASIC-WL/FACTUR-X_BASIC-WL_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd similarity index 100% rename from libraryExtended/src/main/resources/schema/zf2/BASIC-WL/FACTUR-X_BASIC-WL_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd rename to validator/src/main/resources/schema/zf2/BASIC-WL/FACTUR-X_BASIC-WL_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd diff --git a/libraryExtended/src/main/resources/schema/zf2/BASIC-WL/FACTUR-X_BASIC-WL_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd b/validator/src/main/resources/schema/zf2/BASIC-WL/FACTUR-X_BASIC-WL_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd similarity index 100% rename from libraryExtended/src/main/resources/schema/zf2/BASIC-WL/FACTUR-X_BASIC-WL_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd rename to validator/src/main/resources/schema/zf2/BASIC-WL/FACTUR-X_BASIC-WL_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd diff --git a/libraryExtended/src/main/resources/schema/zf2/BASIC/FACTUR-X_BASIC.xsd b/validator/src/main/resources/schema/zf2/BASIC/FACTUR-X_BASIC.xsd similarity index 100% rename from libraryExtended/src/main/resources/schema/zf2/BASIC/FACTUR-X_BASIC.xsd rename to validator/src/main/resources/schema/zf2/BASIC/FACTUR-X_BASIC.xsd diff --git a/libraryExtended/src/main/resources/schema/zf2/BASIC/FACTUR-X_BASIC_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd b/validator/src/main/resources/schema/zf2/BASIC/FACTUR-X_BASIC_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd similarity index 100% rename from libraryExtended/src/main/resources/schema/zf2/BASIC/FACTUR-X_BASIC_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd rename to validator/src/main/resources/schema/zf2/BASIC/FACTUR-X_BASIC_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd diff --git a/libraryExtended/src/main/resources/schema/zf2/BASIC/FACTUR-X_BASIC_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd b/validator/src/main/resources/schema/zf2/BASIC/FACTUR-X_BASIC_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd similarity index 100% rename from libraryExtended/src/main/resources/schema/zf2/BASIC/FACTUR-X_BASIC_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd rename to validator/src/main/resources/schema/zf2/BASIC/FACTUR-X_BASIC_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd diff --git a/libraryExtended/src/main/resources/schema/zf2/BASIC/FACTUR-X_BASIC_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd b/validator/src/main/resources/schema/zf2/BASIC/FACTUR-X_BASIC_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd similarity index 100% rename from libraryExtended/src/main/resources/schema/zf2/BASIC/FACTUR-X_BASIC_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd rename to validator/src/main/resources/schema/zf2/BASIC/FACTUR-X_BASIC_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd diff --git a/libraryExtended/src/main/resources/schema/zf2/EN16931/FACTUR-X_EN16931.xsd b/validator/src/main/resources/schema/zf2/EN16931/FACTUR-X_EN16931.xsd similarity index 100% rename from libraryExtended/src/main/resources/schema/zf2/EN16931/FACTUR-X_EN16931.xsd rename to validator/src/main/resources/schema/zf2/EN16931/FACTUR-X_EN16931.xsd diff --git a/libraryExtended/src/main/resources/schema/zf2/EN16931/FACTUR-X_EN16931_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd b/validator/src/main/resources/schema/zf2/EN16931/FACTUR-X_EN16931_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd similarity index 100% rename from libraryExtended/src/main/resources/schema/zf2/EN16931/FACTUR-X_EN16931_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd rename to validator/src/main/resources/schema/zf2/EN16931/FACTUR-X_EN16931_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd diff --git a/libraryExtended/src/main/resources/schema/zf2/EN16931/FACTUR-X_EN16931_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd b/validator/src/main/resources/schema/zf2/EN16931/FACTUR-X_EN16931_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd similarity index 100% rename from libraryExtended/src/main/resources/schema/zf2/EN16931/FACTUR-X_EN16931_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd rename to validator/src/main/resources/schema/zf2/EN16931/FACTUR-X_EN16931_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd diff --git a/libraryExtended/src/main/resources/schema/zf2/EN16931/FACTUR-X_EN16931_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd b/validator/src/main/resources/schema/zf2/EN16931/FACTUR-X_EN16931_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd similarity index 100% rename from libraryExtended/src/main/resources/schema/zf2/EN16931/FACTUR-X_EN16931_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd rename to validator/src/main/resources/schema/zf2/EN16931/FACTUR-X_EN16931_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd diff --git a/libraryExtended/src/main/resources/schema/zf2/EXTENDED/FACTUR-X_EXTENDED.xsd b/validator/src/main/resources/schema/zf2/EXTENDED/FACTUR-X_EXTENDED.xsd similarity index 100% rename from libraryExtended/src/main/resources/schema/zf2/EXTENDED/FACTUR-X_EXTENDED.xsd rename to validator/src/main/resources/schema/zf2/EXTENDED/FACTUR-X_EXTENDED.xsd diff --git a/libraryExtended/src/main/resources/schema/zf2/EXTENDED/FACTUR-X_EXTENDED_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd b/validator/src/main/resources/schema/zf2/EXTENDED/FACTUR-X_EXTENDED_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd similarity index 100% rename from libraryExtended/src/main/resources/schema/zf2/EXTENDED/FACTUR-X_EXTENDED_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd rename to validator/src/main/resources/schema/zf2/EXTENDED/FACTUR-X_EXTENDED_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd diff --git a/libraryExtended/src/main/resources/schema/zf2/EXTENDED/FACTUR-X_EXTENDED_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd b/validator/src/main/resources/schema/zf2/EXTENDED/FACTUR-X_EXTENDED_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd similarity index 100% rename from libraryExtended/src/main/resources/schema/zf2/EXTENDED/FACTUR-X_EXTENDED_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd rename to validator/src/main/resources/schema/zf2/EXTENDED/FACTUR-X_EXTENDED_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd diff --git a/libraryExtended/src/main/resources/schema/zf2/EXTENDED/FACTUR-X_EXTENDED_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd b/validator/src/main/resources/schema/zf2/EXTENDED/FACTUR-X_EXTENDED_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd similarity index 100% rename from libraryExtended/src/main/resources/schema/zf2/EXTENDED/FACTUR-X_EXTENDED_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd rename to validator/src/main/resources/schema/zf2/EXTENDED/FACTUR-X_EXTENDED_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd diff --git a/libraryExtended/src/main/resources/schema/zf2/MINIMUM/FACTUR-X_MINIMUM.xsd b/validator/src/main/resources/schema/zf2/MINIMUM/FACTUR-X_MINIMUM.xsd similarity index 100% rename from libraryExtended/src/main/resources/schema/zf2/MINIMUM/FACTUR-X_MINIMUM.xsd rename to validator/src/main/resources/schema/zf2/MINIMUM/FACTUR-X_MINIMUM.xsd diff --git a/libraryExtended/src/main/resources/schema/zf2/MINIMUM/FACTUR-X_MINIMUM_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd b/validator/src/main/resources/schema/zf2/MINIMUM/FACTUR-X_MINIMUM_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd similarity index 100% rename from libraryExtended/src/main/resources/schema/zf2/MINIMUM/FACTUR-X_MINIMUM_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd rename to validator/src/main/resources/schema/zf2/MINIMUM/FACTUR-X_MINIMUM_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd diff --git a/libraryExtended/src/main/resources/schema/zf2/MINIMUM/FACTUR-X_MINIMUM_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd b/validator/src/main/resources/schema/zf2/MINIMUM/FACTUR-X_MINIMUM_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd similarity index 100% rename from libraryExtended/src/main/resources/schema/zf2/MINIMUM/FACTUR-X_MINIMUM_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd rename to validator/src/main/resources/schema/zf2/MINIMUM/FACTUR-X_MINIMUM_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd diff --git a/libraryExtended/src/main/resources/schema/zf2/MINIMUM/FACTUR-X_MINIMUM_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd b/validator/src/main/resources/schema/zf2/MINIMUM/FACTUR-X_MINIMUM_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd similarity index 100% rename from libraryExtended/src/main/resources/schema/zf2/MINIMUM/FACTUR-X_MINIMUM_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd rename to validator/src/main/resources/schema/zf2/MINIMUM/FACTUR-X_MINIMUM_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd diff --git a/libraryExtended/src/main/resources/xslt/EN16931-CII-validation.xslt b/validator/src/main/resources/xslt/EN16931-CII-validation.xslt similarity index 100% rename from libraryExtended/src/main/resources/xslt/EN16931-CII-validation.xslt rename to validator/src/main/resources/xslt/EN16931-CII-validation.xslt diff --git a/libraryExtended/src/main/resources/xslt/FACTUR-X_BASIC-WL_codedb.xml b/validator/src/main/resources/xslt/FACTUR-X_BASIC-WL_codedb.xml similarity index 100% rename from libraryExtended/src/main/resources/xslt/FACTUR-X_BASIC-WL_codedb.xml rename to validator/src/main/resources/xslt/FACTUR-X_BASIC-WL_codedb.xml diff --git a/libraryExtended/src/main/resources/xslt/FACTUR-X_BASIC_codedb.xml b/validator/src/main/resources/xslt/FACTUR-X_BASIC_codedb.xml similarity index 100% rename from libraryExtended/src/main/resources/xslt/FACTUR-X_BASIC_codedb.xml rename to validator/src/main/resources/xslt/FACTUR-X_BASIC_codedb.xml diff --git a/libraryExtended/src/main/resources/xslt/FACTUR-X_EN16931_codedb.xml b/validator/src/main/resources/xslt/FACTUR-X_EN16931_codedb.xml similarity index 100% rename from libraryExtended/src/main/resources/xslt/FACTUR-X_EN16931_codedb.xml rename to validator/src/main/resources/xslt/FACTUR-X_EN16931_codedb.xml diff --git a/libraryExtended/src/main/resources/xslt/FACTUR-X_EXTENDED_codedb.xml b/validator/src/main/resources/xslt/FACTUR-X_EXTENDED_codedb.xml similarity index 100% rename from libraryExtended/src/main/resources/xslt/FACTUR-X_EXTENDED_codedb.xml rename to validator/src/main/resources/xslt/FACTUR-X_EXTENDED_codedb.xml diff --git a/libraryExtended/src/main/resources/xslt/FACTUR-X_MINIMUM_codedb.xml b/validator/src/main/resources/xslt/FACTUR-X_MINIMUM_codedb.xml similarity index 100% rename from libraryExtended/src/main/resources/xslt/FACTUR-X_MINIMUM_codedb.xml rename to validator/src/main/resources/xslt/FACTUR-X_MINIMUM_codedb.xml diff --git a/libraryExtended/src/main/resources/xslt/XRechnung-CII-validation.xslt b/validator/src/main/resources/xslt/XRechnung-CII-validation.xslt similarity index 100% rename from libraryExtended/src/main/resources/xslt/XRechnung-CII-validation.xslt rename to validator/src/main/resources/xslt/XRechnung-CII-validation.xslt diff --git a/libraryExtended/src/main/resources/xslt/ZUGFeRD_1p0.xslt b/validator/src/main/resources/xslt/ZUGFeRD_1p0.xslt similarity index 100% rename from libraryExtended/src/main/resources/xslt/ZUGFeRD_1p0.xslt rename to validator/src/main/resources/xslt/ZUGFeRD_1p0.xslt diff --git a/libraryExtended/src/main/resources/xslt/cii16931schematron/EN16931-CII-validation.xslt b/validator/src/main/resources/xslt/cii16931schematron/EN16931-CII-validation.xslt similarity index 100% rename from libraryExtended/src/main/resources/xslt/cii16931schematron/EN16931-CII-validation.xslt rename to validator/src/main/resources/xslt/cii16931schematron/EN16931-CII-validation.xslt diff --git a/libraryExtended/src/main/resources/xslt/zugferd21_basic.xsl b/validator/src/main/resources/xslt/zugferd21_basic.xsl similarity index 100% rename from libraryExtended/src/main/resources/xslt/zugferd21_basic.xsl rename to validator/src/main/resources/xslt/zugferd21_basic.xsl diff --git a/libraryExtended/src/main/resources/xslt/zugferd21_basicwl.xsl b/validator/src/main/resources/xslt/zugferd21_basicwl.xsl similarity index 100% rename from libraryExtended/src/main/resources/xslt/zugferd21_basicwl.xsl rename to validator/src/main/resources/xslt/zugferd21_basicwl.xsl diff --git a/libraryExtended/src/main/resources/xslt/zugferd21_en16931.xsl b/validator/src/main/resources/xslt/zugferd21_en16931.xsl similarity index 100% rename from libraryExtended/src/main/resources/xslt/zugferd21_en16931.xsl rename to validator/src/main/resources/xslt/zugferd21_en16931.xsl diff --git a/libraryExtended/src/main/resources/xslt/zugferd21_extended.xsl b/validator/src/main/resources/xslt/zugferd21_extended.xsl similarity index 100% rename from libraryExtended/src/main/resources/xslt/zugferd21_extended.xsl rename to validator/src/main/resources/xslt/zugferd21_extended.xsl diff --git a/libraryExtended/src/main/resources/xslt/zugferd21_minimum.xsl b/validator/src/main/resources/xslt/zugferd21_minimum.xsl similarity index 100% rename from libraryExtended/src/main/resources/xslt/zugferd21_minimum.xsl rename to validator/src/main/resources/xslt/zugferd21_minimum.xsl diff --git a/libraryExtended/src/main/resources/xslt/zugferd2p0_basicwl_minimum.xslt b/validator/src/main/resources/xslt/zugferd2p0_basicwl_minimum.xslt similarity index 100% rename from libraryExtended/src/main/resources/xslt/zugferd2p0_basicwl_minimum.xslt rename to validator/src/main/resources/xslt/zugferd2p0_basicwl_minimum.xslt diff --git a/libraryExtended/src/main/resources/xslt/zugferd2p0_basicwl_minimum_codedb.xml b/validator/src/main/resources/xslt/zugferd2p0_basicwl_minimum_codedb.xml similarity index 100% rename from libraryExtended/src/main/resources/xslt/zugferd2p0_basicwl_minimum_codedb.xml rename to validator/src/main/resources/xslt/zugferd2p0_basicwl_minimum_codedb.xml diff --git a/libraryExtended/src/main/resources/xslt/zugferd2p0_en16931.xslt b/validator/src/main/resources/xslt/zugferd2p0_en16931.xslt similarity index 100% rename from libraryExtended/src/main/resources/xslt/zugferd2p0_en16931.xslt rename to validator/src/main/resources/xslt/zugferd2p0_en16931.xslt diff --git a/libraryExtended/src/main/resources/xslt/zugferd2p0_en16931_codedb.xml b/validator/src/main/resources/xslt/zugferd2p0_en16931_codedb.xml similarity index 100% rename from libraryExtended/src/main/resources/xslt/zugferd2p0_en16931_codedb.xml rename to validator/src/main/resources/xslt/zugferd2p0_en16931_codedb.xml diff --git a/libraryExtended/src/main/resources/xslt/zugferd2p0_extended.xslt b/validator/src/main/resources/xslt/zugferd2p0_extended.xslt similarity index 100% rename from libraryExtended/src/main/resources/xslt/zugferd2p0_extended.xslt rename to validator/src/main/resources/xslt/zugferd2p0_extended.xslt diff --git a/libraryExtended/src/main/resources/xslt/zugferd2p0_extended_codedb.xml b/validator/src/main/resources/xslt/zugferd2p0_extended_codedb.xml similarity index 100% rename from libraryExtended/src/main/resources/xslt/zugferd2p0_extended_codedb.xml rename to validator/src/main/resources/xslt/zugferd2p0_extended_codedb.xml diff --git a/libraryExtended/src/main/resources/zugferd2p0_basicwl_minimum.sch b/validator/src/main/resources/zugferd2p0_basicwl_minimum.sch similarity index 100% rename from libraryExtended/src/main/resources/zugferd2p0_basicwl_minimum.sch rename to validator/src/main/resources/zugferd2p0_basicwl_minimum.sch diff --git a/libraryExtended/src/main/resources/zugferd2p0_en16931.sch b/validator/src/main/resources/zugferd2p0_en16931.sch similarity index 100% rename from libraryExtended/src/main/resources/zugferd2p0_en16931.sch rename to validator/src/main/resources/zugferd2p0_en16931.sch diff --git a/libraryExtended/src/main/resources/zugferd2p0_extended.sch b/validator/src/main/resources/zugferd2p0_extended.sch similarity index 100% rename from libraryExtended/src/main/resources/zugferd2p0_extended.sch rename to validator/src/main/resources/zugferd2p0_extended.sch diff --git a/libraryExtended/src/test/java/org/mustangproject/library/extended/MiscValidatorTest.java b/validator/src/test/java/org/mustangproject/library/extended/MiscValidatorTest.java similarity index 100% rename from libraryExtended/src/test/java/org/mustangproject/library/extended/MiscValidatorTest.java rename to validator/src/test/java/org/mustangproject/library/extended/MiscValidatorTest.java diff --git a/libraryExtended/src/test/java/org/mustangproject/library/extended/PDFValidatorTest.java b/validator/src/test/java/org/mustangproject/library/extended/PDFValidatorTest.java similarity index 100% rename from libraryExtended/src/test/java/org/mustangproject/library/extended/PDFValidatorTest.java rename to validator/src/test/java/org/mustangproject/library/extended/PDFValidatorTest.java diff --git a/libraryExtended/src/test/java/org/mustangproject/library/extended/ResourceCase.java b/validator/src/test/java/org/mustangproject/library/extended/ResourceCase.java similarity index 100% rename from libraryExtended/src/test/java/org/mustangproject/library/extended/ResourceCase.java rename to validator/src/test/java/org/mustangproject/library/extended/ResourceCase.java diff --git a/libraryExtended/src/test/java/org/mustangproject/library/extended/XMLValidatorTest.java b/validator/src/test/java/org/mustangproject/library/extended/XMLValidatorTest.java similarity index 100% rename from libraryExtended/src/test/java/org/mustangproject/library/extended/XMLValidatorTest.java rename to validator/src/test/java/org/mustangproject/library/extended/XMLValidatorTest.java diff --git a/libraryExtended/src/test/java/org/mustangproject/library/extended/ZUGFeRDValidatorTest.java b/validator/src/test/java/org/mustangproject/library/extended/ZUGFeRDValidatorTest.java similarity index 100% rename from libraryExtended/src/test/java/org/mustangproject/library/extended/ZUGFeRDValidatorTest.java rename to validator/src/test/java/org/mustangproject/library/extended/ZUGFeRDValidatorTest.java diff --git a/libraryExtended/src/test/resources/FAIL_zugferd_2p1_MINIMUM_Rechnung_380.xml b/validator/src/test/resources/FAIL_zugferd_2p1_MINIMUM_Rechnung_380.xml similarity index 100% rename from libraryExtended/src/test/resources/FAIL_zugferd_2p1_MINIMUM_Rechnung_380.xml rename to validator/src/test/resources/FAIL_zugferd_2p1_MINIMUM_Rechnung_380.xml diff --git a/libraryExtended/src/test/resources/Facture_F20180027.pdf b/validator/src/test/resources/Facture_F20180027.pdf similarity index 100% rename from libraryExtended/src/test/resources/Facture_F20180027.pdf rename to validator/src/test/resources/Facture_F20180027.pdf diff --git a/libraryExtended/src/test/resources/XMLinvalidV2PDF.pdf b/validator/src/test/resources/XMLinvalidV2PDF.pdf similarity index 100% rename from libraryExtended/src/test/resources/XMLinvalidV2PDF.pdf rename to validator/src/test/resources/XMLinvalidV2PDF.pdf diff --git a/libraryExtended/src/test/resources/ZUGFeRD-invoice_rabatte_3_abschlag_duepayableamount.xml b/validator/src/test/resources/ZUGFeRD-invoice_rabatte_3_abschlag_duepayableamount.xml similarity index 100% rename from libraryExtended/src/test/resources/ZUGFeRD-invoice_rabatte_3_abschlag_duepayableamount.xml rename to validator/src/test/resources/ZUGFeRD-invoice_rabatte_3_abschlag_duepayableamount.xml diff --git a/libraryExtended/src/test/resources/ZUGFeRD-invoice_rabatte_4_abschlag_taxbasistotalamount.xml b/validator/src/test/resources/ZUGFeRD-invoice_rabatte_4_abschlag_taxbasistotalamount.xml similarity index 100% rename from libraryExtended/src/test/resources/ZUGFeRD-invoice_rabatte_4_abschlag_taxbasistotalamount.xml rename to validator/src/test/resources/ZUGFeRD-invoice_rabatte_4_abschlag_taxbasistotalamount.xml diff --git a/libraryExtended/src/test/resources/attributeBasedXMP_zugferd_2p0_EN16931_Einfach.pdf b/validator/src/test/resources/attributeBasedXMP_zugferd_2p0_EN16931_Einfach.pdf similarity index 100% rename from libraryExtended/src/test/resources/attributeBasedXMP_zugferd_2p0_EN16931_Einfach.pdf rename to validator/src/test/resources/attributeBasedXMP_zugferd_2p0_EN16931_Einfach.pdf diff --git a/libraryExtended/src/test/resources/attributeBasedXMP_zugferd_2p0_EN16931_Einfach_corrected.xml b/validator/src/test/resources/attributeBasedXMP_zugferd_2p0_EN16931_Einfach_corrected.xml similarity index 100% rename from libraryExtended/src/test/resources/attributeBasedXMP_zugferd_2p0_EN16931_Einfach_corrected.xml rename to validator/src/test/resources/attributeBasedXMP_zugferd_2p0_EN16931_Einfach_corrected.xml diff --git a/libraryExtended/src/test/resources/corruptedV2PDF.pdf b/validator/src/test/resources/corruptedV2PDF.pdf similarity index 100% rename from libraryExtended/src/test/resources/corruptedV2PDF.pdf rename to validator/src/test/resources/corruptedV2PDF.pdf diff --git a/libraryExtended/src/test/resources/invalidPDF.pdf b/validator/src/test/resources/invalidPDF.pdf similarity index 100% rename from libraryExtended/src/test/resources/invalidPDF.pdf rename to validator/src/test/resources/invalidPDF.pdf diff --git a/libraryExtended/src/test/resources/invalidV1.xml b/validator/src/test/resources/invalidV1.xml similarity index 100% rename from libraryExtended/src/test/resources/invalidV1.xml rename to validator/src/test/resources/invalidV1.xml diff --git a/libraryExtended/src/test/resources/invalidV1ExtraTags.xml b/validator/src/test/resources/invalidV1ExtraTags.xml similarity index 100% rename from libraryExtended/src/test/resources/invalidV1ExtraTags.xml rename to validator/src/test/resources/invalidV1ExtraTags.xml diff --git a/libraryExtended/src/test/resources/invalidV1TooMinimal.xml b/validator/src/test/resources/invalidV1TooMinimal.xml similarity index 100% rename from libraryExtended/src/test/resources/invalidV1TooMinimal.xml rename to validator/src/test/resources/invalidV1TooMinimal.xml diff --git a/libraryExtended/src/test/resources/invalidV2.xml b/validator/src/test/resources/invalidV2.xml similarity index 100% rename from libraryExtended/src/test/resources/invalidV2.xml rename to validator/src/test/resources/invalidV2.xml diff --git a/libraryExtended/src/test/resources/invalidV2Profile.xml b/validator/src/test/resources/invalidV2Profile.xml similarity index 100% rename from libraryExtended/src/test/resources/invalidV2Profile.xml rename to validator/src/test/resources/invalidV2Profile.xml diff --git a/libraryExtended/src/test/resources/invalidXMP.pdf b/validator/src/test/resources/invalidXMP.pdf similarity index 100% rename from libraryExtended/src/test/resources/invalidXMP.pdf rename to validator/src/test/resources/invalidXMP.pdf diff --git a/libraryExtended/src/test/resources/validAvoir_FR_type380_BASICWL.pdf b/validator/src/test/resources/validAvoir_FR_type380_BASICWL.pdf similarity index 100% rename from libraryExtended/src/test/resources/validAvoir_FR_type380_BASICWL.pdf rename to validator/src/test/resources/validAvoir_FR_type380_BASICWL.pdf diff --git a/libraryExtended/src/test/resources/validV1.xml b/validator/src/test/resources/validV1.xml similarity index 100% rename from libraryExtended/src/test/resources/validV1.xml rename to validator/src/test/resources/validV1.xml diff --git a/libraryExtended/src/test/resources/validV1WithAdditionalData.pdf b/validator/src/test/resources/validV1WithAdditionalData.pdf similarity index 100% rename from libraryExtended/src/test/resources/validV1WithAdditionalData.pdf rename to validator/src/test/resources/validV1WithAdditionalData.pdf diff --git a/libraryExtended/src/test/resources/validV2.xml b/validator/src/test/resources/validV2.xml similarity index 100% rename from libraryExtended/src/test/resources/validV2.xml rename to validator/src/test/resources/validV2.xml diff --git a/libraryExtended/src/test/resources/validV2Basic.xml b/validator/src/test/resources/validV2Basic.xml similarity index 100% rename from libraryExtended/src/test/resources/validV2Basic.xml rename to validator/src/test/resources/validV2Basic.xml diff --git a/libraryExtended/src/test/resources/validV2PDF.pdf b/validator/src/test/resources/validV2PDF.pdf similarity index 100% rename from libraryExtended/src/test/resources/validV2PDF.pdf rename to validator/src/test/resources/validV2PDF.pdf diff --git a/libraryExtended/src/test/resources/validZREtestZugferd.xml b/validator/src/test/resources/validZREtestZugferd.xml similarity index 100% rename from libraryExtended/src/test/resources/validZREtestZugferd.xml rename to validator/src/test/resources/validZREtestZugferd.xml diff --git a/libraryExtended/src/test/resources/valid_Avoir_FR_type380_minimum_factur-x.xml b/validator/src/test/resources/valid_Avoir_FR_type380_minimum_factur-x.xml similarity index 100% rename from libraryExtended/src/test/resources/valid_Avoir_FR_type380_minimum_factur-x.xml rename to validator/src/test/resources/valid_Avoir_FR_type380_minimum_factur-x.xml diff --git a/libraryExtended/utils/ZUGFeRD-Validierer-kriterien.pdf b/validator/utils/ZUGFeRD-Validierer-kriterien.pdf similarity index 100% rename from libraryExtended/utils/ZUGFeRD-Validierer-kriterien.pdf rename to validator/utils/ZUGFeRD-Validierer-kriterien.pdf