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.iterateElements(xml_.getElementsByTagName("contact"))) {
- /* 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. <em>After successful</em>
+ * 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.iterateElements(node.getElementsByTagName("number"))) {
- 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)) {
- if (entry != null)
- consumer.consume(entry);
- }
- }
+ // subnodes: category (unused, always 0) person/realName
+ // person/imageURL telephony/number (@prio, @type, @vanity)
+ // services/email mod_time
+ Entry entry = new 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
- {}
-
}