1 package be
.nikiroo
.jvcard
.parsers
;
3 import java
.util
.Iterator
;
4 import java
.util
.LinkedList
;
7 import be
.nikiroo
.jvcard
.Card
;
8 import be
.nikiroo
.jvcard
.Contact
;
9 import be
.nikiroo
.jvcard
.Data
;
10 import be
.nikiroo
.jvcard
.TypeInfo
;
12 public class Vcard21Parser
{
13 public static List
<Contact
> parse(Iterable
<String
> textData
) {
14 Iterator
<String
> lines
= textData
.iterator();
15 List
<Contact
> contacts
= new LinkedList
<Contact
>();
16 List
<Data
> datas
= null;
18 String nextRawLine
= null;
19 if (lines
.hasNext()) {
20 nextRawLine
= lines
.next();
21 while (lines
.hasNext() && isContinuation(nextRawLine
)) {
22 // BAD INPUT FILE. IGNORE.
24 .println("VCARD Parser warning: CONTINUATION line seen before any data line");
25 nextRawLine
= lines
.next();
29 while (nextRawLine
!= null) {
30 StringBuilder rawLine
= new StringBuilder(nextRawLine
.trim());
32 nextRawLine
= lines
.next();
36 while (isContinuation(nextRawLine
)) {
37 rawLine
.append(nextRawLine
.trim());
39 nextRawLine
= lines
.next();
44 String line
= rawLine
.toString();
45 if (line
.equals("BEGIN:VCARD")) {
46 datas
= new LinkedList
<Data
>();
47 } else if (line
.equals("END:VCARD")) {
49 // BAD INPUT FILE. IGNORE.
51 .println("VCARD Parser warning: END:VCARD seen before any VCARD:BEGIN");
53 contacts
.add(new Contact(datas
));
57 // BAD INPUT FILE. IGNORE.
59 .println("VCARD Parser warning: data seen before any VCARD:BEGIN");
61 List
<TypeInfo
> types
= new LinkedList
<TypeInfo
>();
66 if (line
.contains(":")) {
67 int colIndex
= line
.indexOf(':');
68 String rest
= line
.substring(0, colIndex
);
69 value
= line
.substring(colIndex
+ 1);
71 if (rest
.contains(";")) {
72 String tab
[] = rest
.split(";");
75 for (int i
= 1; i
< tab
.length
; i
++) {
76 if (tab
[i
].contains("=")) {
77 int equIndex
= tab
[i
].indexOf('=');
79 .substring(0, equIndex
);
80 String tvalue
= tab
[i
]
81 .substring(equIndex
+ 1);
82 types
.add(new TypeInfo(tname
, tvalue
));
84 types
.add(new TypeInfo(tab
[i
], ""));
94 if (name
.contains(".")) {
95 int dotIndex
= name
.indexOf('.');
96 group
= name
.substring(0, dotIndex
);
97 name
= name
.substring(dotIndex
+ 1);
100 datas
.add(new Data(types
, name
, value
, group
));
109 public static String
toString(Contact contact
, int startingBKey
) {
110 StringBuilder builder
= new StringBuilder();
112 builder
.append("BEGIN:VCARD");
113 builder
.append("\r\n");
114 builder
.append("VERSION:2.1");
115 builder
.append("\r\n");
116 for (int indexData
= 0; indexData
< contact
.size(); indexData
++) {
117 Data data
= contact
.get(indexData
);
118 if (data
.getGroup() != null && !data
.getGroup().trim().equals("")) {
119 builder
.append(data
.getGroup().trim());
122 builder
.append(data
.getName());
123 for (int indexType
= 0; indexType
< data
.size(); indexType
++) {
124 TypeInfo type
= data
.get(indexType
);
126 builder
.append(type
.getName());
127 if (type
.getValue() != null
128 && !type
.getValue().trim().equals("")) {
130 builder
.append(type
.getValue());
136 builder
.append(data
.getValue());
137 builder
.append("\r\n");
139 builder
.append("END:VCARD");
140 builder
.append("\r\n");
142 return builder
.toString();
145 public static String
toString(Card card
) {
146 StringBuilder builder
= new StringBuilder();
148 for (int index
= 0; index
< card
.size(); index
++) {
149 builder
.append(toString(card
.get(index
), -1));
152 builder
.append("\r\n");
154 return builder
.toString();
158 * Check if the given line is a continuation line or not.
163 * @return TRUE if the line is a continuation line
165 private static boolean isContinuation(String line
) {
166 if (line
!= null && line
.length() > 0)
167 return (line
.charAt(0) == ' ' || line
.charAt(0) == '\t');