01: package org.jical;
02:
03: //import java.io.InputStreamReader;
04: //import java.io.FileInputStream;
05: //import java.util.Iterator;
06: import java.util.Map;
07: import java.util.regex.Matcher;
08: import java.util.regex.Pattern;
09:
10: public class ContentLineParser {
11:
12: private static final String RR_ALPHA = "A-Za-z";
13: private static final String RR_DIGIT = "0-9";
14: private static final String RR_DQUOTE = "\\\"";
15: private static final String RR_WSP = " \\t";
16: private static final String RR_CTL = "\\x00-\\x08\\x0A-\\x1F\\x7F";
17: private static final String RR_SEP = ";:,";
18:
19: private static final String R_QSAFE_CHAR = "[^" + RR_CTL
20: + RR_DQUOTE + "]";
21: private static final String R_SAFE_CHAR = "[^" + RR_CTL + RR_DQUOTE
22: + RR_SEP + "]";
23: private static final String R_VALUE_CHAR = "[^" + RR_CTL + "]";
24: private static final String R_NAME_CHAR = "[\\-" + RR_ALPHA
25: + RR_DIGIT + "]";
26:
27: private static final String RC_PARAM_VALUE = "(?:(?:" + RR_DQUOTE
28: + "(" + R_QSAFE_CHAR + "*)" + RR_DQUOTE + ")|("
29: + R_SAFE_CHAR + "*))";
30: private static final String RC_PARAM = "(" + R_NAME_CHAR + "*)="
31: + RC_PARAM_VALUE + "[;:]";
32: private static final String RC_NAME = "(" + R_NAME_CHAR + "*)[;:]";
33:
34: private static final Pattern NAME_PATTERN = Pattern
35: .compile(RC_NAME);
36: private static final Pattern PARAM_PATTERN = Pattern
37: .compile(RC_PARAM);
38:
39: public static ContentLine parse(CharSequence cs) {
40: Matcher nameMatcher = NAME_PATTERN.matcher(cs);
41: Matcher paramMatcher = PARAM_PATTERN.matcher(cs);
42: int start = 0;
43: if (nameMatcher.find(start)) {
44: MutableContentLine contentLine = new MutableContentLine();
45: {
46: contentLine.setRawLine(cs.toString());
47: }
48: {
49: contentLine.setName(nameMatcher.group(1));
50: start = nameMatcher.end();
51: }
52: if (cs.charAt(start - 1) == ';') {
53: Map params = contentLine.getMutableParameters();
54: while (paramMatcher.find(start)) {
55: String key = paramMatcher.group(1);
56: String val = paramMatcher.group(2);
57: if (val == null) {
58: val = paramMatcher.group(3);
59: }
60: params.put(key, val);
61: start = paramMatcher.end();
62: }
63: }
64: {
65: contentLine.setValue(cs.subSequence(start, cs.length())
66: .toString());
67: }
68: return contentLine;
69: }
70: return null;
71: }
72: }
|