1 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 ; 31 import javax.xml.parsers.DocumentBuilderFactory ; 32 import java.io.ByteArrayInputStream ; 33 import java.io.IOException ; 34 35 42 public class VCardProvider implements IQProvider { 43 44 public IQ parseIQ(XmlPullParser parser) throws Exception { 45 StringBuffer sb = new StringBuffer (); 46 try { 47 int event = parser.getEventType(); 48 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 e) { 70 e.printStackTrace(); 71 } 72 73 String xmlText = sb.toString(); 74 VCard vCard = new VCard(); 75 try { 76 DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); 77 DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); 78 Document document = documentBuilder.parse(new ByteArrayInputStream (xmlText.getBytes())); 79 80 new VCardReader(vCard, document).initializeFields(); 81 82 } catch (Exception 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 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 code = node.getFirstChild().getNodeName(); 133 String 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 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 getTagContents(String 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 getTextContent(Node node) { 192 StringBuffer result = new StringBuffer (); 193 appendText(result, node); 194 return result.toString(); 195 } 196 197 private void appendText(StringBuffer 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 nodeValue = nd.getNodeValue(); 202 if (nodeValue != null) { 203 result.append(nodeValue); 204 } 205 appendText(result, nd); 206 } 207 } 208 } 209 } 210 | Popular Tags |