From d8d3482880d43b2a704b9a32f45ca374933901d3 Mon Sep 17 00:00:00 2001 From: Ralph Soika Date: Sun, 3 Nov 2024 10:29:08 +0100 Subject: [PATCH] impl Issue #215 --- imixs-archive-documents/README.md | 5 - imixs-archive-documents/pom.xml | 8 + .../archive/documents/EInvoiceAdapter.java | 2 +- .../documents/EInvoiceAutoAdapter.java | 45 +++++- .../documents/EInvoiceAdapterTest.java | 90 ++++++++--- .../documents/EInvoiceAutoAdapterTest.java | 136 +++++++++++++++++ .../documents/PDFXMLExtractorPluginTest.java | 3 +- .../documents/TestEInvoiceTransform.java | 2 +- .../documents/XSLTester.java | 2 +- .../documents/EInvoiceAutoAdapterTest.java | 142 ------------------ pom.xml | 2 +- 11 files changed, 251 insertions(+), 186 deletions(-) rename imixs-archive-documents/src/test/java/org/imixs/{workflow => archive}/documents/EInvoiceAdapterTest.java (57%) create mode 100644 imixs-archive-documents/src/test/java/org/imixs/archive/documents/EInvoiceAutoAdapterTest.java rename imixs-archive-documents/src/test/java/org/imixs/{workflow => archive}/documents/PDFXMLExtractorPluginTest.java (97%) rename imixs-archive-documents/src/test/java/org/imixs/{workflow => archive}/documents/TestEInvoiceTransform.java (97%) rename imixs-archive-documents/src/test/java/org/imixs/{workflow => archive}/documents/XSLTester.java (98%) delete mode 100644 imixs-archive-documents/src/test/java/org/imixs/workflow/documents/EInvoiceAutoAdapterTest.java diff --git a/imixs-archive-documents/README.md b/imixs-archive-documents/README.md index e2c4a29..859d594 100644 --- a/imixs-archive-documents/README.md +++ b/imixs-archive-documents/README.md @@ -234,11 +234,6 @@ The Adapter can be configured in an BPMN event to extract e-invoice data fields - - - - - If the type is not set the item value will be treated as a String. Possible types are 'double' and 'date' If the document is not a e-invoice no items and also the einvoice.type field will be set. diff --git a/imixs-archive-documents/pom.xml b/imixs-archive-documents/pom.xml index 75ad2e0..7138e92 100644 --- a/imixs-archive-documents/pom.xml +++ b/imixs-archive-documents/pom.xml @@ -47,6 +47,14 @@ provided + + + org.mustangproject + validator + shaded + 2.14.2 + + Imixs-Archive Documents \ No newline at end of file diff --git a/imixs-archive-documents/src/main/java/org/imixs/archive/documents/EInvoiceAdapter.java b/imixs-archive-documents/src/main/java/org/imixs/archive/documents/EInvoiceAdapter.java index 39eb3da..5bb0f0c 100644 --- a/imixs-archive-documents/src/main/java/org/imixs/archive/documents/EInvoiceAdapter.java +++ b/imixs-archive-documents/src/main/java/org/imixs/archive/documents/EInvoiceAdapter.java @@ -120,7 +120,7 @@ public class EInvoiceAdapter implements SignalAdapter { DocumentService documentService; @Inject - private WorkflowService workflowService; + WorkflowService workflowService; @Inject SnapshotService snapshotService; diff --git a/imixs-archive-documents/src/main/java/org/imixs/archive/documents/EInvoiceAutoAdapter.java b/imixs-archive-documents/src/main/java/org/imixs/archive/documents/EInvoiceAutoAdapter.java index 6cc2260..90cea3a 100644 --- a/imixs-archive-documents/src/main/java/org/imixs/archive/documents/EInvoiceAutoAdapter.java +++ b/imixs-archive-documents/src/main/java/org/imixs/archive/documents/EInvoiceAutoAdapter.java @@ -1,11 +1,21 @@ package org.imixs.archive.documents; +import java.io.ByteArrayInputStream; +import java.math.BigDecimal; +import java.text.ParseException; import java.util.logging.Logger; +import javax.xml.xpath.XPathExpressionException; + import org.imixs.workflow.FileData; import org.imixs.workflow.ItemCollection; import org.imixs.workflow.exceptions.AdapterException; import org.imixs.workflow.exceptions.PluginException; +import org.mustangproject.BankDetails; +import org.mustangproject.Invoice; +import org.mustangproject.TradeParty; +import org.mustangproject.ZUGFeRD.TransactionCalculator; +import org.mustangproject.ZUGFeRD.ZUGFeRDInvoiceImporter; /** * The EInvoiceAutoAdapter can detect and extract content from e-invoice @@ -67,15 +77,34 @@ private void readEInvoiceContent(FileData eInvoiceFileData, byte[] xmlData = readXMLContent(eInvoiceFileData); logger.info("Autodetect e-invoice data..."); - createXMLDoc(xmlData); + // createXMLDoc(xmlData); + try { + ZUGFeRDInvoiceImporter zii = new ZUGFeRDInvoiceImporter(new ByteArrayInputStream(xmlData)); + + Invoice invoice = zii.extractInvoice(); + workitem.setItemValue("invoice.number", invoice.getNumber()); + workitem.setItemValue("cdtr.name", invoice.getOwnOrganisationName()); + workitem.setItemValue("invoice.date", invoice.getIssueDate()); + + TransactionCalculator tc = new TransactionCalculator(invoice); + BigDecimal value = tc.getValue(); + workitem.setItemValue("invoice.total.net", tc.getValue()); + workitem.setItemValue("invoice.total", tc.getGrandTotal()); + workitem.setItemValue("invoice.total.tax", tc.getGrandTotal().floatValue() - tc.getValue().floatValue()); - readItem(workitem, "//rsm:CrossIndustryInvoice/rsm:ExchangedDocument/ram:ID", "text", "invoice.number"); - readItem(workitem, "//rsm:ExchangedDocument/ram:IssueDateTime/udt:DateTimeString/text()", "date", - "invoice.date"); - readItem(workitem, "//ram:SpecifiedTradeSettlementHeaderMonetarySummation/ram:GrandTotalAmount", "double", - "invoice.total"); - readItem(workitem, "//ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty/ram:Name/text()", "text", - "cdtr.name"); + try { + TradeParty payee = invoice.getSender(); + BankDetails bankDetails = payee.getBankDetails().get(0); + workitem.setItemValue("cdtr.bic", bankDetails.getBIC()); + workitem.setItemValue("cdtr.iban", bankDetails.getIBAN()); + } catch (Exception e) { + // no bank data + } + + } catch (XPathExpressionException | ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } } diff --git a/imixs-archive-documents/src/test/java/org/imixs/workflow/documents/EInvoiceAdapterTest.java b/imixs-archive-documents/src/test/java/org/imixs/archive/documents/EInvoiceAdapterTest.java similarity index 57% rename from imixs-archive-documents/src/test/java/org/imixs/workflow/documents/EInvoiceAdapterTest.java rename to imixs-archive-documents/src/test/java/org/imixs/archive/documents/EInvoiceAdapterTest.java index 03da6b1..a980e88 100644 --- a/imixs-archive-documents/src/test/java/org/imixs/workflow/documents/EInvoiceAdapterTest.java +++ b/imixs-archive-documents/src/test/java/org/imixs/archive/documents/EInvoiceAdapterTest.java @@ -1,4 +1,4 @@ -package org.imixs.workflow.documents; +package org.imixs.archive.documents; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -10,53 +10,71 @@ import java.util.List; import java.util.Map; -import org.imixs.archive.documents.EInvoiceAdapter; import org.imixs.workflow.FileData; import org.imixs.workflow.ItemCollection; -import org.imixs.workflow.engine.DocumentService; -import org.imixs.workflow.engine.WorkflowService; +import org.imixs.workflow.engine.WorkflowMockEnvironment; import org.imixs.workflow.exceptions.AdapterException; import org.imixs.workflow.exceptions.ModelException; import org.imixs.workflow.exceptions.PluginException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; +import org.mockito.MockitoAnnotations; +import org.openbpmn.bpmn.BPMNModel; /** * This test class is testing the EInvoiceAdapter and tests different * kind of files * - * */ -@ExtendWith(MockitoExtension.class) class EInvoiceAdapterTest { - @Mock - private DocumentService documentService; - - @Mock - private WorkflowService workflowService; - @InjectMocks - private EInvoiceAdapter adapter; + protected EInvoiceAdapter adapter; - private ItemCollection workitem; - private ItemCollection event; + protected ItemCollection workitem; + protected ItemCollection event; + protected WorkflowMockEnvironment workflowEnvironment; + BPMNModel model = null; @BeforeEach - void setUp() throws PluginException, ModelException { - // MockitoAnnotations.openMocks(this); + public void setUp() throws PluginException, ModelException { + // Ensures that @Mock and @InjectMocks annotations are processed + MockitoAnnotations.openMocks(this); + workflowEnvironment = new WorkflowMockEnvironment(); + + // register AccessAdapter Mock + workflowEnvironment.registerAdapter(adapter); + + // Setup Environment + workflowEnvironment.setUp(); + workflowEnvironment.loadBPMNModel("/bpmn/TestZUGFeRD.bpmn"); + model = workflowEnvironment.getModelService().getModelManager().getModel("1.0.0"); + adapter.workflowService = workflowEnvironment.getWorkflowService(); + + // prepare data + workitem = new ItemCollection().model("1.0.0").task(100); - workitem = new ItemCollection(); event = new ItemCollection(); // set test txtActivityResult.... - String config = "\n"; - config += " invoice.number=//rsm:CrossIndustryInvoice/rsm:ExchangedDocument/ram:ID\n"; - config += " invoice.date=//rsm:CrossIndustryInvoice/rsm:ExchangedDocument/ram:IssueDateTime\n"; - config += ""; + String config = "\n" + // + " invoice.number\n" + // + " //rsm:CrossIndustryInvoice/rsm:ExchangedDocument/ram:ID\n" + // + "\n" + // + "\n" + // + " invoice.date\n" + // + " date\n" + // + " //rsm:ExchangedDocument/ram:IssueDateTime/udt:DateTimeString/text()\n" + // + "\n" + // + "\n" + // + " invoice.total\n" + // + " double\n" + // + " //ram:SpecifiedTradeSettlementHeaderMonetarySummation/ram:GrandTotalAmount\n" + // + "\n" + // + "\n" + // + " cdtr.name\n" + // + " //ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty/ram:Name/text()\n" + // + ""; event.setItemValue("txtActivityResult", config); } @@ -85,6 +103,28 @@ void testExecuteWithStandaloneXML() throws AdapterException, PluginException, IO assertEquals("Factur-X/ZUGFeRD 2.0", result); } + /** + * This test uses the xpath expressions form teh workflow event to extract xml + * content. + * + * @throws AdapterException + * @throws PluginException + * @throws IOException + */ + @Test + void testExecuteWithStandaloneXMLExtractData() throws AdapterException, PluginException, IOException { + + // Prepare test data + FileData xmlFile = createFileData("e-invoice/Rechnung_R_00010.xml", "application/xml"); + workitem.addFileData(xmlFile); + + adapter.execute(workitem, event); + + assertEquals("R-00010", workitem.getItemValueString("invoice.number")); + assertEquals("Max Mustermann", workitem.getItemValueString("cdtr.name")); + + } + @Test void testExecuteWithZIPContainingXML() throws AdapterException, PluginException, IOException { // Prepare test data diff --git a/imixs-archive-documents/src/test/java/org/imixs/archive/documents/EInvoiceAutoAdapterTest.java b/imixs-archive-documents/src/test/java/org/imixs/archive/documents/EInvoiceAutoAdapterTest.java new file mode 100644 index 0000000..8cce664 --- /dev/null +++ b/imixs-archive-documents/src/test/java/org/imixs/archive/documents/EInvoiceAutoAdapterTest.java @@ -0,0 +1,136 @@ +package org.imixs.archive.documents; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.IOException; +import java.io.InputStream; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.imixs.workflow.FileData; +import org.imixs.workflow.ItemCollection; +import org.imixs.workflow.engine.WorkflowMockEnvironment; +import org.imixs.workflow.exceptions.AdapterException; +import org.imixs.workflow.exceptions.ModelException; +import org.imixs.workflow.exceptions.PluginException; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.MockitoAnnotations; +import org.openbpmn.bpmn.BPMNModel; + +/** + * This test class is testing the EInvoiceAutoAdapter and tests different + * kind of files + * + */ +class EInvoiceAutoAdapterTest { + + @InjectMocks + protected EInvoiceAutoAdapter adapter; + + protected ItemCollection workitem; + protected ItemCollection event; + protected WorkflowMockEnvironment workflowEnvironment; + BPMNModel model = null; + + @BeforeEach + public void setUp() throws PluginException, ModelException { + // Ensures that @Mock and @InjectMocks annotations are processed + MockitoAnnotations.openMocks(this); + workflowEnvironment = new WorkflowMockEnvironment(); + + // register AccessAdapter Mock + workflowEnvironment.registerAdapter(adapter); + + // Setup Environment + workflowEnvironment.setUp(); + workflowEnvironment.loadBPMNModel("/bpmn/TestZUGFeRD.bpmn"); + model = workflowEnvironment.getModelService().getModelManager().getModel("1.0.0"); + adapter.workflowService = workflowEnvironment.getWorkflowService(); + + // prepare data + workitem = new ItemCollection().model("1.0.0").task(100); + + event = new ItemCollection(); + + } + + /** + * Simple test that extracts the invoice from a XML file - number and the + * creditor name + * + * @throws AdapterException + * @throws PluginException + * @throws IOException + */ + @Test + void testXMLWithExtraction() throws AdapterException, PluginException, IOException { + // Prepare test data + FileData xmlFile = createFileData("e-invoice/Rechnung_R_00010.xml", "application/xml"); + workitem.addFileData(xmlFile); + + adapter.execute(workitem, event); + + assertEquals("R-00010", workitem.getItemValueString("invoice.number")); + assertEquals("Max Mustermann", workitem.getItemValueString("cdtr.name")); + } + + /** + * Simple test that extracts the invoice from a zugferd pdf file - number and + * the creditor name + * + * @throws AdapterException + * @throws PluginException + * @throws IOException + */ + @Test + void testZugferdWithExtraction() throws AdapterException, PluginException, IOException { + // Prepare test data + FileData xmlFile = createFileData("e-invoice/Rechnung_R_00011.pdf", "application/pdf"); + workitem.addFileData(xmlFile); + + adapter.execute(workitem, event); + + assertEquals("R-00011", workitem.getItemValueString("invoice.number")); + assertEquals("Max Mustermann", workitem.getItemValueString("cdtr.name")); + ZonedDateTime expectedZdt = ZonedDateTime.of(2021, 7, 27, 0, 0, 0, 0, ZoneId.of("Europe/Berlin")); + Date expectedDate = Date.from(expectedZdt.toInstant()); + + assertEquals(expectedDate, workitem.getItemValueDate("invoice.date")); + + // Payment data + assertEquals(892.50, workitem.getItemValueFloat("invoice.total")); + assertEquals(750, workitem.getItemValueFloat("invoice.total.net")); + assertEquals(142.5, workitem.getItemValueFloat("invoice.total.tax")); + // assertEquals("xxxxxR-00011", workitem.getItemValueString("cdtr.iban")); + // assertEquals("xxxxxR-00011", workitem.getItemValueString("cdtr.bic")); + + } + + /** + * Creates a FileData object from a file stored under /test/resources/ + * + * @param fileName + * @param contentType + * @return + * @throws IOException + */ + private FileData createFileData(String fileName, String contentType) throws IOException { + byte[] content = null; + ClassLoader classLoader = getClass().getClassLoader(); + try (InputStream is = classLoader.getResourceAsStream(fileName)) { + if (is == null) { + throw new IOException("Resource not found: " + fileName); + } + content = is.readAllBytes(); + } + Map> attributes = new HashMap<>(); + return new FileData(fileName, content, contentType, attributes); + } + +} \ No newline at end of file diff --git a/imixs-archive-documents/src/test/java/org/imixs/workflow/documents/PDFXMLExtractorPluginTest.java b/imixs-archive-documents/src/test/java/org/imixs/archive/documents/PDFXMLExtractorPluginTest.java similarity index 97% rename from imixs-archive-documents/src/test/java/org/imixs/workflow/documents/PDFXMLExtractorPluginTest.java rename to imixs-archive-documents/src/test/java/org/imixs/archive/documents/PDFXMLExtractorPluginTest.java index 203335e..4ba06e0 100644 --- a/imixs-archive-documents/src/test/java/org/imixs/workflow/documents/PDFXMLExtractorPluginTest.java +++ b/imixs-archive-documents/src/test/java/org/imixs/archive/documents/PDFXMLExtractorPluginTest.java @@ -1,4 +1,4 @@ -package org.imixs.workflow.documents; +package org.imixs.archive.documents; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -10,7 +10,6 @@ import java.util.logging.Logger; import java.util.regex.Pattern; -import org.imixs.archive.documents.PDFXMLExtractorPlugin; import org.imixs.workflow.FileData; import org.imixs.workflow.ItemCollection; import org.imixs.workflow.engine.WorkflowMockEnvironment; diff --git a/imixs-archive-documents/src/test/java/org/imixs/workflow/documents/TestEInvoiceTransform.java b/imixs-archive-documents/src/test/java/org/imixs/archive/documents/TestEInvoiceTransform.java similarity index 97% rename from imixs-archive-documents/src/test/java/org/imixs/workflow/documents/TestEInvoiceTransform.java rename to imixs-archive-documents/src/test/java/org/imixs/archive/documents/TestEInvoiceTransform.java index de65d88..68d1bd1 100644 --- a/imixs-archive-documents/src/test/java/org/imixs/workflow/documents/TestEInvoiceTransform.java +++ b/imixs-archive-documents/src/test/java/org/imixs/archive/documents/TestEInvoiceTransform.java @@ -1,4 +1,4 @@ -package org.imixs.workflow.documents; +package org.imixs.archive.documents; import java.io.IOException; import java.util.logging.Logger; diff --git a/imixs-archive-documents/src/test/java/org/imixs/workflow/documents/XSLTester.java b/imixs-archive-documents/src/test/java/org/imixs/archive/documents/XSLTester.java similarity index 98% rename from imixs-archive-documents/src/test/java/org/imixs/workflow/documents/XSLTester.java rename to imixs-archive-documents/src/test/java/org/imixs/archive/documents/XSLTester.java index 504b669..1e055c3 100644 --- a/imixs-archive-documents/src/test/java/org/imixs/workflow/documents/XSLTester.java +++ b/imixs-archive-documents/src/test/java/org/imixs/archive/documents/XSLTester.java @@ -1,4 +1,4 @@ -package org.imixs.workflow.documents; +package org.imixs.archive.documents; import java.io.BufferedReader; import java.io.FileOutputStream; diff --git a/imixs-archive-documents/src/test/java/org/imixs/workflow/documents/EInvoiceAutoAdapterTest.java b/imixs-archive-documents/src/test/java/org/imixs/workflow/documents/EInvoiceAutoAdapterTest.java deleted file mode 100644 index 6b0663e..0000000 --- a/imixs-archive-documents/src/test/java/org/imixs/workflow/documents/EInvoiceAutoAdapterTest.java +++ /dev/null @@ -1,142 +0,0 @@ -package org.imixs.workflow.documents; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; - -import java.io.IOException; -import java.io.InputStream; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.imixs.archive.documents.EInvoiceAdapter; -import org.imixs.workflow.FileData; -import org.imixs.workflow.ItemCollection; -import org.imixs.workflow.engine.DocumentService; -import org.imixs.workflow.engine.WorkflowService; -import org.imixs.workflow.exceptions.AdapterException; -import org.imixs.workflow.exceptions.ModelException; -import org.imixs.workflow.exceptions.PluginException; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; - -/** - * This test class is testing the EInvoiceAutoAdapter and tests different - * kind of files - * - * - */ -@ExtendWith(MockitoExtension.class) -class EInvoiceAutoAdapterTest { - - @Mock - private DocumentService documentService; - - @Mock - private WorkflowService workflowService; - - @InjectMocks - private EInvoiceAdapter adapter; - - private ItemCollection workitem; - private ItemCollection event; - - @BeforeEach - void setUp() throws PluginException, ModelException { - // MockitoAnnotations.openMocks(this); - - workitem = new ItemCollection(); - event = new ItemCollection(); - // set test txtActivityResult.... - String config = "\n"; - config += " invoice.number=//rsm:CrossIndustryInvoice/rsm:ExchangedDocument/ram:ID\n"; - config += " invoice.date=//rsm:CrossIndustryInvoice/rsm:ExchangedDocument/ram:IssueDateTime\n"; - config += ""; - event.setItemValue("txtActivityResult", config); - } - - @Test - void testExecuteWithPDFContainingXML() throws AdapterException, PluginException, IOException { - // Prepare test data - FileData pdfFile = createFileData("e-invoice/Rechnung_R_00011.pdf", "application/pdf"); - workitem.addFileData(pdfFile); - FileData fileData = adapter.detectEInvoice(workitem); - String result = EInvoiceAdapter.detectEInvoiceType(fileData); - assertNotNull(result); - assertEquals("Factur-X/ZUGFeRD 2.0", result); - } - - @Test - void testExecuteWithStandaloneXML() throws AdapterException, PluginException, IOException { - // Prepare test data - FileData xmlFile = createFileData("e-invoice/Rechnung_R_00010.xml", "application/xml"); - workitem.addFileData(xmlFile); - - FileData fileData = adapter.detectEInvoice(workitem); - String result = EInvoiceAdapter.detectEInvoiceType(fileData); - - // Verify the result - assertNotNull(result); - assertEquals("Factur-X/ZUGFeRD 2.0", result); - } - - @Test - void testExecuteWithZIPContainingXML() throws AdapterException, PluginException, IOException { - // Prepare test data - FileData zipFile = createFileData("e-invoice/XRechnung_Beispiel.zip", "application/zip"); - workitem.addFileData(zipFile); - - FileData fileData = adapter.detectEInvoice(workitem); - String result = EInvoiceAdapter.detectEInvoiceType(fileData); - // Verify the result - assertNotNull(result); - assertEquals("Factur-X/ZUGFeRD 2.0", result); - } - - @Test - void testExecuteWithNonEInvoiceFile() throws AdapterException, PluginException, IOException { - // Prepare test data - FileData txtFile = createFileData("e-invoice/document.txt", "text/plain"); - workitem.addFileData(txtFile); - - // Execute the adapter - FileData fileData = adapter.detectEInvoice(workitem); - // Verify the result - assertNull(fileData); - } - - @Test - void testExecuteWithNoAttachments() throws AdapterException, PluginException { - // Execute the adapter - FileData fileData = adapter.detectEInvoice(workitem); - // Verify the result - assertNull(fileData); - } - - /** - * Creates a FileData object from a file stored under /test/resources/ - * - * @param fileName - * @param contentType - * @return - * @throws IOException - */ - private FileData createFileData(String fileName, String contentType) throws IOException { - byte[] content = null; - ClassLoader classLoader = getClass().getClassLoader(); - try (InputStream is = classLoader.getResourceAsStream(fileName)) { - if (is == null) { - throw new IOException("Resource not found: " + fileName); - } - content = is.readAllBytes(); - } - Map> attributes = new HashMap<>(); - return new FileData(fileName, content, contentType, attributes); - } - -} \ No newline at end of file diff --git a/pom.xml b/pom.xml index cbd3c79..8a34175 100644 --- a/pom.xml +++ b/pom.xml @@ -85,7 +85,7 @@ 11 11 10.0.0 - 6.1.0-SNAPSHOT + 6.1.0 2.1.0-SNAPSHOT 2.0.21 6.0