package org.xmind.core.internal.dom;
import java.io.IOException;
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<String, RevisionManagerImpl> managers = new HashMap<String, RevisionManagerImpl>();
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 (IOException 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;
}
}