Merge pull request #944 from langfr/bugfix/StringCreation

Use UTF-8 when creating new Strings from byte[].
This commit is contained in:
Jochen Staerk
2025-10-08 13:44:35 +02:00
committed by GitHub
13 changed files with 34 additions and 31 deletions

View File

@@ -182,7 +182,7 @@ public class DAPullProvider extends ZUGFeRD2PullProvider {
// Additional Documents of XRechnung (Rechnungsbegruendende Unterlagen - BG-24 XRechnung)
if (trans.getAdditionalReferencedDocuments() != null) {
for (final FileAttachment f : trans.getAdditionalReferencedDocuments()) {
final String documentContent = new String(Base64.getEncoder().encodeToString(f.getData()));
final String documentContent = Base64.getEncoder().encodeToString(f.getData());
xml += "<ram:AdditionalReferencedDocument>"
+ "<ram:IssuerAssignedID>" + f.getFilename() + "</ram:IssuerAssignedID>"
+ "<ram:TypeCode>916</ram:TypeCode>"

View File

@@ -257,7 +257,7 @@ public class OXPullProvider extends ZUGFeRD2PullProvider {
// Additional Documents of XRechnung (Rechnungsbegruendende Unterlagen - BG-24 XRechnung)
if (trans.getAdditionalReferencedDocuments() != null) {
for (final FileAttachment f : trans.getAdditionalReferencedDocuments()) {
final String documentContent = new String(Base64.getEncoder().encodeToString(f.getData()));
final String documentContent = Base64.getEncoder().encodeToString(f.getData());
xml += "<ram:AdditionalReferencedDocument>"
+ "<ram:IssuerAssignedID>" + f.getFilename() + "</ram:IssuerAssignedID>"
+ "<ram:TypeCode>916</ram:TypeCode>"

View File

@@ -117,7 +117,7 @@ public class UBLDAPullProvider implements IXMLProvider {
final StringWriter sw = new StringWriter();
Document document = null;
try {
document = DocumentHelper.parseText(new String(ublData));
document = DocumentHelper.parseText(new String(ublData, StandardCharsets.UTF_8));
} catch (final DocumentException e1) {
LOGGER.error ("Failed to parse UBL", e1);
}

View File

@@ -91,7 +91,7 @@ public class ZUGFeRD1PullProvider extends ZUGFeRD2PullProvider {
final StringWriter sw = new StringWriter();
Document document = null;
try {
document = DocumentHelper.parseText(new String(zugferdData));
document = DocumentHelper.parseText(new String(zugferdData, StandardCharsets.UTF_8));
} catch (final DocumentException e1) {
LOGGER.error ("Failed to parse ZUGFeRD data", e1);
}

View File

@@ -95,7 +95,7 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
final StringWriter sw = new StringWriter();
Document document = null;
try {
document = DocumentHelper.parseText(new String(zugferdData));
document = DocumentHelper.parseText(new String(zugferdData, StandardCharsets.UTF_8));
} catch (final DocumentException e1) {
LOGGER.error("Failed to parse ZUGFeRD data", e1);
}
@@ -620,7 +620,7 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
// Additional Documents of XRechnung (Rechnungsbegruendende Unterlagen - BG-24 XRechnung)
if (trans.getAdditionalReferencedDocuments() != null) {
for (final FileAttachment f : trans.getAdditionalReferencedDocuments()) {
final String documentContent = new String(Base64.getEncoder().encodeToString(f.getData()));
final String documentContent = Base64.getEncoder().encodeToString(f.getData());
xml += "<ram:AdditionalReferencedDocument>"
+ "<ram:IssuerAssignedID>" + f.getFilename() + "</ram:IssuerAssignedID>"
+ "<ram:TypeCode>916</ram:TypeCode>"

View File

@@ -14,6 +14,7 @@ package org.mustangproject.ZUGFeRD;
* @author jstaerk
*/
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
@@ -479,7 +480,7 @@ public class ZUGFeRDImporter extends ZUGFeRDInvoiceImporter {
return null;
}
return new String(rawXML);
return new String(rawXML, StandardCharsets.UTF_8);
}

View File

@@ -1275,7 +1275,7 @@ public class ZUGFeRDInvoiceImporter {
return null;
}
if (rawXML.length < 3) {
return new String(rawXML);
return new String(rawXML, StandardCharsets.UTF_8);
}

View File

@@ -17,6 +17,7 @@ import javax.xml.transform.Source;
import javax.xml.xpath.XPathExpressionException;
import java.io.*;
import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
@@ -292,7 +293,7 @@ public class CalculationTest extends ResourceCase {
zf2p.generateXML(invoice);
String theXML = new String(zf2p.getXML());
String theXML = new String(zf2p.getXML(), StandardCharsets.UTF_8);
assertThat(theXML).valueByXPath("//*[local-name()='ActualAmount']")
.asString()
.isEqualTo("0.55");// test for issue #917
@@ -346,7 +347,7 @@ public class CalculationTest extends ResourceCase {
zf2p.generateXML(invoice);
String theXML = new String(zf2p.getXML());
String theXML = new String(zf2p.getXML(), StandardCharsets.UTF_8);
assertThat(theXML).valueByXPath("//*[local-name()='ActualAmount']")
.asString()
.isEqualTo("0.55");// test for issue #917

View File

@@ -300,7 +300,7 @@ public class DeSerializationTest extends ResourceCase {
ZUGFeRD2PullProvider zf2p = new ZUGFeRD2PullProvider();
zf2p.setProfile(Profiles.getByName("XRechnung"));
zf2p.generateXML(newInvoiceFromJSON);
String theXML = new String(zf2p.getXML());
String theXML = new String(zf2p.getXML(), StandardCharsets.UTF_8);
assertTrue(theXML.contains("<udt:DateTimeString format=\"102\">20180304</udt:DateTimeString>"));
assertTrue(theXML.contains(base64));
@@ -553,7 +553,7 @@ public class DeSerializationTest extends ResourceCase {
ZUGFeRD2PullProvider zf2p = new ZUGFeRD2PullProvider();
zf2p.setProfile(Profiles.getByName("XRechnung"));
zf2p.generateXML(fromJSON);
String theXML = new String(zf2p.getXML());
String theXML = new String(zf2p.getXML(), StandardCharsets.UTF_8);
assertTrue(theXML.contains("<udt:DateTimeString format=\"102\">20241026</udt:DateTimeString>"));
}
@@ -934,7 +934,7 @@ public class DeSerializationTest extends ResourceCase {
ZUGFeRD2PullProvider zf2p = new ZUGFeRD2PullProvider();
zf2p.setProfile(Profiles.getByName("XRechnung"));
zf2p.generateXML(fromJSON);
theXML = new String(zf2p.getXML());
theXML = new String(zf2p.getXML(), StandardCharsets.UTF_8);
} catch (Exception e) {
exceptions = true;
}

View File

@@ -162,7 +162,7 @@ public class ZF2PushTest extends TestCase {
.setNumber(number)
.addItem(new Item(new Product("Testprodukt", "", "H87", new BigDecimal(0)).setTaxExemptionReason("Kleinunternehmer gemäß §19 UStG").setTaxCategoryCode("E"), price, new BigDecimal(1.0)).addNote(theNote))
);
String theXML = new String(ze.getProvider().getXML());
String theXML = new String(ze.getProvider().getXML(), StandardCharsets.UTF_8);
assertTrue(theXML.contains("<rsm:CrossIndustryInvoice"));
ze.export(TARGET_ATTACHMENTSPDF);
} catch (IOException e) {
@@ -222,7 +222,7 @@ public class ZF2PushTest extends TestCase {
.setNumber(number)
.addItem(new Item(new Product("Testprodukt", "", "H87", new BigDecimal(19)), price, new BigDecimal(1.0)))
);
String theXML = new String(ze.getProvider().getXML());
String theXML = new String(ze.getProvider().getXML(), StandardCharsets.UTF_8);
Invoice read = new Invoice();
ZUGFeRDInvoiceImporter zii = new ZUGFeRDInvoiceImporter(new ByteArrayInputStream(theXML.getBytes(StandardCharsets.UTF_8)));
zii.extractInto(read);
@@ -266,7 +266,7 @@ public class ZF2PushTest extends TestCase {
ze.setTransaction(i);
String theXML = new String(ze.getProvider().getXML());
String theXML = new String(ze.getProvider().getXML(), StandardCharsets.UTF_8);
assertTrue(theXML.contains("<rsm:CrossIndustryInvoice"));
ze.export(TARGET_ITEMGROSS);
} catch (IOException e) {
@@ -332,7 +332,7 @@ public class ZF2PushTest extends TestCase {
ze.setTransaction(i);
String theXML = new String(ze.getProvider().getXML());
String theXML = new String(ze.getProvider().getXML(), StandardCharsets.UTF_8);
assertTrue(theXML.contains("<rsm:CrossIndustryInvoice"));
ze.export(TARGET_ITEMCHARGESALLOWANCESPDF);
} catch (IOException e) {
@@ -387,7 +387,7 @@ public class ZF2PushTest extends TestCase {
.addItem(new Item(new Product("Testprodukt", "", "H87", new BigDecimal(19)).setIntraCommunitySupply(), price, new BigDecimal(1.0)))
);
String theXML = new String(ze.getProvider().getXML());
String theXML = new String(ze.getProvider().getXML(), StandardCharsets.UTF_8);
assertTrue(theXML.contains("<rsm:CrossIndustryInvoice"));
ze.export(TARGET_INTRACOMMUNITYSUPPLYPDF);
} catch (IOException e) {
@@ -439,7 +439,7 @@ public class ZF2PushTest extends TestCase {
.setNumber(number)
.addItem(new Item(new Product("Testprodukt", "", "H87", new BigDecimal(0)).setTaxExemptionReason("Kein Ausweis der Umsatzsteuer bei innergemeinschaftlichen Lieferungen").setTaxCategoryCode("K"), price, new BigDecimal(1.0)))
);
String theXML = new String(ze.getProvider().getXML());
String theXML = new String(ze.getProvider().getXML(), StandardCharsets.UTF_8);
assertTrue(theXML.contains("<rsm:CrossIndustryInvoice"));
ze.export(TARGET_INTRACOMMUNITYSUPPLYMANUALPDF);
} catch (IOException e) {
@@ -500,7 +500,7 @@ public class ZF2PushTest extends TestCase {
.addItem(new Item(new Product("Testprodukt", "", "H87", new BigDecimal(19)).setReverseCharge(), price, new BigDecimal(1.0)))
);
String theXML = new String(ze.getProvider().getXML());
String theXML = new String(ze.getProvider().getXML(), StandardCharsets.UTF_8);
assertTrue(theXML.contains("<rsm:CrossIndustryInvoice"));
ze.export(TARGET_REVERSECHARGEPDF);
} catch (IOException e) {
@@ -547,7 +547,7 @@ public class ZF2PushTest extends TestCase {
.addCharge(new Charge(new BigDecimal(0.5)).setTaxPercent(new BigDecimal(19)).setReasonCode("ABK"))
.addAllowance(new Allowance(new BigDecimal(0.2)).setTaxPercent(new BigDecimal(19)).setReasonCode("ABK"))
);
String theXML = new String(ze.getProvider().getXML());
String theXML = new String(ze.getProvider().getXML(), StandardCharsets.UTF_8);
assertTrue(theXML.contains("<rsm:CrossIndustryInvoice"));
ze.export(TARGET_CHARGESALLOWANCESPDF);
} catch (IOException e) {
@@ -615,7 +615,7 @@ public class ZF2PushTest extends TestCase {
e.printStackTrace();
}
String theXML = new String(ze.getProvider().getXML());
String theXML = new String(ze.getProvider().getXML(), StandardCharsets.UTF_8);
assertTrue(theXML.contains("<rsm:CrossIndustryInvoice"));
ze.export(TARGET_PUSHEDGE);
} catch (IOException e) {
@@ -698,7 +698,7 @@ public class ZF2PushTest extends TestCase {
.addItem(new Item(new Product("Testprodukt", "", "H87", new BigDecimal(19)).addAllowance(new Allowance(BigDecimal.ONE)), new BigDecimal(500.0), qty).addAllowance(new Allowance(new BigDecimal(300)).setTaxPercent(new BigDecimal(19))))
.addAllowance(new Allowance(new BigDecimal(600)).setTaxPercent(new BigDecimal(19)))
);
String theXML = new String(ze.getProvider().getXML());
String theXML = new String(ze.getProvider().getXML(), StandardCharsets.UTF_8);
assertTrue(theXML.contains("<rsm:CrossIndustryInvoice"));
ze.export(TARGET_ALLOWANCESPDF);
} catch (IOException e) {
@@ -744,7 +744,7 @@ public class ZF2PushTest extends TestCase {
.addItem(new Item(new Product("Testprodukt", "", "H87", new BigDecimal(19)), price, new BigDecimal(1.0))).addCharge(new Charge().setPercent(new BigDecimal(50)).setTaxPercent(new BigDecimal(19)).setReasonCode("ABK"))
.addAllowance(new Allowance().setPercent(new BigDecimal(50)).setTaxPercent(new BigDecimal(19)).setReason("Mengenrabatt"))
);
String theXML = new String(ze.getProvider().getXML());
String theXML = new String(ze.getProvider().getXML(), StandardCharsets.UTF_8);
assertTrue(theXML.contains("<rsm:CrossIndustryInvoice"));
ze.export(TARGET_RELATIVECHARGESALLOWANCESPDF);
} catch (IOException e) {
@@ -794,7 +794,7 @@ public class ZF2PushTest extends TestCase {
.addItem(new Item(new Product("Testprodukt", "", "H87", new BigDecimal(19)), price, qty))
.addItem(new Item(new Product("Testprodukt", "", "H87", new BigDecimal(19)), price, qty)).setCorrection("0815");
ze.setTransaction(i);
String theXML = new String(ze.getProvider().getXML());
String theXML = new String(ze.getProvider().getXML(), StandardCharsets.UTF_8);
assertTrue(theXML.contains("<rsm:CrossIndustryInvoice"));
ze.export(TARGET_CORRECTIONPDF);
} catch (IOException e) {
@@ -845,7 +845,7 @@ public class ZF2PushTest extends TestCase {
.addItem(new Item(new Product("Testprodukt", "", "H87", new BigDecimal(19)), price, qty))
.addItem(new Item(new Product("Testprodukt", "", "H87", new BigDecimal(19)), price, qty)).setCreditNote();
ze.setTransaction(i);
String theXML = new String(ze.getProvider().getXML());
String theXML = new String(ze.getProvider().getXML(), StandardCharsets.UTF_8);
assertTrue(theXML.contains("<rsm:CrossIndustryInvoice"));
ze.export(TARGET_CREDITNOTEPDF);
} catch (IOException e) {
@@ -905,7 +905,7 @@ public class ZF2PushTest extends TestCase {
.setInvoiceReferencedDocumentID("");
zf2p.generateXML(i);
String theXML = new String(zf2p.getXML());
String theXML = new String(zf2p.getXML(), StandardCharsets.UTF_8);
assertFalse(theXML.contains("<ram:SellerOrderReferencedDocument"));
assertFalse(theXML.contains("<ram:BuyerOrderReferencedDocument"));
@@ -921,7 +921,7 @@ public class ZF2PushTest extends TestCase {
.setInvoiceReferencedDocumentID(" ");
zf2p.generateXML(i);
theXML = new String(zf2p.getXML());
theXML = new String(zf2p.getXML(), StandardCharsets.UTF_8);
assertFalse(theXML.contains("<ram:SellerOrderReferencedDocument"));
assertFalse(theXML.contains("<ram:BuyerOrderReferencedDocument"));

View File

@@ -24,6 +24,7 @@ package org.mustangproject.ZUGFeRD;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
@@ -175,7 +176,7 @@ public class ZF2Test extends MustangReaderTestCase {
.load(SOURCE_PDF)) {
ze.setTransaction(this);
final String theXML = new String(ze.getProvider().getXML());
final String theXML = new String(ze.getProvider().getXML(), StandardCharsets.UTF_8);
assertTrue(theXML.contains("<rsm:CrossIndustryInvoice"));
ze.export(TARGET_PDF);
} catch (final IOException e) {