package org.xmind.ui.internal.editor;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.net.URI;
import java.net.URL;
import java.util.Map;
import java.util.WeakHashMap;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.URIUtil;
import org.eclipse.ui.IMemento;
import org.xmind.core.Core;
import org.xmind.core.CoreException;
import org.xmind.core.IDeserializer;
import org.xmind.core.IWorkbook;
import org.xmind.core.io.BundleResource;
import org.xmind.core.io.BundleResourceInputSource;
import org.xmind.core.io.DirectoryInputSource;
import org.xmind.core.util.ProgressReporter;
/**
*
* @author Frank Shaka
* @since 3.6.50
*/
public class URLWorkbookRef extends AbstractWorkbookRef {
private static final String SCHEME_PLATFORM = "platform"; //$NON-NLS-1$
private static final String ATT_NAME = "name"; //$NON-NLS-1$
private static Map<URLWorkbookRef, URI> cache = new WeakHashMap<URLWorkbookRef, URI>();
private String name;
private URLWorkbookRef(URI uri, String name, IMemento state) {
super(uri, state);
Assert.isNotNull(uri);
this.name = name == null
? (state == null ? null : state.getString(ATT_NAME)) : name;
}
@Override
public boolean canSave() {
return false;
}
/*
* (non-Javadoc)
*
* @see org.xmind.gef.ui.editor.Editable#getName()
*/
@Override
public String getName() {
if (name != null)
return name;
return super.getName();
}
/*
* (non-Javadoc)
*
* @see
* org.xmind.ui.internal.editor.AbstractWorkbookRef#saveState(org.eclipse.ui
* .IMemento)
*/
@Override
protected void saveState(IMemento memento) {
if (name != null) {
memento.putString(ATT_NAME, name);
}
super.saveState(memento);
}
@Override
public int hashCode() {
return getURI().hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj == this)
return true;
if (obj == null || !(obj instanceof URLWorkbookRef))
return false;
URLWorkbookRef that = (URLWorkbookRef) obj;
URI thisURI = this.getURI();
URI thatURI = that.getURI();
return thisURI == thatURI
|| (thisURI != null && thisURI.equals(thatURI));
}
@Override
public String toString() {
return getURI().toString();
}
public static URLWorkbookRef create(URI uri, IMemento state) {
if (uri == null)
return null;
if (state != null)
return new URLWorkbookRef(uri, null, state);
for (URLWorkbookRef wr : cache.keySet()) {
if (uri.equals(wr.getURI()))
return wr;
}
URLWorkbookRef wr = new URLWorkbookRef(uri, null, null);
cache.put(wr, uri);
return wr;
}
public static URLWorkbookRef create(URI uri, String name) {
if (uri == null)
return null;
for (URLWorkbookRef wr : cache.keySet()) {
if (uri.equals(wr.getURI()))
return wr;
}
URLWorkbookRef wr = new URLWorkbookRef(uri, name, null);
cache.put(wr, uri);
return wr;
}
@Override
protected IWorkbook doLoadWorkbookFromURI(IProgressMonitor monitor, URI uri)
throws InterruptedException, InvocationTargetException {
try {
if (URIUtil.isFileURI(uri)) {
return loadFromFileURI(monitor, uri);
} else if (SCHEME_PLATFORM.equalsIgnoreCase(uri.getScheme())) {
return loadFromPlatformURI(monitor, uri);
} else {
return loadFromGenericURI(monitor, uri);
}
} catch (IOException e) {
throw new InvocationTargetException(e);
} catch (CoreException e) {
throw new InvocationTargetException(e);
}
}
private IWorkbook loadFromGenericURI(IProgressMonitor monitor, URI uri)
throws IOException, CoreException {
URL url = uri.toURL();
InputStream stream = url.openStream();
try {
IDeserializer deserializer = Core.getWorkbookBuilder()
.newDeserializer();
deserializer.setWorkbookStorage(getTempStorage());
deserializer.setEntryStreamNormalizer(getEncryptionHandler());
deserializer.setInputStream(stream);
ProgressReporter reporter = new ProgressReporter(monitor);
// deserializer.deserializeManifest(reporter);
// String passwordHint = deserializer.getManifest().getPasswordHint();
// getEncryptable().setPasswordHint(passwordHint);
deserializer.deserialize(reporter);
return deserializer.getWorkbook();
} finally {
stream.close();
}
}
private IWorkbook loadFromFileURI(IProgressMonitor monitor, URI uri)
throws IOException, CoreException {
File file = URIUtil.toFile(uri);
if (file.isDirectory()) {
IDeserializer deserializer = Core.getWorkbookBuilder()
.newDeserializer();
deserializer.setWorkbookStorage(getTempStorage());
deserializer.setInputSource(new DirectoryInputSource(file));
deserializer.setEntryStreamNormalizer(getEncryptionHandler());
deserializer.deserialize(new ProgressReporter(monitor));
return deserializer.getWorkbook();
}
return loadFromGenericURI(monitor, uri);
}
private IWorkbook loadFromPlatformURI(IProgressMonitor monitor, URI uri)
throws IOException, CoreException {
// use decoded path, or the file with '%20' in path will not be found
URL url = new URL(uri.getScheme(), uri.getAuthority(), uri.getPath());
BundleResource resource;
try {
resource = new BundleResource(url);
} catch (IllegalArgumentException e) {
resource = null;
}
if (resource != null) {
BundleResource resolvedResource = resource.resolve();
if (resolvedResource != null
&& resolvedResource.getPath().hasTrailingSeparator()) {
// the workbook URI represents a directory
IDeserializer deserializer = Core.getWorkbookBuilder()
.newDeserializer();
deserializer.setWorkbookStorage(getTempStorage());
deserializer.setInputSource(
new BundleResourceInputSource(resolvedResource));
deserializer.setEntryStreamNormalizer(getEncryptionHandler());
deserializer.deserialize(new ProgressReporter(monitor));
return deserializer.getWorkbook();
}
}
URL locatedURL = FileLocator.find(url);
if (locatedURL != null) {
url = locatedURL;
}
InputStream stream = url.openStream();
try {
IDeserializer deserializer = Core.getWorkbookBuilder()
.newDeserializer();
deserializer.setWorkbookStorage(getTempStorage());
deserializer.setEntryStreamNormalizer(getEncryptionHandler());
deserializer.setInputStream(stream);
deserializer.deserialize(new ProgressReporter(monitor));
return deserializer.getWorkbook();
} finally {
stream.close();
}
}
}