1d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
2d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * $RCSfile$
3d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * $Revision$
4d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * $Date$
5d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
6d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Copyright 2003-2007 Jive Software.
7d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
8d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License");
9d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * you may not use this file except in compliance with the License.
10d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * You may obtain a copy of the License at
11d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
12d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *     http://www.apache.org/licenses/LICENSE-2.0
13d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
14d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Unless required by applicable law or agreed to in writing, software
15d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * distributed under the License is distributed on an "AS IS" BASIS,
16d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * See the License for the specific language governing permissions and
18d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * limitations under the License.
19d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
20d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
21d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpackage org.jivesoftware.smackx.provider;
22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smack.packet.IQ;
24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smack.provider.IQProvider;
25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smack.util.StringUtils;
26d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smackx.packet.VCard;
27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.w3c.dom.*;
28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.xmlpull.v1.XmlPullParser;
29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.xmlpull.v1.XmlPullParserException;
30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport javax.xml.parsers.DocumentBuilder;
32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport javax.xml.parsers.DocumentBuilderFactory;
33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.io.ByteArrayInputStream;
34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.io.IOException;
35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.ArrayList;
36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.List;
37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * vCard provider.
40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @author Gaston Dombiak
42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @author Derek DeMoro
43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic class VCardProvider implements IQProvider {
45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private static final String PREFERRED_ENCODING = "UTF-8";
47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public IQ parseIQ(XmlPullParser parser) throws Exception {
49d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        final StringBuilder sb = new StringBuilder();
50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        try {
51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            int event = parser.getEventType();
52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            // get the content
53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            while (true) {
54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                switch (event) {
55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    case XmlPullParser.TEXT:
56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                        // We must re-escape the xml so that the DOM won't throw an exception
57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                        sb.append(StringUtils.escapeForXML(parser.getText()));
58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                        break;
59d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    case XmlPullParser.START_TAG:
60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                        sb.append('<').append(parser.getName()).append('>');
61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                        break;
62d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    case XmlPullParser.END_TAG:
63d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                        sb.append("</").append(parser.getName()).append('>');
64d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                        break;
65d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    default:
66d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
67d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
68d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                if (event == XmlPullParser.END_TAG && "vCard".equals(parser.getName())) break;
69d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
70d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                event = parser.next();
71d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
72d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
73d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        catch (XmlPullParserException e) {
74d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            e.printStackTrace();
75d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
76d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        catch (IOException e) {
77d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            e.printStackTrace();
78d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
79d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
80d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        String xmlText = sb.toString();
81d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return createVCardFromXML(xmlText);
82d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
83d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
84d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
85d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Builds a users vCard from xml file.
86d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
87d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @param xml the xml representing a users vCard.
88d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @return the VCard.
89d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @throws Exception if an exception occurs.
90d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
91d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public static VCard createVCardFromXML(String xml) throws Exception {
92d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        VCard vCard = new VCard();
93d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
94d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
95d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
96d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        Document document = documentBuilder.parse(
97d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                new ByteArrayInputStream(xml.getBytes(PREFERRED_ENCODING)));
98d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
99d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        new VCardReader(vCard, document).initializeFields();
100d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return vCard;
101d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
102d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
103d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private static class VCardReader {
104d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
105d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        private final VCard vCard;
106d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        private final Document document;
107d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
108d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        VCardReader(VCard vCard, Document document) {
109d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            this.vCard = vCard;
110d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            this.document = document;
111d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
112d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
113d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        public void initializeFields() {
114d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            vCard.setFirstName(getTagContents("GIVEN"));
115d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            vCard.setLastName(getTagContents("FAMILY"));
116d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            vCard.setMiddleName(getTagContents("MIDDLE"));
117d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            setupPhoto();
118d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
119d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            setupEmails();
120d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
121d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            vCard.setOrganization(getTagContents("ORGNAME"));
122d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            vCard.setOrganizationUnit(getTagContents("ORGUNIT"));
123d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
124d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            setupSimpleFields();
125d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
126d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            setupPhones();
127d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            setupAddresses();
128d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
129d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
130d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        private void setupPhoto() {
131d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            String binval = null;
132d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            String mimetype = null;
133d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
134d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            NodeList photo = document.getElementsByTagName("PHOTO");
135d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            if (photo.getLength() != 1)
136d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                return;
137d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
138d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            Node photoNode = photo.item(0);
139d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            NodeList childNodes = photoNode.getChildNodes();
140d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
141d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            int childNodeCount = childNodes.getLength();
142d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            List<Node> nodes = new ArrayList<Node>(childNodeCount);
143d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            for (int i = 0; i < childNodeCount; i++)
144d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                nodes.add(childNodes.item(i));
145d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
146d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            String name = null;
147d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            String value = null;
148d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            for (Node n : nodes) {
149d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                name = n.getNodeName();
150d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                value = n.getTextContent();
151d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                if (name.equals("BINVAL")) {
152d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    binval = value;
153d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
154d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                else if (name.equals("TYPE")) {
155d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    mimetype = value;
156d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
157d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
158d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
159d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            if (binval == null || mimetype == null)
160d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                return;
161d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
162d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            vCard.setAvatar(binval, mimetype);
163d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
164d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
165d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        private void setupEmails() {
166d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            NodeList nodes = document.getElementsByTagName("USERID");
167d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            if (nodes == null) return;
168d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            for (int i = 0; i < nodes.getLength(); i++) {
169d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                Element element = (Element) nodes.item(i);
170d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                if ("WORK".equals(element.getParentNode().getFirstChild().getNodeName())) {
171d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    vCard.setEmailWork(getTextContent(element));
172d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
173d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                else {
174d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    vCard.setEmailHome(getTextContent(element));
175d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
176d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
177d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
178d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
179d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        private void setupPhones() {
180d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            NodeList allPhones = document.getElementsByTagName("TEL");
181d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            if (allPhones == null) return;
182d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            for (int i = 0; i < allPhones.getLength(); i++) {
183d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                NodeList nodes = allPhones.item(i).getChildNodes();
184d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                String type = null;
185d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                String code = null;
186d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                String value = null;
187d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                for (int j = 0; j < nodes.getLength(); j++) {
188d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    Node node = nodes.item(j);
189d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    if (node.getNodeType() != Node.ELEMENT_NODE) continue;
190d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    String nodeName = node.getNodeName();
191d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    if ("NUMBER".equals(nodeName)) {
192d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                        value = getTextContent(node);
193d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    }
194d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    else if (isWorkHome(nodeName)) {
195d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                        type = nodeName;
196d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    }
197d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    else {
198d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                        code = nodeName;
199d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    }
200d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
201d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                if (code == null || value == null) continue;
202d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                if ("HOME".equals(type)) {
203d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    vCard.setPhoneHome(code, value);
204d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
205d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                else { // By default, setup work phone
206d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    vCard.setPhoneWork(code, value);
207d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
208d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
209d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
210d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
211d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        private boolean isWorkHome(String nodeName) {
212d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            return "HOME".equals(nodeName) || "WORK".equals(nodeName);
213d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
214d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
215d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        private void setupAddresses() {
216d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            NodeList allAddresses = document.getElementsByTagName("ADR");
217d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            if (allAddresses == null) return;
218d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            for (int i = 0; i < allAddresses.getLength(); i++) {
219d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                Element addressNode = (Element) allAddresses.item(i);
220d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
221d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                String type = null;
222d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                List<String> code = new ArrayList<String>();
223d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                List<String> value = new ArrayList<String>();
224d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                NodeList childNodes = addressNode.getChildNodes();
225d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                for (int j = 0; j < childNodes.getLength(); j++) {
226d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    Node node = childNodes.item(j);
227d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    if (node.getNodeType() != Node.ELEMENT_NODE) continue;
228d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    String nodeName = node.getNodeName();
229d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    if (isWorkHome(nodeName)) {
230d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                        type = nodeName;
231d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    }
232d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    else {
233d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                        code.add(nodeName);
234d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                        value.add(getTextContent(node));
235d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    }
236d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
237d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                for (int j = 0; j < value.size(); j++) {
238d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    if ("HOME".equals(type)) {
239d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                        vCard.setAddressFieldHome((String) code.get(j), (String) value.get(j));
240d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    }
241d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    else { // By default, setup work address
242d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                        vCard.setAddressFieldWork((String) code.get(j), (String) value.get(j));
243d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    }
244d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
245d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
246d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
247d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
248d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        private String getTagContents(String tag) {
249d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            NodeList nodes = document.getElementsByTagName(tag);
250d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            if (nodes != null && nodes.getLength() == 1) {
251d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                return getTextContent(nodes.item(0));
252d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
253d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            return null;
254d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
255d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
256d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        private void setupSimpleFields() {
257d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            NodeList childNodes = document.getDocumentElement().getChildNodes();
258d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            for (int i = 0; i < childNodes.getLength(); i++) {
259d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                Node node = childNodes.item(i);
260d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                if (node instanceof Element) {
261d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    Element element = (Element) node;
262d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
263d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    String field = element.getNodeName();
264d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    if (element.getChildNodes().getLength() == 0) {
265d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                        vCard.setField(field, "");
266d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    }
267d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    else if (element.getChildNodes().getLength() == 1 &&
268d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                            element.getChildNodes().item(0) instanceof Text) {
269d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                        vCard.setField(field, getTextContent(element));
270d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    }
271d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
272d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
273d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
274d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
275d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        private String getTextContent(Node node) {
276d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            StringBuilder result = new StringBuilder();
277d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            appendText(result, node);
278d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            return result.toString();
279d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
280d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
281d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        private void appendText(StringBuilder result, Node node) {
282d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            NodeList childNodes = node.getChildNodes();
283d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            for (int i = 0; i < childNodes.getLength(); i++) {
284d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                Node nd = childNodes.item(i);
285d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                String nodeValue = nd.getNodeValue();
286d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                if (nodeValue != null) {
287d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    result.append(nodeValue);
288d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
289d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                appendText(result, nd);
290d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
291d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
292d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
293d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
294