package org.zirco.ui.runnables; import java.io.File; import java.io.IOException; import java.net.URLDecoder; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import org.zirco.R; import org.zirco.providers.BookmarksProviderWrapper; import org.zirco.utils.ApplicationUtils; import org.zirco.utils.DateUtils; import org.zirco.utils.IOUtils; import android.app.ProgressDialog; import android.content.Context; import android.os.Handler; import android.os.Message; import android.util.Log; /** * Runnable to import history and bookmarks from an XML file. */ public class XmlHistoryBookmarksImporter implements Runnable { private Context mContext; private String mFileName; private ProgressDialog mProgressDialog; private String mErrorMessage = null; /** * Constructor. * @param context The current context. * @param fileName The file to import. * @param progressDialog The progress dialog shown during import. */ public XmlHistoryBookmarksImporter(Context context, String fileName, ProgressDialog progressDialog) { mContext = context; mFileName = fileName; mProgressDialog = progressDialog; } /** * Get the content of a node, why Android does not include Node.getTextContent() ? * @param node The node. * @return The node content. */ private String getNodeContent(Node node) { StringBuffer buffer = new StringBuffer(); NodeList childList = node.getChildNodes(); for (int i = 0; i < childList.getLength(); i++) { Node child = childList.item(i); if (child.getNodeType() != Node.TEXT_NODE) { continue; // skip non-text nodes } buffer.append(child.getNodeValue()); } return buffer.toString(); } @Override public void run() { File file = new File(IOUtils.getBookmarksExportFolder(), mFileName); if ((file != null) && (file.exists()) && (file.canRead())) { try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder; builder = factory.newDocumentBuilder(); Document document = builder.parse(file); Element root = document.getDocumentElement(); if ((root != null) && (root.getNodeName().equals("itemlist"))) { NodeList itemsList = root.getElementsByTagName("item"); Node item; NodeList record; Node dataItem; for (int i = 0; i < itemsList.getLength(); i++) { item = itemsList.item(i); if (item != null) { record = item.getChildNodes(); String title = null; String url = null; int visits = 0; long date = -1; long created = -1; int bookmark = 0; for (int j = 0; j < record.getLength(); j++) { dataItem = record.item(j); if ((dataItem != null) && (dataItem.getNodeName() != null)) { if (dataItem.getNodeName().equals("title")) { title = URLDecoder.decode(getNodeContent(dataItem)); } else if (dataItem.getNodeName().equals("url")) { url = URLDecoder.decode(getNodeContent(dataItem)); } else if (dataItem.getNodeName().equals("visits")) { try { visits = Integer.parseInt(getNodeContent(dataItem)); } catch (Exception e) { visits = 0; } } else if (dataItem.getNodeName().equals("date")) { try { date = Long.parseLong(getNodeContent(dataItem)); } catch (Exception e) { date = -1; } } else if (dataItem.getNodeName().equals("created")) { try { created = Long.parseLong(getNodeContent(dataItem)); } catch (Exception e) { created = -1; } } else if (dataItem.getNodeName().equals("bookmark")) { try { bookmark = Integer.parseInt(getNodeContent(dataItem)); } catch (Exception e) { bookmark = 0; } } } } BookmarksProviderWrapper.insertRawRecord(mContext.getContentResolver(), title, url, visits, date, created, bookmark); } } } else if ((root != null) && (root.getNodeName().equals("bookmarkslist"))) { // Old export format (before 0.4.0). NodeList bookmarksList = root.getElementsByTagName("bookmark"); Node bookmark; NodeList bookmarkItems; String title; String url; String creationDate; int count; long date = -1; long created = -1; Node item; for (int i = 0; i < bookmarksList.getLength(); i++) { bookmark = bookmarksList.item(i); if (bookmark != null) { title = null; url = null; creationDate = null; count = 0; bookmarkItems = bookmark.getChildNodes(); for (int j = 0; j < bookmarkItems.getLength(); j++) { item = bookmarkItems.item(j); if ((item != null) && (item.getNodeName() != null)) { if (item.getNodeName().equals("title")) { title = getNodeContent(item); } else if (item.getNodeName().equals("url")) { url = URLDecoder.decode(getNodeContent(item)); } else if (item.getNodeName().equals("creationdate")) { creationDate = getNodeContent(item); date = DateUtils.convertFromDatabase(mContext, creationDate).getTime(); created = date; } else if (item.getNodeName().equals("count")) { try { count = Integer.parseInt(getNodeContent(item)); } catch (Exception e) { count = 0; } } } } BookmarksProviderWrapper.insertRawRecord(mContext.getContentResolver(), title, url, count, date, created, 1); } } } } catch (ParserConfigurationException e) { Log.w("Bookmark import failed", e.getMessage()); mErrorMessage = e.toString(); } catch (SAXException e) { Log.w("Bookmark import failed", e.getMessage()); mErrorMessage = e.toString(); } catch (IOException e) { Log.w("Bookmark import failed", e.getMessage()); mErrorMessage = e.toString(); } } mHandler.sendEmptyMessage(0); } private Handler mHandler = new Handler() { public void handleMessage(Message msg) { if (mProgressDialog != null) { mProgressDialog.dismiss(); } if (mErrorMessage != null) { ApplicationUtils.showOkDialog(mContext, android.R.drawable.ic_dialog_alert, mContext.getResources().getString(R.string.Commons_HistoryBookmarksImportSDCardFailedTitle), String.format(mContext.getResources().getString(R.string.Commons_HistoryBookmarksFailedMessage), mErrorMessage)); } } }; }