1.1 --- a/src/net/fortuna/ical4j/data/CalendarParserImpl.java Tue Feb 10 19:25:00 2015 +0100 1.2 +++ b/src/net/fortuna/ical4j/data/CalendarParserImpl.java Tue Feb 10 19:38:00 2015 +0100 1.3 @@ -177,7 +177,7 @@ 1.4 else { 1.5 propertyParser.parse(tokeniser, in, handler); 1.6 } 1.7 - absorbWhitespace(tokeniser); 1.8 + absorbWhitespace(tokeniser, in); 1.9 // assertToken(tokeniser, StreamTokenizer.TT_WORD); 1.10 } 1.11 } 1.12 @@ -228,10 +228,9 @@ 1.13 // text = *(TSAFE-CHAR / ":" / DQUOTE / ESCAPED-CHAR) 1.14 // 1.15 tokeniser.ordinaryChar('"'); 1.16 - int nextToken = tokeniser.nextToken(); 1.17 + int nextToken = nextToken(tokeniser, in); 1.18 1.19 - while (nextToken != StreamTokenizer.TT_EOL 1.20 - && nextToken != StreamTokenizer.TT_EOF) { 1.21 + while (nextToken != StreamTokenizer.TT_EOL) { 1.22 1.23 if (tokeniser.ttype == StreamTokenizer.TT_WORD) { 1.24 value.append(tokeniser.sval); 1.25 @@ -240,17 +239,12 @@ 1.26 value.append((char) tokeniser.ttype); 1.27 } 1.28 1.29 - nextToken = tokeniser.nextToken(); 1.30 + nextToken = nextToken(tokeniser, in); 1.31 } 1.32 1.33 // reset DQUOTE to be quote char 1.34 tokeniser.quoteChar('"'); 1.35 1.36 - if (nextToken == StreamTokenizer.TT_EOF) { 1.37 - throw new ParserException("Unexpected end of file", 1.38 - getLineNumber(tokeniser, in)); 1.39 - } 1.40 - 1.41 try { 1.42 handler.propertyValue(value.toString()); 1.43 } 1.44 @@ -279,7 +273,7 @@ 1.45 final ContentHandler handler) throws IOException, ParserException, 1.46 URISyntaxException { 1.47 1.48 - while (tokeniser.nextToken() == ';') { 1.49 + while (nextToken(tokeniser, in) == ';') { 1.50 paramParser.parse(tokeniser, in, handler); 1.51 } 1.52 } 1.53 @@ -312,7 +306,7 @@ 1.54 final StringBuffer paramValue = new StringBuffer(); 1.55 1.56 // preserve quote chars.. 1.57 - if (tokeniser.nextToken() == '"') { 1.58 + if (nextToken(tokeniser, in) == '"') { 1.59 paramValue.append('"'); 1.60 paramValue.append(tokeniser.sval); 1.61 paramValue.append('"'); 1.62 @@ -320,7 +314,7 @@ 1.63 else if (tokeniser.sval != null) { 1.64 paramValue.append(tokeniser.sval); 1.65 // check for additional words to account for equals (=) in param-value 1.66 - int nextToken = tokeniser.nextToken(); 1.67 + int nextToken = nextToken(tokeniser, in); 1.68 1.69 while (nextToken != ';' && nextToken != ':' && nextToken != ',') { 1.70 1.71 @@ -331,7 +325,7 @@ 1.72 paramValue.append((char) tokeniser.ttype); 1.73 } 1.74 1.75 - nextToken = tokeniser.nextToken(); 1.76 + nextToken = nextToken(tokeniser, in); 1.77 } 1.78 tokeniser.pushBack(); 1.79 } else if(tokeniser.sval == null) { 1.80 @@ -363,7 +357,7 @@ 1.81 1.82 while (Component.BEGIN.equals(tokeniser.sval)) { 1.83 componentParser.parse(tokeniser, in, handler); 1.84 - absorbWhitespace(tokeniser); 1.85 + absorbWhitespace(tokeniser, in); 1.86 // assertToken(tokeniser, StreamTokenizer.TT_WORD); 1.87 } 1.88 } 1.89 @@ -429,7 +423,7 @@ 1.90 private void assertToken(final StreamTokenizer tokeniser, Reader in, final int token) 1.91 throws IOException, ParserException { 1.92 1.93 - if (tokeniser.nextToken() != token) { 1.94 + if (nextToken(tokeniser, in) != token) { 1.95 throw new ParserException(MessageFormat.format(UNEXPECTED_TOKEN_MESSAGE, new Object[] { 1.96 new Integer(token), new Integer(tokeniser.ttype), 1.97 }), getLineNumber(tokeniser, in)); 1.98 @@ -489,9 +483,9 @@ 1.99 * @param tokeniser 1.100 * @throws IOException 1.101 */ 1.102 - private void absorbWhitespace(final StreamTokenizer tokeniser) throws IOException { 1.103 + private void absorbWhitespace(final StreamTokenizer tokeniser, Reader in) throws IOException, ParserException { 1.104 // HACK: absorb extraneous whitespace between components (KOrganizer).. 1.105 - while (tokeniser.nextToken() == StreamTokenizer.TT_EOL) { 1.106 + while (nextToken(tokeniser, in) == StreamTokenizer.TT_EOL) { 1.107 if (log.isTraceEnabled()) { 1.108 log.trace("Absorbing extra whitespace.."); 1.109 } 1.110 @@ -518,4 +512,20 @@ 1.111 } 1.112 return line; 1.113 } 1.114 + 1.115 + /** 1.116 + * Reads the next token from the tokeniser. 1.117 + * This method throws a ParseException when reading EOF. 1.118 + * @param tokeniser 1.119 + * @param in 1.120 + * @return 1.121 + * @throws ParseException When reading EOF. 1.122 + */ 1.123 + private int nextToken(StreamTokenizer tokeniser, Reader in) throws IOException, ParserException { 1.124 + int token = tokeniser.nextToken(); 1.125 + if (token == StreamTokenizer.TT_EOF) { 1.126 + throw new ParserException("Unexpected end of file", getLineNumber(tokeniser, in)); 1.127 + } 1.128 + return token; 1.129 + } 1.130 }