package org.xmind.ui.internal.editor;
import static org.xmind.ui.internal.editor.TempWorkbookRefFactory.URI_SCHEME;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.net.URI;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.ui.IMemento;
import org.xmind.core.Core;
import org.xmind.core.CoreException;
import org.xmind.core.ISerializer;
import org.xmind.core.IWorkbook;
import org.xmind.core.util.CloneHandler;
import org.xmind.ui.internal.MindMapUIPlugin;
import org.xmind.ui.mindmap.IWorkbookRef;
/**
* @author Frank Shaka
* @since 3.6.50
*/
public class ClonedWorkbookRef extends AbstractWorkbookRef {
protected static final String URI_PATH = "/clone"; //$NON-NLS-1$
private static final String PARAM_SOURCE_URI = "sourceURI"; //$NON-NLS-1$
private ClonedWorkbookRef(URI uri, IMemento state) {
super(uri, state);
}
public URI getSourceWorkbookURI() {
return getSourceWorkbookURI(getURI());
}
private static URI getSourceWorkbookURI(URI uri) {
String sourceURIString = URIParser.getQueryParameter(uri,
PARAM_SOURCE_URI);
return URI.create(sourceURIString);
}
@Override
public String getName() {
String path = getSourceWorkbookURI().getPath();
int suffixIndex = path.lastIndexOf("."); //$NON-NLS-1$
if (suffixIndex > 0) {
path = path.substring(0, suffixIndex);
}
int nameIndex = path.lastIndexOf("/"); //$NON-NLS-1$
if (nameIndex > 0 && nameIndex < path.length() - 1) {
path = path.substring(nameIndex + 1);
}
return path;
}
@Override
public String getDescription() {
return getName();
}
@Override
protected IWorkbook doLoadWorkbookFromURI(IProgressMonitor monitor, URI uri)
throws InterruptedException, InvocationTargetException {
SubMonitor subMonitor = SubMonitor.convert(monitor, 100);
subMonitor.newChild(5);
URI sourceWorkbookURI = getSourceWorkbookURI(uri);
IWorkbookRef sourceWorkbookRef = MindMapUIPlugin.getDefault()
.getWorkbookRefFactory()
.createWorkbookRef(sourceWorkbookURI, null);
Assert.isTrue(sourceWorkbookRef != null);
if (monitor.isCanceled())
throw new InterruptedException();
sourceWorkbookRef.open(subMonitor.newChild(20));
try {
IWorkbook sourceWorkbook = sourceWorkbookRef.getWorkbook();
Assert.isTrue(sourceWorkbook != null);
return doCloneWorkbook(subMonitor.newChild(70), sourceWorkbook);
} finally {
subMonitor.setWorkRemaining(5);
sourceWorkbookRef.close(subMonitor.newChild(5));
}
}
private IWorkbook doCloneWorkbook(IProgressMonitor monitor,
IWorkbook sourceWorkbook)
throws InterruptedException, InvocationTargetException {
try {
IWorkbook workbook = Core.getWorkbookBuilder()
.createWorkbook(getTempStorage());
ISerializer serializer = Core.getWorkbookBuilder().newSerializer();
serializer.setWorkbook(workbook);
serializer.setWorkbookStorageAsOutputTarget();
serializer.setEntryStreamNormalizer(getEncryptionHandler());
serializer.serialize(null);
new CloneHandler().withWorkbooks(sourceWorkbook, workbook)
.copyWorkbookContents();
return workbook;
} catch (IOException e) {
throw new InvocationTargetException(e);
} catch (CoreException e) {
throw new InvocationTargetException(e);
}
}
public static IWorkbookRef create(URI uri, IMemento state) {
Assert.isNotNull(uri);
Assert.isLegal(URI_SCHEME.equals(uri.getScheme()));
Assert.isLegal(URI_PATH.equals(uri.getPath()));
return new ClonedWorkbookRef(uri, state);
}
public static IWorkbookRef createFromSourceWorkbookURI(
URI sourceWorkbookURI) {
Assert.isNotNull(sourceWorkbookURI);
URI uri = URI.create(URI_SCHEME + ":" + URI_PATH); //$NON-NLS-1$
uri = URIParser.appendQueryParameter(uri, PARAM_SOURCE_URI,
sourceWorkbookURI.toString());
return new ClonedWorkbookRef(uri, null);
}
}