All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.xmind.core.internal.dom.RevisionRepositoryImpl Maven / Gradle / Ivy

package org.xmind.core.internal.dom;

import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xmind.core.Core;
import org.xmind.core.IFileEntry;
import org.xmind.core.IManifest;
import org.xmind.core.IRevisionManager;
import org.xmind.core.IWorkbook;
import org.xmind.core.internal.RevisionRepository;
import org.xmind.core.internal.zip.ArchiveConstants;
import org.xmind.core.util.DOMUtils;

public class RevisionRepositoryImpl extends RevisionRepository {

    private WorkbookImpl ownedWorkbook;

    private Map managers = new HashMap();

    public RevisionRepositoryImpl(WorkbookImpl ownedWorkbook) {
        this.ownedWorkbook = ownedWorkbook;
    }

    public IRevisionManager getRevisionManager(String resourceId,
            String contentType) {
        RevisionManagerImpl manager = managers.get(resourceId);
        if (manager == null) {
            manager = loadRevisionManager(resourceId, contentType);
            manager.addNotify(ownedWorkbook);
            managers.put(resourceId, manager);
        }
        return manager;
    }

    private RevisionManagerImpl loadRevisionManager(String resourceId,
            String contentType) {
        String dirPath = ArchiveConstants.PATH_REVISIONS + resourceId + "/"; //$NON-NLS-1$
        String metaPath = dirPath + ArchiveConstants.REVISIONS_XML;
        IManifest manifest = ownedWorkbook.getManifest();
        IFileEntry metaEntry = manifest.getFileEntry(metaPath);
        if (metaEntry != null) {
            RevisionManagerImpl manager = loadRevisionManager(resourceId,
                    metaEntry, dirPath);
            if (manager != null)
                return manager;
        }
        Document doc = DOMUtils.createDocument();
        Element ele = DOMUtils.createElement(doc, DOMConstants.TAG_REVISIONS);
        ele.setAttribute(DOMConstants.ATTR_RESOURCE_ID, resourceId);
        ele.setAttribute(DOMConstants.ATTR_MEDIA_TYPE, contentType);
        ele.setAttribute(DOMConstants.ATTR_NEXT_REVISION_NUMBER, "1"); //$NON-NLS-1$
        manifest.createFileEntry(metaPath);
        return new RevisionManagerImpl(doc, ownedWorkbook, dirPath);
    }

    private RevisionManagerImpl loadRevisionManager(String resourceId,
            IFileEntry metaEntry, String path) {
        InputStream stream = metaEntry.getInputStream();
        if (stream == null)
            return null;
        try {
            Document doc = DOMUtils.loadDocument(stream);
            return new RevisionManagerImpl(doc, ownedWorkbook, path);
        } catch (Throwable e) {
            Core.getLogger().log(e,
                    "Failed to load document at " + metaEntry.getPath()); //$NON-NLS-1$
        }
        return null;
    }

    public IWorkbook getOwnedWorkbook() {
        return ownedWorkbook;
    }

    public boolean isOrphan() {
        return false;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy