package org.freeplane.features.url.mindmapmode; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.Reader; import java.util.ArrayList; import java.util.Arrays; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.freeplane.core.resources.ResourceController; import org.freeplane.core.util.LogUtils; import org.freeplane.core.util.TextUtils; import org.freeplane.features.url.UrlManager; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; public class MapVersionInterpreter{ /* FREEPLANE1_2_0("freeplane 1.2.0", false, false, "Freeplane", "freeplane.url"), FREEPLANE1_1("0.9.0", false, false, "Freeplane", "freeplane.url"), FREEMIND_1("1.", false, true, "FreeMind", "freemind.url"), */ //DOCEAR static final public MapVersionInterpreter DEFAULT = new MapVersionInterpreter("", false, true, null, null); static final public IMapInputStreamConverter DEFAULT_INPUTSTREAM_CONVERTER = new IMapInputStreamConverter() { private static final String FREEPLANE_VERSION_UPDATER_XSLT = "/xslt/freeplane_version_updater.xslt"; public Reader getConvertedStream(File f) throws FileNotFoundException, IOException { return UrlManager.getUpdateReader(f, FREEPLANE_VERSION_UPDATER_XSLT); } }; final public String mapBegin; final public boolean needsConversion; final public boolean anotherDialect; final public String appName; final public String url; final public IMapInputStreamConverter inputStreamConverter; final public IMapConverter mapConverter; public MapVersionInterpreter(String versionBegin, boolean needsConversion, boolean anotherDialect, String appName, String url) { this(versionBegin, needsConversion, anotherDialect, appName, url, DEFAULT_INPUTSTREAM_CONVERTER, null); } public MapVersionInterpreter(String versionBegin, boolean needsConversion, boolean anotherDialect, String appName, String url, IMapInputStreamConverter inputStreamConverter, IMapConverter mapConverter) { this.inputStreamConverter = inputStreamConverter; this.mapConverter = mapConverter; this.mapBegin = "<map version=\"" + versionBegin; this.needsConversion = needsConversion; this.anotherDialect = anotherDialect; this.appName = appName; this.url = url; } static MapVersionInterpreter getVersionInterpreter(String mapBegin){ for (MapVersionInterpreter interpreter : MapVersionInterpreter.values()){ if(interpreter.knows(mapBegin)) return interpreter; } return DEFAULT; } public static void addMapVersionInterpreter(MapVersionInterpreter interpreter) { ArrayList<MapVersionInterpreter> list = new ArrayList<MapVersionInterpreter>(); list.add(interpreter); list.addAll(Arrays.asList(values())); values = list.toArray(values); } private static MapVersionInterpreter[] values = null; private static MapVersionInterpreter[] values() { if(values == null){ try { DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder documentBuilder = domFactory.newDocumentBuilder(); InputStream resource = ResourceController.getResourceController().getResource("/xml/mapVersions.xml").openStream(); Document dom = documentBuilder.parse(resource); Element root = dom.getDocumentElement(); NodeList dialectElements = root.getElementsByTagName("dialect"); final int dialectNumber = dialectElements.getLength(); values = new MapVersionInterpreter[dialectNumber]; for(int i = 0; i < dialectNumber; i++){ Element dialectElement = (Element) dialectElements.item(i); String versionBegin = dialectElement.getAttribute("versionBegin"); boolean needsConversion = Boolean.parseBoolean(dialectElement.getAttribute("needsConversion")); boolean anotherDialect = Boolean.parseBoolean(dialectElement.getAttribute("anotherDialect")); String appName = dialectElement.getAttribute("appName"); String url = dialectElement.getAttribute("url"); values[i] = new MapVersionInterpreter(versionBegin, needsConversion, anotherDialect, appName, url); } resource.close(); } catch (Exception e) { LogUtils.severe(e); values = new MapVersionInterpreter[]{}; } } return values; } private boolean knows(String mapBegin) { return mapBegin.startsWith(this.mapBegin); } public IMapConverter getMapConverter() { return this.mapConverter; } public IMapInputStreamConverter getMapInputStreamConverter() { return this.inputStreamConverter; } String getDialectInfo(String path){ final String appInfo; if(appName != null) appInfo = TextUtils.format("dialect_info.app", path, appName); else appInfo = TextUtils.format("dialect_info.unknownApp", path); final String warning = TextUtils.getText("dialect_info.warning"); final String urlInfo; if(url != null) urlInfo = TextUtils.format("dialect_info.url", url); else urlInfo = TextUtils.getText("dialect_info.unknownURL"); return appInfo +" "+ warning +" "+ urlInfo; } }