package org.xmind.ui.internal.imports.opml; import static org.xmind.ui.internal.imports.opml.OpmlConstants.ATT_TEXT; import static org.xmind.ui.internal.imports.opml.OpmlConstants.ATT_TYPE; import static org.xmind.ui.internal.imports.opml.OpmlConstants.ATT_URL; import static org.xmind.ui.internal.imports.opml.OpmlConstants.TAG_BODY; import static org.xmind.ui.internal.imports.opml.OpmlConstants.TYPE_HYPERLINK; import static org.xmind.ui.internal.imports.opml.OpmlConstants.TYPE_NOTE; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.InvocationTargetException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xmind.core.INotes; import org.xmind.core.IPlainNotesContent; import org.xmind.core.ISheet; import org.xmind.core.ITopic; import org.xmind.core.IWorkbook; import org.xmind.ui.internal.MindMapUIPlugin; import org.xmind.ui.wizards.MindMapImporter; import org.xml.sax.ErrorHandler; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; public class OpmlImporter extends MindMapImporter implements ErrorHandler { private ISheet sheet; public OpmlImporter(String sourcePath, IWorkbook targetWorkbook) { super(sourcePath, targetWorkbook); } @Override public void build() throws InvocationTargetException, InterruptedException { MindMapUIPlugin.getDefault().getUsageDataCollector() .increase("ImportFromOpmlCount"); //$NON-NLS-1$ InputStream in = null; try { DocumentBuilderFactory factory = DocumentBuilderFactory .newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); builder.setErrorHandler(this); in = new FileInputStream(getSourcePath()); Document doc = builder.parse(in); checkInterrupted(); Element rootElement = doc.getDocumentElement(); loadSheet(rootElement); } catch (Throwable e) { throw new InvocationTargetException(e); } finally { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } postBuilded(); } private void loadSheet(Element rootElement) throws InterruptedException { checkInterrupted(); IWorkbook targetWorkbook = getTargetWorkbook(); sheet = targetWorkbook.createSheet(); sheet.setTitleText("sheet1"); //$NON-NLS-1$ NodeList nodelist = rootElement.getChildNodes(); Element bodyEle = (Element) nodelist.item(1); if (TAG_BODY.equals(bodyEle.getTagName())) { loadAll(bodyEle); } addTargetSheet(sheet); } private void loadAll(Element bodyEle) { NodeList nodelist = bodyEle.getChildNodes(); if (nodelist.getLength() > 1) return; Node child = nodelist.item(0); if (child instanceof Element) { Element rootEle = (Element) child; ITopic rootTopic = sheet.getRootTopic(); dealRootTopic(rootEle, rootTopic); loadTopic(rootEle, rootTopic); } } private void dealRootTopic(Element ele, ITopic rootTopic) { rootTopic.setTitleText(att(ele, ATT_TEXT)); } private void loadTopic(Element ele, ITopic parent) { pushInMap(ele, parent); if (TYPE_HYPERLINK.equals(att(ele, ATT_TYPE))) loadHyperLink(ele, parent); NodeList children = ele.getChildNodes(); int lenght = children.getLength(); for (int index = 0; index < lenght; index++) { Node childNode = children.item(index); if (childNode instanceof Element) { Element child = (Element) childNode; String type = att(child, ATT_TYPE); if (TYPE_NOTE.equals(type)) loadNotes(child, parent); else { ITopic topic = dealTopic(child, parent); loadTopic(child, topic); } } } } private ITopic dealTopic(Element ele, ITopic parent) { ITopic topic = getTargetWorkbook().createTopic(); topic.setTitleText(att(ele, ATT_TEXT)); parent.add(topic, ITopic.ATTACHED); return topic; } private void pushInMap(Element ele, ITopic parent) { parent.setTitleText(att(ele, ATT_TEXT)); } private String att(Element ele, String attTag) { if (ele.hasAttribute(attTag)) return ele.getAttribute(attTag); return null; } private void loadHyperLink(Element ele, ITopic topic) { String link = att(ele, ATT_URL); if (link != null && isLinkToWeb(link)) { topic.setHyperlink(link); } } private void loadNotes(Element ele, ITopic parent) { String text = att(ele, ATT_TEXT); if (text != null && !text.trim().equals("")) { //$NON-NLS-1$ IPlainNotesContent notesContent = (IPlainNotesContent) getTargetWorkbook() .createNotesContent(INotes.PLAIN); notesContent.setTextContent(text); parent.getNotes().setContent(INotes.PLAIN, notesContent); } } private boolean isLinkToWeb(String hyperlink) { if (hyperlink.contains("www.") || hyperlink.contains(".com") //$NON-NLS-1$//$NON-NLS-2$ || hyperlink.contains(".cn") || hyperlink.contains(".org") //$NON-NLS-1$//$NON-NLS-2$ || hyperlink.contains(".cc") || hyperlink.contains(".net") //$NON-NLS-1$//$NON-NLS-2$ || hyperlink.contains(".ren")) { //$NON-NLS-1$ return true; } return false; } private void checkInterrupted() throws InterruptedException { if (getMonitor().isCanceled()) throw new InterruptedException(); } public void warning(SAXParseException exception) throws SAXException { log(exception, null); } public void error(SAXParseException exception) throws SAXException { log(exception, null); } public void fatalError(SAXParseException exception) throws SAXException { log(exception, null); } }