package org.xmind.core.internal.dom; import static org.xmind.core.internal.dom.DOMConstants.ATTR_PROVIDER; import static org.xmind.core.internal.dom.DOMConstants.TAG_EXTENSION; import static org.xmind.core.internal.dom.DOMConstants.TAG_EXTENSIONS; import static org.xmind.core.internal.zip.ArchiveConstants.PATH_EXTENSIONS; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.xmind.core.IFileEntry; import org.xmind.core.IManifest; import org.xmind.core.IWorkbook; import org.xmind.core.IWorkbookExtension; import org.xmind.core.internal.WorkbookExtensionManager; import org.xmind.core.util.DOMUtils; /** * @author Jason Wong */ public class WorkbookExtensionManagerImpl extends WorkbookExtensionManager { private WorkbookImpl ownedWorkbook; private Map<String, WorkbookExtensionImpl> extensions = new HashMap<String, WorkbookExtensionImpl>(); public WorkbookExtensionManagerImpl() { } protected void setOwnedWorkbook(WorkbookImpl ownedWorkbook) { this.ownedWorkbook = ownedWorkbook; } public IWorkbook getOwnedWorkbook() { return ownedWorkbook; } public IWorkbookExtension createExtension(String providerName) { return createExtension(providerName, null); } protected IWorkbookExtension createExtension(String providerName, Document doc) { if (providerName == null || "".equals(providerName)) //$NON-NLS-1$ return null; IWorkbookExtension ext = extensions.get(providerName); if (ext == null) { if (doc == null) doc = createExtensionDocument(providerName); ensureExtensionElement(providerName); ensureFileEntry(providerName); ext = new WorkbookExtensionImpl(doc, ownedWorkbook); extensions.put(providerName, (WorkbookExtensionImpl) ext); ((WorkbookExtensionImpl) ext).addNotify(ownedWorkbook); ownedWorkbook.updateModificationInfo(); } return ext; } private void ensureExtensionElement(String provider) { Element extsEle = DOMUtils.ensureChildElement(getWorkbookElement(), TAG_EXTENSIONS); Element[] es = DOMUtils.getChildElementsByTag(extsEle, TAG_EXTENSION); for (Element e : es) { if (provider.equals(e.getAttribute(// ATTR_PROVIDER))) return; } Element e = DOMUtils.createElement(extsEle, TAG_EXTENSION); e.setAttribute(ATTR_PROVIDER, provider); } private Document createExtensionDocument(String provider) { Document doc = DOMUtils.createDocument(getExtensionTag(provider)); doc.getDocumentElement().setAttribute(ATTR_PROVIDER, provider); return doc; } private void ensureFileEntry(String provider) { IManifest m = ownedWorkbook.getManifest(); String path = PATH_EXTENSIONS + provider + ".xml";//$NON-NLS-1$ IFileEntry entry = m.getFileEntry(path); if (entry == null) { m.createFileEntry(path).increaseReference(); } } private Element getWorkbookElement() { return ownedWorkbook.getWorkbookElement(); } private String getExtensionTag(String providerName) { if (providerName.contains(".")) { //$NON-NLS-1$ int index = providerName.lastIndexOf("."); //$NON-NLS-1$ if (index > 0 && index < providerName.length()) return providerName.substring(index + 1); } return providerName; } public List<IWorkbookExtension> getExtensions() { return new ArrayList<IWorkbookExtension>(extensions.values()); } public IWorkbookExtension getExtension(String provider) { if (provider != null && !"".equals(provider)) { //$NON-NLS-1$ for (IWorkbookExtension e : getExtensions()) { if (provider.equals(e.getProviderName())) return e; } } return null; } public void deleteExtension(String providerName) { // TODO Auto-generated method stub } public List<String> getProviders() { Element es = DOMUtils.getFirstChildElementByTag(getWorkbookElement(), TAG_EXTENSIONS); if (es != null) { Element[] eles = DOMUtils.getChildElementsByTag(es, TAG_EXTENSION); List<String> providers = new ArrayList<String>(); for (Element ele : eles) { String provider = ele.getAttribute(ATTR_PROVIDER); if (provider != null && !"".equals(provider)) { //$NON-NLS-1$ providers.add(provider); } } return providers; } return Collections.emptyList(); } public boolean isOrphan() { return false; } }