X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=src%2Fde%2Fj32%2Fpimstuff%2Fconduit%2FFritzAddressbookImporter.java;h=a67d9755a8d2473ea7267376bd91989f59c7ec59;hb=e4126a1787b7045a53f6074e9ef15681c9f5fde4;hp=f434185e3cebabf3b0cee5e10c78bda43772e7cb;hpb=276d9a69fa796728169c2992921a1e4bd875f549;p=jpim.git diff --git a/src/de/j32/pimstuff/conduit/FritzAddressbookImporter.java b/src/de/j32/pimstuff/conduit/FritzAddressbookImporter.java index f434185..a67d975 100644 --- a/src/de/j32/pimstuff/conduit/FritzAddressbookImporter.java +++ b/src/de/j32/pimstuff/conduit/FritzAddressbookImporter.java @@ -9,67 +9,77 @@ import org.xml.sax.SAXException; import de.j32.pimstuff.data.Entry; import de.j32.pimstuff.data.EntryConsumer; -import de.j32.util.Util; import de.j32.util.XmlUtil; -public class FritzAddressbookImporter - implements Importer +public class FritzAddressbookImporter implements Importer { - Document xml_; - - public FritzAddressbookImporter(InputStream is) - throws SAXException, IOException - { - try { - xml_ = XmlUtil.parse(is); - is.close(); - is = null; - } - finally { - Util.nothrowClose(is); - } - } - - @Override - public void sendTo(EntryConsumer consumer) - { - for (Element node : XmlUtil.iterate(xml_.getElementsByTagName("contact"),Element.class)) { - /* subnodes: - * category (unused, always 0) - * person/realName - * person/imageURL - * telephony/number (@prio, @type, @vanity) - * services/email - * mod_time - */ - Entry entry = new Entry(); + Document xml_; - try { - entry.name(node.getElementsByTagName("realName").item(0).getTextContent()); + /** + * Importer reading Addressbook from Fritzbox XML file + * + * @param is InputStream providing the XML data. After successful + * construction, the class takes responsibility for closing the + * stream. + * @throws SAXException + * @throws IOException + */ + public FritzAddressbookImporter(InputStream is) throws SAXException, + IOException + { + // It does not make sens to try / finally here, at least conceptually: + // Since + // the base-class constructor might throw we would never get a chance to + // properly close is. Thus I deem it safer to only take responsibility + // for is + // when the constructor does NOT throw and place the try / finally into + // the + // callers code. + xml_ = XmlUtil.parse(is); + is.close(); + } - for (Element phone : XmlUtil.iterate(node.getElementsByTagName("number"),Element.class)) { - entry.attribute("phone", phone.getAttribute("type"), phone.getTextContent()); - } - - try { - entry.attribute("email", "", - node.getElementsByTagName("email").item(0).getTextContent()); - } - catch (NullPointerException e) {} // ignore missing optional email - } - catch (NullPointerException e) { - // Ignore incomplete entries - entry = null; - } + @Override + public void sendTo(EntryConsumer consumer) + { + for (Element node : XmlUtil.iterate( + xml_.getElementsByTagName("contact"), Element.class)) { + /* + * subnodes: category (unused, always 0) person/realName + * person/imageURL telephony/number (@prio, @type, @vanity) + * services/email mod_time + */ + Entry entry = new Entry(); - if (entry != null) - consumer.consume(entry); - } - } + try { + entry.name(node.getElementsByTagName("realName").item(0) + .getTextContent()); + + for (Element phone : XmlUtil.iterate( + node.getElementsByTagName("number"), Element.class)) { + entry.attribute("phone", phone.getAttribute("type"), + phone.getTextContent()); + } + + try { + entry.attribute("email", "", + node.getElementsByTagName("email").item(0) + .getTextContent()); + } + catch (NullPointerException e) {} // ignore missing optional + // email + } + catch (NullPointerException e) { + // Ignore incomplete entries + entry = null; + } + + if (entry != null) consumer.consume(entry); + } + } + + @Override + public void close() throws IOException + {} - @Override - public void close() - throws IOException - {} - }