KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > jivesoftware > smackx > provider > VCardProvider


1 /**
2  * $RCSfile$
3  * $Revision: 2508 $
4  * $Date: 2005-07-19 19:56:08 -0300 (Tue, 19 Jul 2005) $
5  *
6  * Copyright 2003-2004 Jive Software.
7  *
8  * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  */

20
21 package org.jivesoftware.smackx.provider;
22
23 import org.jivesoftware.smack.packet.IQ;
24 import org.jivesoftware.smack.provider.IQProvider;
25 import org.jivesoftware.smackx.packet.VCard;
26 import org.w3c.dom.*;
27 import org.xmlpull.v1.XmlPullParser;
28 import org.xmlpull.v1.XmlPullParserException;
29
30 import javax.xml.parsers.DocumentBuilder JavaDoc;
31 import javax.xml.parsers.DocumentBuilderFactory JavaDoc;
32 import java.io.ByteArrayInputStream JavaDoc;
33 import java.io.IOException JavaDoc;
34
35 /**
36  * Created by IntelliJ IDEA.
37  * User: Gaston
38  * Date: Jun 18, 2005
39  * Time: 1:00:57 AM
40  * To change this template use File | Settings | File Templates.
41  */

42 public class VCardProvider implements IQProvider {
43
44   public IQ parseIQ(XmlPullParser parser) throws Exception JavaDoc {
45       StringBuffer JavaDoc sb = new StringBuffer JavaDoc();
46       try {
47           int event = parser.getEventType();
48           // get the content
49
while (true) {
50               switch (event) {
51                   case XmlPullParser.TEXT:
52                       sb.append(parser.getText());
53                       break;
54                   case XmlPullParser.START_TAG:
55                       sb.append('<' + parser.getName() + '>');
56                       break;
57                   case XmlPullParser.END_TAG:
58                       sb.append("</" + parser.getName() + '>');
59                       break;
60                   default:
61               }
62
63               if (event == XmlPullParser.END_TAG && "vCard".equals(parser.getName())) break;
64
65               event = parser.next();
66           }
67       } catch (XmlPullParserException e) {
68           e.printStackTrace();
69       } catch (IOException JavaDoc e) {
70           e.printStackTrace();
71       }
72
73       String JavaDoc xmlText = sb.toString();
74       VCard vCard = new VCard();
75       try {
76           DocumentBuilderFactory JavaDoc documentBuilderFactory = DocumentBuilderFactory.newInstance();
77           DocumentBuilder JavaDoc documentBuilder = documentBuilderFactory.newDocumentBuilder();
78           Document document = documentBuilder.parse(new ByteArrayInputStream JavaDoc(xmlText.getBytes()));
79
80           new VCardReader(vCard, document).initializeFields();
81
82       } catch (Exception JavaDoc e) {
83           e.printStackTrace(System.err);
84       }
85       return vCard;
86   }
87
88     private class VCardReader {
89         private final VCard vCard;
90         private final Document document;
91
92         VCardReader(VCard vCard, Document document) {
93             this.vCard = vCard;
94             this.document = document;
95         }
96
97         public void initializeFields() {
98             vCard.setFirstName(getTagContents("GIVEN"));
99             vCard.setLastName(getTagContents("FAMILY"));
100             vCard.setMiddleName(getTagContents("MIDDLE"));
101
102             setupEmails();
103
104             vCard.setOrganization(getTagContents("ORGNAME"));
105             vCard.setOrganizationUnit(getTagContents("ORGUNIT"));
106
107             setupSimpleFields();
108             setupPhones("WORK", true);
109             setupPhones("HOME", false);
110
111             setupAddress("WORK", true);
112             setupAddress("HOME", false);
113         }
114
115         private void setupEmails() {
116             NodeList nodes = document.getElementsByTagName("USERID");
117             for (int i = 0; i < nodes.getLength(); i++) {
118                 Element element = (Element) nodes.item(i);
119                 if ("WORK".equals(element.getParentNode().getFirstChild().getNodeName())) {
120                     vCard.setEmailWork(getTextContent(element));
121                 } else {
122                     vCard.setEmailHome(getTextContent(element));
123                 }
124             }
125         }
126
127         private void setupPhones(String JavaDoc type, boolean work) {
128             NodeList allPhones = document.getElementsByTagName("TEL");
129             for (int i = 0; i < allPhones.getLength(); i++) {
130                 Element node = (Element) allPhones.item(i);
131                 if (type.equals(node.getChildNodes().item(1).getNodeName())) {
132                     String JavaDoc code = node.getFirstChild().getNodeName();
133                     String JavaDoc value = getTextContent(node.getChildNodes().item(2));
134                     if (work) {
135                         vCard.setPhoneWork(code, value);
136                     }
137                     else {
138                         vCard.setPhoneHome(code, value);
139                     }
140                 }
141             }
142         }
143
144         private void setupAddress(String JavaDoc type, boolean work) {
145             NodeList allAddresses = document.getElementsByTagName("ADR");
146             for (int i = 0; i < allAddresses.getLength(); i++) {
147                 Element node = (Element) allAddresses.item(i);
148                 NodeList childNodes = node.getChildNodes();
149                 if (type.equals(childNodes.item(0).getNodeName())) {
150                     for (int j = 1; j < childNodes.getLength(); j++) {
151                         Node item = childNodes.item(j);
152                         if (item instanceof Element) {
153                             if (work) {
154                                 vCard.setAddressFieldWork(item.getNodeName(), getTextContent(item));
155                             }
156                             else {
157                                 vCard.setAddressFieldHome(item.getNodeName(), getTextContent(item));
158                             }
159                         }
160                     }
161                 }
162             }
163         }
164
165         private String JavaDoc getTagContents(String JavaDoc tag) {
166             NodeList nodes = document.getElementsByTagName(tag);
167             if (nodes.getLength() == 1) {
168                 return getTextContent(nodes.item(0));
169             }
170             return null;
171         }
172
173         private void setupSimpleFields() {
174             NodeList childNodes = document.getDocumentElement().getChildNodes();
175             for (int i = 0; i < childNodes.getLength(); i++) {
176                 Node node = childNodes.item(i);
177                 if (node instanceof Element) {
178                     Element element = (Element) node;
179                     if ("FN".equals(element.getNodeName())) continue;
180
181                     if (element.getChildNodes().getLength() == 0) {
182                         vCard.setField(element.getNodeName(), "");
183                     } else if (element.getChildNodes().getLength() == 1 &&
184                             element.getChildNodes().item(0) instanceof Text) {
185                         vCard.setField(element.getNodeName(), getTextContent(element));
186                     }
187                 }
188             }
189         }
190
191         private String JavaDoc getTextContent(Node node) {
192             StringBuffer JavaDoc result = new StringBuffer JavaDoc();
193             appendText(result, node);
194             return result.toString();
195         }
196
197         private void appendText(StringBuffer JavaDoc result, Node node) {
198             NodeList childNodes = node.getChildNodes();
199             for (int i = 0; i < childNodes.getLength(); i++) {
200                 Node nd = childNodes.item(i);
201                 String JavaDoc nodeValue = nd.getNodeValue();
202                 if (nodeValue != null) {
203                     result.append(nodeValue);
204                 }
205                 appendText(result, nd);
206             }
207         }
208     }
209 }
210
Popular Tags