/* ****************************************************************************** * Copyright (c) 2006-2012 XMind Ltd. and others. * * This file is a part of XMind 3. XMind releases 3 and * above are dual-licensed under the Eclipse Public License (EPL), * which is available at http://www.eclipse.org/legal/epl-v10.html * and the GNU Lesser General Public License (LGPL), * which is available at http://www.gnu.org/licenses/lgpl.html * See http://www.xmind.net/license.html for details. * * Contributors: * XMind Ltd. - initial API and implementation *******************************************************************************/ package org.xmind.core.internal.dom; import java.io.IOException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.xmind.core.IAdaptable; import org.xmind.core.IFileEntry; import org.xmind.core.IIdentifiable; import org.xmind.core.IManifest; import org.xmind.core.IWorkbook; import org.xmind.core.IWorkbookComponentRefManager; import org.xmind.core.util.DOMUtils; import org.xmind.core.util.HyperlinkUtils; public class InternalHyperlinkUtils { private static boolean isInWorkingRevision(IAdaptable object) { Node node = (Node) object.getAdapter(Node.class); if (node != null) { Document doc = DOMUtils.getOwnerDocument(node); if (doc != null) { Element docEle = doc.getDocumentElement(); if (docEle != null) { return !DOMConstants.TAG_REVISION_CONTENT.equals(docEle .getNodeName()); } } } return true; } public static void activateHyperlink(IWorkbook workbook, String url, IAdaptable source) { if (workbook != null) { if (HyperlinkUtils.isAttachmentURL(url)) { if (isInWorkingRevision(source)) { String attPath = HyperlinkUtils.toAttachmentPath(url); increaseFileEntryRef(workbook, attPath); } } else if (HyperlinkUtils.isInternalURL(url)) { if (source instanceof IIdentifiable) { String sourceId = ((IIdentifiable) source).getId(); String id = HyperlinkUtils.toElementID(url); increateElementRef(workbook, id, sourceId); } } } } public static void increaseFileEntryRef(IWorkbook workbook, String entryPath) { if (workbook != null && entryPath != null) { IFileEntry e = workbook.getManifest().getFileEntry(entryPath); if (e != null) { e.increaseReference(); if (e.isDirectory()) { for (IFileEntry sub : e.getSubEntries()) { sub.increaseReference(); } } } } } public static void increateElementRef(IWorkbook workbook, String elementId, String sourceId) { if (workbook != null && elementId != null) { IWorkbookComponentRefManager counter = (IWorkbookComponentRefManager) workbook .getAdapter(IWorkbookComponentRefManager.class); if (counter != null) { counter.increaseRef(sourceId, elementId); } } } public static void deactivateHyperlink(IWorkbook workbook, String url, IAdaptable source) { if (workbook != null) { if (HyperlinkUtils.isAttachmentURL(url)) { if (isInWorkingRevision(source)) { String attPath = HyperlinkUtils.toAttachmentPath(url); decreaseFileEntryRef(workbook, attPath); } } else if (HyperlinkUtils.isInternalURL(url)) { if (source instanceof IIdentifiable) { String sourceId = ((IIdentifiable) source).getId(); String elementId = HyperlinkUtils.toElementID(url); decreaseElementRef(workbook, elementId, sourceId); } } } } public static void decreaseFileEntryRef(IWorkbook workbook, String entryPath) { if (workbook != null && entryPath != null) { IFileEntry e = workbook.getManifest().getFileEntry(entryPath); if (e != null) { e.decreaseReference(); if (e.isDirectory()) { for (IFileEntry sub : e.getSubEntries()) { sub.decreaseReference(); } } } } } public static void decreaseElementRef(IWorkbook workbook, String elementId, String sourceId) { if (workbook != null && elementId != null) { IWorkbookComponentRefManager counter = (IWorkbookComponentRefManager) workbook .getAdapter(IWorkbookComponentRefManager.class); if (counter != null) { counter.decreaseRef(sourceId, elementId); } } } public static String importAttachmentURL(String sourceHyperlink, IWorkbook sourceWorkbook, IWorkbook targetWorkbook) throws IOException { String sourcePath = HyperlinkUtils.toAttachmentPath(sourceHyperlink); String targetPath = importAttachment(sourcePath, sourceWorkbook, targetWorkbook); return HyperlinkUtils.toAttachmentURL(targetPath); } public static String importAttachment(String sourcePath, IWorkbook sourceWorkbook, IWorkbook targetWorkbook) throws IOException { IFileEntry sourceEntry = sourceWorkbook.getManifest().getFileEntry( sourcePath); if (sourceEntry != null) { IManifest manifest = targetWorkbook.getManifest(); IFileEntry targetEntry = manifest .cloneEntryAsAttachment(sourceEntry); if (targetEntry != null) { return targetEntry.getPath(); } } return sourcePath; } }