Skip to content

Commit 7b6afbb

Browse files
author
Niall Pemberton
committed
Refactor the calculateRawEncoding() & calculateHttpEncoding() methods to make them easier to understand
git-svn-id: https://svn.apache.org/repos/asf/commons/proper/io/trunk@1004517 13f79535-47bb-0310-9956-ffa450edef68
1 parent 7264eea commit 7b6afbb

1 file changed

Lines changed: 63 additions & 48 deletions

File tree

src/main/java/org/apache/commons/io/input/XmlStreamReader.java

Lines changed: 63 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -484,18 +484,21 @@ private void doHttpStream(InputStream is, String httpContentType,
484484
*/
485485
private String calculateRawEncoding(String bomEnc, String xmlGuessEnc,
486486
String xmlEnc) throws IOException {
487-
String encoding;
487+
488+
// BOM is Null
488489
if (bomEnc == null) {
489490
if (xmlGuessEnc == null || xmlEnc == null) {
490-
encoding = (defaultEncoding == null) ? UTF_8 : defaultEncoding;
491-
} else if (xmlEnc.equals(UTF_16)
492-
&& (xmlGuessEnc.equals(UTF_16BE) || xmlGuessEnc
493-
.equals(UTF_16LE))) {
494-
encoding = xmlGuessEnc;
495-
} else {
496-
encoding = xmlEnc;
491+
return (defaultEncoding == null ? UTF_8 : defaultEncoding);
492+
}
493+
if (xmlEnc.equals(UTF_16) &&
494+
(xmlGuessEnc.equals(UTF_16BE) || xmlGuessEnc.equals(UTF_16LE))) {
495+
return xmlGuessEnc;
497496
}
498-
} else if (bomEnc.equals(UTF_8)) {
497+
return xmlEnc;
498+
}
499+
500+
// BOM is UTF-8
501+
if (bomEnc.equals(UTF_8)) {
499502
if (xmlGuessEnc != null && !xmlGuessEnc.equals(UTF_8)) {
500503
String msg = MessageFormat.format(RAW_EX_1, new Object[] { bomEnc, xmlGuessEnc, xmlEnc });
501504
throw new XmlStreamReaderException(msg, bomEnc, xmlGuessEnc, xmlEnc);
@@ -504,23 +507,25 @@ private String calculateRawEncoding(String bomEnc, String xmlGuessEnc,
504507
String msg = MessageFormat.format(RAW_EX_1, new Object[] { bomEnc, xmlGuessEnc, xmlEnc });
505508
throw new XmlStreamReaderException(msg, bomEnc, xmlGuessEnc, xmlEnc);
506509
}
507-
encoding = UTF_8;
508-
} else if (bomEnc.equals(UTF_16BE) || bomEnc.equals(UTF_16LE)) {
510+
return bomEnc;
511+
}
512+
513+
// BOM is UTF-16BE or UTF-16LE
514+
if (bomEnc.equals(UTF_16BE) || bomEnc.equals(UTF_16LE)) {
509515
if (xmlGuessEnc != null && !xmlGuessEnc.equals(bomEnc)) {
510516
String msg = MessageFormat.format(RAW_EX_1, new Object[] { bomEnc, xmlGuessEnc, xmlEnc });
511517
throw new IOException(msg);
512518
}
513-
if (xmlEnc != null && !xmlEnc.equals(UTF_16)
514-
&& !xmlEnc.equals(bomEnc)) {
519+
if (xmlEnc != null && !xmlEnc.equals(UTF_16) && !xmlEnc.equals(bomEnc)) {
515520
String msg = MessageFormat.format(RAW_EX_1, new Object[] { bomEnc, xmlGuessEnc, xmlEnc });
516521
throw new XmlStreamReaderException(msg, bomEnc, xmlGuessEnc, xmlEnc);
517522
}
518-
encoding = bomEnc;
519-
} else {
520-
String msg = MessageFormat.format(RAW_EX_2, new Object[] { bomEnc, xmlGuessEnc, xmlEnc });
521-
throw new XmlStreamReaderException(msg, bomEnc, xmlGuessEnc, xmlEnc);
523+
return bomEnc;
522524
}
523-
return encoding;
525+
526+
// BOM is something else
527+
String msg = MessageFormat.format(RAW_EX_2, new Object[] { bomEnc, xmlGuessEnc, xmlEnc });
528+
throw new XmlStreamReaderException(msg, bomEnc, xmlGuessEnc, xmlEnc);
524529
}
525530

526531

@@ -539,42 +544,52 @@ private String calculateRawEncoding(String bomEnc, String xmlGuessEnc,
539544
private String calculateHttpEncoding(String httpContentType,
540545
String bomEnc, String xmlGuessEnc, String xmlEnc,
541546
boolean lenient) throws IOException {
547+
548+
// Lenient and has XML encoding
549+
if (lenient && xmlEnc != null) {
550+
return xmlEnc;
551+
}
552+
553+
// Determine mime/encoding content types from HTTP Content Type
542554
String cTMime = getContentTypeMime(httpContentType);
543555
String cTEnc = getContentTypeEncoding(httpContentType);
544-
String encoding;
545-
if (lenient & xmlEnc != null) {
546-
encoding = xmlEnc;
547-
} else {
548-
boolean appXml = isAppXml(cTMime);
549-
boolean textXml = isTextXml(cTMime);
550-
if (appXml || textXml) {
551-
if (cTEnc == null) {
552-
if (appXml) {
553-
encoding = calculateRawEncoding(bomEnc, xmlGuessEnc, xmlEnc);
554-
} else {
555-
encoding = (defaultEncoding == null) ? US_ASCII
556-
: defaultEncoding;
557-
}
558-
} else if (bomEnc != null
559-
&& (cTEnc.equals(UTF_16BE) || cTEnc.equals(UTF_16LE))) {
560-
String msg = MessageFormat.format(HTTP_EX_1, cTMime, cTEnc, bomEnc, xmlGuessEnc, xmlEnc);
561-
throw new XmlStreamReaderException(msg, cTMime, cTEnc, bomEnc, xmlGuessEnc, xmlEnc);
562-
} else if (cTEnc.equals(UTF_16)) {
563-
if (bomEnc != null && bomEnc.startsWith(UTF_16)) {
564-
encoding = bomEnc;
565-
} else {
566-
String msg = MessageFormat.format(HTTP_EX_2, cTMime, cTEnc, bomEnc, xmlGuessEnc, xmlEnc);
567-
throw new XmlStreamReaderException(msg, cTMime, cTEnc, bomEnc, xmlGuessEnc, xmlEnc);
568-
}
569-
} else {
570-
encoding = cTEnc;
571-
}
556+
boolean appXml = isAppXml(cTMime);
557+
boolean textXml = isTextXml(cTMime);
558+
559+
// Mime type NOT "application/xml" or "text/xml"
560+
if (!appXml && !textXml) {
561+
String msg = MessageFormat.format(HTTP_EX_3, cTMime, cTEnc, bomEnc, xmlGuessEnc, xmlEnc);
562+
throw new XmlStreamReaderException(msg, cTMime, cTEnc, bomEnc, xmlGuessEnc, xmlEnc);
563+
}
564+
565+
// No content type encoding
566+
if (cTEnc == null) {
567+
if (appXml) {
568+
return calculateRawEncoding(bomEnc, xmlGuessEnc, xmlEnc);
572569
} else {
573-
String msg = MessageFormat.format(HTTP_EX_3, cTMime, cTEnc, bomEnc, xmlGuessEnc, xmlEnc);
570+
return (defaultEncoding == null) ? US_ASCII : defaultEncoding;
571+
}
572+
}
573+
574+
// UTF-16BE or UTF-16LE content type encoding
575+
if (cTEnc.equals(UTF_16BE) || cTEnc.equals(UTF_16LE)) {
576+
if (bomEnc != null) {
577+
String msg = MessageFormat.format(HTTP_EX_1, cTMime, cTEnc, bomEnc, xmlGuessEnc, xmlEnc);
574578
throw new XmlStreamReaderException(msg, cTMime, cTEnc, bomEnc, xmlGuessEnc, xmlEnc);
575579
}
580+
return cTEnc;
576581
}
577-
return encoding;
582+
583+
// UTF-16 content type encoding
584+
if (cTEnc.equals(UTF_16)) {
585+
if (bomEnc != null && bomEnc.startsWith(UTF_16)) {
586+
return bomEnc;
587+
}
588+
String msg = MessageFormat.format(HTTP_EX_2, cTMime, cTEnc, bomEnc, xmlGuessEnc, xmlEnc);
589+
throw new XmlStreamReaderException(msg, cTMime, cTEnc, bomEnc, xmlGuessEnc, xmlEnc);
590+
}
591+
592+
return cTEnc;
578593
}
579594

580595
/**

0 commit comments

Comments
 (0)