KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > columba > ristretto > imap > parser > NamespaceParser


1 /* ***** BEGIN LICENSE BLOCK *****
2  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3  *
4  * The contents of this file are subject to the Mozilla Public License Version
5  * 1.1 (the "License"); you may not use this file except in compliance with
6  * the License. You may obtain a copy of the License at
7  * http://www.mozilla.org/MPL/
8  *
9  * Software distributed under the License is distributed on an "AS IS" basis,
10  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11  * for the specific language governing rights and limitations under the
12  * License.
13  *
14  * The Original Code is Ristretto Mail API.
15  *
16  * The Initial Developers of the Original Code are
17  * Timo Stich and Frederik Dietz.
18  * Portions created by the Initial Developers are Copyright (C) 2004
19  * All Rights Reserved.
20  *
21  * Contributor(s):
22  *
23  * Alternatively, the contents of this file may be used under the terms of
24  * either the GNU General Public License Version 2 or later (the "GPL"), or
25  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26  * in which case the provisions of the GPL or the LGPL are applicable instead
27  * of those above. If you wish to allow use of your version of this file only
28  * under the terms of either the GPL or the LGPL, and not to allow others to
29  * use your version of this file under the terms of the MPL, indicate your
30  * decision by deleting the provisions above and replace them with the notice
31  * and other provisions required by the GPL or the LGPL. If you do not delete
32  * the provisions above, a recipient may use your version of this file under
33  * the terms of any one of the MPL, the GPL or the LGPL.
34  *
35  * ***** END LICENSE BLOCK ***** */

36 package org.columba.ristretto.imap.parser;
37
38 import java.util.ArrayList JavaDoc;
39 import java.util.List JavaDoc;
40 import java.util.regex.Matcher JavaDoc;
41 import java.util.regex.Pattern JavaDoc;
42
43 import org.columba.ristretto.imap.IMAPResponse;
44 import org.columba.ristretto.imap.Namespace;
45 import org.columba.ristretto.imap.NamespaceCollection;
46 import org.columba.ristretto.parser.ParserException;
47
48 /**
49  * Parser for the Namespace response.
50  *
51  * @author tstich
52  */

53 public class NamespaceParser {
54
55     // regexp for the namespace
56
private static final Pattern JavaDoc namespacePattern = Pattern.compile("\\(" + // start
57
// with
58
// (
59
"\"([^\"]*)\"" + // read the reference in "(group1)"
60
"\\s" + // and now comes a WS
61
"\"([^\"]*)\"" + // read the delimiter in "(group2)"
62
"(\\s\"([^\"]*)\"" + // optional extensionName in group4
63
"\\s\\(([^\\)]*)\\))?" + // extensionParameters in group5
64
"\\)"); // end with )
65

66     private static final Pattern JavaDoc quotedPattern = Pattern
67             .compile("\"([^\"]*)\"\\s?"); // match a quoted string "(group1)"
68

69     /**
70      * Parse the Namespace of the IMAP response.
71      *
72      * @param response
73      * @return the NamespaceCollection
74      * @throws ParserException
75      */

76     public static final NamespaceCollection parse(IMAPResponse response)
77             throws ParserException {
78         return parse(response.getResponseMessage());
79     }
80
81     /**
82      * Parse the Namespace of the IMAP response.
83      *
84      * @param input
85      * @return the NamespaceCollection
86      * @throws ParserException
87      */

88     public static final NamespaceCollection parse(String JavaDoc input)
89             throws ParserException {
90         NamespaceCollection result = new NamespaceCollection();
91
92         // First we tokenize the response in the three parts for personal, other
93
// users and shared
94
String JavaDoc[] parts = tokenizeParts(input);
95
96         // parse the three parts personal, other users and shared
97
for (int i = 0; i < 3; i++) {
98             String JavaDoc part = parts[i];
99
100             //check for nil
101
if (part.equalsIgnoreCase("nil")) {
102                 result.addNamespace(i, new Namespace(null, null));
103             } else {
104                 // parse the namespace(s)
105
Matcher JavaDoc namespaceMatcher = namespacePattern.matcher(part);
106
107                 while (namespaceMatcher.find()) {
108                     Namespace ns = new Namespace(namespaceMatcher.group(1),
109                             namespaceMatcher.group(2));
110
111                     // if there is an extension then add it to the object
112
if (namespaceMatcher.group(4) != null) {
113                         ns.setExtensionName(namespaceMatcher.group(4));
114
115                         // parse the parameterlist
116
List JavaDoc parameterList = new ArrayList JavaDoc();
117                         Matcher JavaDoc parameterMatcher = quotedPattern
118                                 .matcher(namespaceMatcher.group(5));
119                         while (parameterMatcher.find()) {
120                             parameterList.add(parameterMatcher.group(1));
121                         }
122
123                         // add it as a String[] to the namespace
124
ns.setExtensionParameter((String JavaDoc[]) parameterList
125                                 .toArray(new String JavaDoc[0]));
126                     }
127
128                     result.addNamespace(i, ns);
129                 }
130             }
131         }
132
133         return result;
134     }
135
136     private static String JavaDoc[] tokenizeParts(String JavaDoc input) throws ParserException {
137         String JavaDoc[] result = new String JavaDoc[3];
138         int start = 0;
139         int end = -1;
140
141         for (int i = 0; i < 3; i++) {
142             if (input.charAt(start) == '(') {
143                 end = ParenthesisParser.getClosingPos(input, start);
144
145                 // strip the leading and closing parenthesis
146
result[i] = input.substring(start + 1, end);
147             } else {
148                 end = start + 2;
149                 result[i] = "NIL";
150             }
151             start = end + 1;
152
153             // skip the WS
154
if( input.length() > start && input.charAt(start) == ' ') {
155                 start ++;
156             }
157         }
158
159         return result;
160     }
161
162 }
Popular Tags