package org.docear.plugin.core.features; import java.net.URI; import org.docear.plugin.core.features.DocearMapModelExtension.DocearMapType; import org.freeplane.core.extension.IExtension; import org.freeplane.core.io.IAttributeHandler; import org.freeplane.core.io.IElementDOMHandler; import org.freeplane.core.io.IExtensionAttributeWriter; import org.freeplane.core.io.ITreeWriter; import org.freeplane.core.io.ReadManager; import org.freeplane.core.io.WriteManager; import org.freeplane.core.util.LogUtils; import org.freeplane.features.map.MapModel; import org.freeplane.features.map.NodeModel; import org.freeplane.n3.nanoxml.XMLElement; public class DocearMapModelExtensionXmlBuilder implements IElementDOMHandler, IExtensionAttributeWriter { private static final String DOCEAR_MAP_EXTENSION_XML_TAG = "map"; private static final String DOCEAR_MAP_EXTENSION_DIALECT_KEY = "dialect"; private static final String DOCEAR_MAP_EXTENSION_VERSION_KEY = "version"; private static final String DOCEAR_MAP_EXTENSION_TYPE_XML_TAG = "type"; public void registerBy(final ReadManager reader, final WriteManager writer) { reader.addElementHandler(DOCEAR_MAP_EXTENSION_XML_TAG, this); try { registerAttributeHandlers(reader); } catch (Exception e) { LogUtils.warn(e); } writer.addExtensionAttributeWriter(DocearMapModelExtension.class, this); } private void registerAttributeHandlers(ReadManager reader) { final IAttributeHandler freeplaneDialectHandler = reader.getAttributeHandlers().get(DOCEAR_MAP_EXTENSION_XML_TAG).get(DOCEAR_MAP_EXTENSION_DIALECT_KEY); reader.removeAttributeHandler(DOCEAR_MAP_EXTENSION_XML_TAG, DOCEAR_MAP_EXTENSION_DIALECT_KEY, freeplaneDialectHandler); //DOCEAR - keep dialect handling for backwards compatibility reader.addAttributeHandler(DOCEAR_MAP_EXTENSION_XML_TAG, DOCEAR_MAP_EXTENSION_DIALECT_KEY, new IAttributeHandler() { public void setAttribute(Object node, String value) { if (!value.startsWith("docear")) { freeplaneDialectHandler.setAttribute(node, value); return; } value = value.replace("docear ", ""); final MapModel mapModel = (MapModel) node; DocearMapModelExtension docearMapModel = mapModel.getExtension(DocearMapModelExtension.class); if (docearMapModel == null) { docearMapModel = new DocearMapModelExtension(value); DocearMapModelController.setModel(mapModel, docearMapModel); } docearMapModel.setVersion(value); } }); final IAttributeHandler freeplaneVersionHandler = reader.getAttributeHandlers().get(DOCEAR_MAP_EXTENSION_XML_TAG).get(DOCEAR_MAP_EXTENSION_VERSION_KEY); reader.removeAttributeHandler(DOCEAR_MAP_EXTENSION_XML_TAG, DOCEAR_MAP_EXTENSION_VERSION_KEY, freeplaneDialectHandler); reader.addAttributeHandler(DOCEAR_MAP_EXTENSION_XML_TAG, DOCEAR_MAP_EXTENSION_VERSION_KEY, new IAttributeHandler() { public void setAttribute(Object node, String value) { if (!value.startsWith("docear")) { freeplaneVersionHandler.setAttribute(node, value); return; } value = value.replace("docear ", ""); final MapModel mapModel = (MapModel) node; DocearMapModelExtension docearMapModel = mapModel.getExtension(DocearMapModelExtension.class); if (docearMapModel == null) { docearMapModel = new DocearMapModelExtension(value); DocearMapModelController.setModel(mapModel, docearMapModel); } docearMapModel.setVersion(value); } }); reader.addAttributeHandler(DOCEAR_MAP_EXTENSION_XML_TAG, DOCEAR_MAP_EXTENSION_TYPE_XML_TAG, new IAttributeHandler() { public void setAttribute(Object node, String value) { final MapModel mapModel = (MapModel) node; DocearMapModelExtension docearMapModel = mapModel.getExtension(DocearMapModelExtension.class); if (docearMapModel == null) { docearMapModel = new DocearMapModelExtension(); DocearMapModelController.setModel(mapModel, docearMapModel); } docearMapModel.setType(value); } }); reader.addAttributeHandler(DOCEAR_MAP_EXTENSION_XML_TAG, DocearMapModelExtension.MAP_ID_ATTRIBUTE, new IAttributeHandler() { public void setAttribute(Object node, String value) { final MapModel mapModel = (MapModel) node; DocearMapModelExtension docearMapModel = mapModel.getExtension(DocearMapModelExtension.class); if (docearMapModel == null) { docearMapModel = new DocearMapModelExtension(); DocearMapModelController.setModel(mapModel, docearMapModel); } docearMapModel.setMapId(value); } }); reader.addAttributeHandler(DOCEAR_MAP_EXTENSION_XML_TAG, DocearMapModelExtension.MAP_URI_ATTRIBUTE, new IAttributeHandler() { public void setAttribute(Object node, String value) { final MapModel mapModel = (MapModel) node; DocearMapModelExtension docearMapModel = mapModel.getExtension(DocearMapModelExtension.class); if (docearMapModel == null) { docearMapModel = new DocearMapModelExtension(); DocearMapModelController.setModel(mapModel, docearMapModel); } docearMapModel.setUri(URI.create(value)); } }); } public Object createElement(Object parent, String tag, XMLElement attributes) { if(tag.equals(DOCEAR_MAP_EXTENSION_XML_TAG)) { final DocearMapModelExtension docearMapModel = DocearMapModelController.getModel((MapModel) parent); if(docearMapModel != null){ return docearMapModel; } else{ return new DocearMapModelExtension(); } } return null; } public void endElement(Object parent, String tag, Object userObject, XMLElement dom) { if (parent instanceof MapModel) { final MapModel map = (MapModel) parent; if (userObject instanceof DocearMapModelExtension) { final DocearMapModelExtension docearMapModel = (DocearMapModelExtension) userObject; DocearMapModelController.setModel(map, docearMapModel); } } } public void writeAttributes(ITreeWriter writer, Object userObject, IExtension extension) { final DocearMapModelExtension modelExtension = extension != null ? (DocearMapModelExtension) extension : DocearMapModelController.getModel(((NodeModel) userObject).getMap()); if (modelExtension == null) { return; } final DocearMapType type = modelExtension.getType(); if(type != null){ writer.addAttribute(DOCEAR_MAP_EXTENSION_TYPE_XML_TAG, type.toString()); } final String mapId = modelExtension.getMapId(); if(mapId != null){ writer.addAttribute(DocearMapModelExtension.MAP_ID_ATTRIBUTE, mapId); } final URI mapUri = modelExtension.getUri(); if(mapUri != null){ writer.addAttribute(DocearMapModelExtension.MAP_URI_ATTRIBUTE, mapUri.toString()); } } }