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