From 8ac01637a56b8422a6c36cf99d05d4fea651c4b1 Mon Sep 17 00:00:00 2001 From: Arnout Engelen Date: Wed, 3 Feb 2010 20:28:21 +0100 Subject: [PATCH] Refer to non-deprecated RFC's --- .../ical/services/IcalendarValidationService.java | 131 ++++++++++++--------- 1 file changed, 75 insertions(+), 56 deletions(-) diff --git a/src/main/java/net/bzzt/ical/services/IcalendarValidationService.java b/src/main/java/net/bzzt/ical/services/IcalendarValidationService.java index e41d796..524936f 100644 --- a/src/main/java/net/bzzt/ical/services/IcalendarValidationService.java +++ b/src/main/java/net/bzzt/ical/services/IcalendarValidationService.java @@ -30,27 +30,34 @@ import org.apache.log4j.lf5.util.StreamUtils; import org.apache.wicket.markup.html.WebMarkupContainer; public class IcalendarValidationService { - private static final ValidationRuleInfo VALID_CHARSET = new ValidationRuleInfo("4.1.4"); + private static final ValidationRuleInfo VALID_CHARSET_UTF8 = new ValidationRuleInfo( + "3.1.4"); - private static final Log LOG = LogFactory.getLog(IcalendarValidationService.class); + private static final ValidationRuleInfo VALID_CHARSET_PRESENT = new ValidationRuleInfo( + "3.1.4"); - private static final ValidationRuleInfo VALID_CRLF_NEWLINES = new ValidationRuleInfo("4.1"); + private static final Log LOG = LogFactory + .getLog(IcalendarValidationService.class); - public static WebMarkupContainer getValidationResult(String id, InputStream calendarStream, - String charSet) { + private static final ValidationRuleInfo VALID_CRLF_NEWLINES = new ValidationRuleInfo( + "3.1"); - if (charSet == null) - { + public static WebMarkupContainer getValidationResult(String id, + InputStream calendarStream, String charSet) { + CollectingValidationResultHandler validationResultHandler = new CollectingValidationResultHandler(); + ValidationResultHandler.set(validationResultHandler); + + if (charSet == null) { + validationResultHandler.onValidationResult(new ValidationResult( + null, "Specifying the charset in the MIME Content-Type is mandatory", + VALID_CHARSET_PRESENT)); charSet = "utf-8"; } - + // We parse in 'relaxed' mode, so we can report as many errors as // possible when validating CompatibilityHints.setHintEnabled( CompatibilityHints.KEY_RELAXED_PARSING, true); - - CollectingValidationResultHandler validationResultHandler = new CollectingValidationResultHandler(); - ValidationResultHandler.set(validationResultHandler); String calendarString = getCalendarString(calendarStream, charSet); @@ -59,16 +66,18 @@ public class IcalendarValidationService { } catch (ValidationException e) { throw new RuntimeException(e); } - - if (!"utf-8".equals(charSet)) - { - validationResultHandler.onValidationResult(new ValidationResult(null, "Charset was [{0}] instead of utf-8 as recommended", new Object[] { charSet }, VALID_CHARSET)); + + if (!"utf-8".equals(charSet)) { + validationResultHandler.onValidationResult(new ValidationResult( + null, "Charset was [{0}] instead of utf-8 as recommended", + new Object[] { charSet }, VALID_CHARSET_UTF8)); } - + CalendarBuilder builder = new CalendarBuilder(); Calendar calendar; try { - calendar = builder.build(new ByteArrayInputStream(calendarString.getBytes(charSet))); + calendar = builder.build(new ByteArrayInputStream(calendarString + .getBytes(charSet))); } catch (ParserException e1) { return new ParserErrorPanel(id, calendarString, e1); } catch (UnsupportedEncodingException e) { @@ -87,68 +96,75 @@ public class IcalendarValidationService { + e.getMessage(), e); } - return(new ValidationResultOverviewPanel(id, charSet, (List) validationResultHandler - .getResults())); + return (new ValidationResultOverviewPanel(id, charSet, + (List) validationResultHandler.getResults())); } - static String getCalendarString(InputStream calendarStream, - String charSet) { + static String getCalendarString(InputStream calendarStream, String charSet) { try { LOG.info("Getting bytes from calendar stream"); byte[] bytes = StreamUtils.getBytes(calendarStream); - - //new CharsetProvider().charsetForName(charSet); - + + // new CharsetProvider().charsetForName(charSet); + LOG.info("Got bytes from calendar stream"); checkCharset(bytes, charSet); - + return new String(bytes, charSet); } catch (UnsupportedEncodingException e2) { throw new RuntimeException(e2); } catch (IOException e2) { throw new RuntimeException(e2); } - + } private static void checkCharset(byte[] bytes, String charSet) { int offset = 0; int length = 0; - - for (int lineno = 1; ;lineno++) - { + + for (int lineno = 1;; lineno++) { offset = nextLineStart(bytes, offset + length); - if (offset == -1) - { + if (offset == -1) { return; } length = currentLineLength(bytes, offset); - + checkCharset(bytes, charSet, offset, length, lineno); } } - - private static void checkCharset(byte[] bytes, String charSet, int offset, int length, int lineno) - { + private static void checkCharset(byte[] bytes, String charSet, int offset, + int length, int lineno) { CharsetDecoder decoder = Charset.forName(charSet).newDecoder(); decoder.onMalformedInput(CodingErrorAction.REPORT); decoder.onUnmappableCharacter(CodingErrorAction.REPORT); - try - { + try { decoder.decode(ByteBuffer.wrap(bytes, offset, length)); - } - catch (MalformedInputException e) - { + } catch (MalformedInputException e) { try { - ValidationResultHandler.get().onValidationResult(new ValidationResult(null, "Input contains non-[{0}] characters on line {1}", new Object[] { charSet, lineno }, VALID_CHARSET)); + ValidationResultHandler + .get() + .onValidationResult( + new ValidationResult( + null, + "Input contains non-[{0}] characters on line {1}", + new Object[] { charSet, lineno }, + VALID_CHARSET_UTF8)); } catch (ValidationException e1) { throw new RuntimeException(e1); } } catch (CharacterCodingException e) { try { - ValidationResultHandler.get().onValidationResult(new ValidationResult(null, "Input contains non-[{0}] characters on line {1}", new Object[] { charSet, lineno }, VALID_CHARSET)); + ValidationResultHandler + .get() + .onValidationResult( + new ValidationResult( + null, + "Input contains non-[{0}] characters on line {1}", + new Object[] { charSet, lineno }, + VALID_CHARSET_UTF8)); } catch (ValidationException e1) { throw new RuntimeException(e1); } @@ -156,10 +172,8 @@ public class IcalendarValidationService { } private static int nextLineStart(byte[] bytes, int offset) { - while (offset < bytes.length) - { - if (bytes[offset] != '\n' && bytes[offset] != '\r') - { + while (offset < bytes.length) { + if (bytes[offset] != '\n' && bytes[offset] != '\r') { return offset; } offset++; @@ -169,25 +183,30 @@ public class IcalendarValidationService { private static int currentLineLength(byte[] bytes, int offset) { int result = 0; - while (offset < bytes.length && bytes[offset] != '\n' && bytes[offset] != '\r') - { + while (offset < bytes.length && bytes[offset] != '\n' + && bytes[offset] != '\r') { offset++; result++; } return result; } - - private static String fixNewlines(String calendarString) throws ValidationException { - // A calendar may have \n, \r\n or \n\r newlines. All of those should be converted into + + private static String fixNewlines(String calendarString) + throws ValidationException { + // A calendar may have \n, \r\n or \n\r newlines. All of those should be + // converted into // \r\n. String original = calendarString; - - calendarString = calendarString.replaceAll("([^\n])\r([^\n])", "$1\n$2"); + + calendarString = calendarString + .replaceAll("([^\n])\r([^\n])", "$1\n$2"); calendarString = calendarString.replaceAll("\r", ""); calendarString = calendarString.replaceAll("\n", "\r\n"); - if (!original.equals(calendarString)) - { - ValidationResultHandler.get().onValidationResult(new ValidationResult(null, "CRLF should be used for newlines", VALID_CRLF_NEWLINES)); + if (!original.equals(calendarString)) { + ValidationResultHandler.get().onValidationResult( + new ValidationResult(null, + "CRLF should be used for newlines", + VALID_CRLF_NEWLINES)); } return calendarString; } -- 2.11.4.GIT