package org.xmind.cathy.internal.jobs; import java.io.File; import java.net.URI; import java.net.URISyntaxException; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PartInitException; import org.xmind.cathy.internal.WorkbenchMessages; import org.xmind.core.Core; import org.xmind.core.IWorkbook; import org.xmind.core.event.ICoreEventListener; import org.xmind.core.event.ICoreEventSource2; import org.xmind.core.io.DirectoryStorage; import org.xmind.core.io.IStorage; import org.xmind.core.util.FileUtils; import org.xmind.ui.internal.imports.freemind.FreeMindImporter; import org.xmind.ui.internal.imports.mm.MindManagerImporter; import org.xmind.ui.io.DownloadJob; import org.xmind.ui.mindmap.MindMapUI; public class DownloadAndOpenFileJob extends Job { private IWorkbench workbench; private String url; private String targetName; private File tempFile; public DownloadAndOpenFileJob(IWorkbench workbench, String url, String targetName) { super(WorkbenchMessages.DownloadAndOpenFileJob_jobName); Assert.isNotNull(workbench); Assert.isNotNull(url); this.workbench = workbench; this.url = url; this.targetName = targetName; } @Override protected IStatus run(IProgressMonitor monitor) { if (monitor.isCanceled()) return Status.CANCEL_STATUS; monitor.beginTask(null, 2); IStatus downloaded = download(monitor); if (!downloaded.isOK()) return downloaded; monitor.worked(1); IStatus opened = open(monitor); if (!opened.isOK()) return opened; monitor.done(); return Status.OK_STATUS; } private IStatus download(IProgressMonitor monitor) { if (monitor.isCanceled()) return Status.CANCEL_STATUS; monitor.subTask(NLS.bind( WorkbenchMessages.DownloadAndOpenFileJob_Task_Download_with_url, url)); tempFile = createTempPath(url); if (tempFile.getParentFile() == null || !tempFile.getParentFile().isDirectory()) { return new Status(IStatus.ERROR, MindMapUI.PLUGIN_ID, WorkbenchMessages.DownloadAndOpenFileJob_Error_FailedToCreateTempFile); } DownloadJob downloadJob = new DownloadJob( WorkbenchMessages.DownloadAndOpenFileJob_DownloadJob_jobName, url, tempFile.getAbsolutePath(), MindMapUI.PLUGIN_ID); downloadJob.setUser(true); downloadJob.schedule(); try { downloadJob.join(); } catch (InterruptedException e) { } if (monitor.isCanceled()) { downloadJob.cancel(); return Status.CANCEL_STATUS; } IStatus downloaded = downloadJob.getResult(); if (downloaded == null) // This should never happen? return new Status(IStatus.ERROR, MindMapUI.PLUGIN_ID, "No result retrieved from download job."); //$NON-NLS-1$ return downloaded; } private IStatus open(IProgressMonitor monitor) { monitor.subTask(NLS.bind( WorkbenchMessages.DownloadAndOpenFileJob_Task_OpenDownloadedFile_with_url, url)); try { IStorage tempStorage = createTempStorage(); final IWorkbook workbook = loadWorkbook(monitor, tempStorage); if (workbook != null) { return openMindMapEditor(monitor, workbook); } } catch (Throwable e) { return new Status(IStatus.ERROR, MindMapUI.PLUGIN_ID, NLS.bind( WorkbenchMessages.DownloadAndOpenFileJob_Error_FailedToLoadWorkbook_with_url, url), e); } return Status.CANCEL_STATUS; } private IWorkbook loadWorkbook(IProgressMonitor monitor, IStorage tempStorage) throws Exception { String ext = FileUtils.getExtension(tempFile.getAbsolutePath()); if (MindMapUI.FILE_EXT_XMIND.equalsIgnoreCase(ext)) { return loadWorkbookFromXMindFile(monitor, tempStorage); } else if (MindMapUI.FILE_EXT_TEMPLATE.equalsIgnoreCase(ext)) { return loadWorkbookFromTemplate(monitor, tempStorage); } else if (".mmap".equalsIgnoreCase(ext)) { //$NON-NLS-1$ return loadWorkbookFromMindManagerFile(monitor, tempStorage); } else if (".mm".equalsIgnoreCase(ext)) { //$NON-NLS-1$ return loadWorkbookFromFreeMindFile(monitor, tempStorage); } return null; } private IWorkbook loadWorkbookFromXMindFile(IProgressMonitor monitor, IStorage tempStorage) throws Exception { return Core.getWorkbookBuilder().loadFromFile(tempFile, tempStorage, null); } private IWorkbook loadWorkbookFromTemplate(IProgressMonitor monitor, IStorage tempStorage) throws Exception { return Core.getWorkbookBuilder().loadFromFile(tempFile, tempStorage, null); } private IWorkbook loadWorkbookFromMindManagerFile(IProgressMonitor monitor, IStorage tempStorage) throws Exception { MindManagerImporter importer = new MindManagerImporter( tempFile.getAbsolutePath()); importer.build(); return importer.getTargetWorkbook(); } private IWorkbook loadWorkbookFromFreeMindFile(IProgressMonitor monitor, IStorage tempStorage) throws Exception { FreeMindImporter importer = new FreeMindImporter( tempFile.getAbsolutePath()); importer.build(); return importer.getTargetWorkbook(); } private IStatus openMindMapEditor(final IProgressMonitor monitor, final IWorkbook workbook) { final IStatus[] result = new IStatus[1]; result[0] = null; Display display = workbench.getDisplay(); if (display == null || display.isDisposed()) { monitor.setCanceled(true); return Status.CANCEL_STATUS; } display.syncExec(new Runnable() { public void run() { IWorkbenchWindow window = workbench.getActiveWorkbenchWindow(); if (window == null) return; IWorkbenchPage page = window.getActivePage(); if (page == null) return; String name = targetName == null ? getFileName(url) : targetName; IEditorInput input = MindMapUI.getEditorInputFactory() .createEditorInputForPreLoadedWorkbook(workbook, name); try { page.openEditor(input, MindMapUI.MINDMAP_EDITOR_ID, true); } catch (PartInitException e) { result[0] = e.getStatus(); return; } if (workbook instanceof ICoreEventSource2) { ((ICoreEventSource2) workbook) .registerOnceCoreEventListener( Core.WorkbookPreSaveOnce, ICoreEventListener.NULL); } result[0] = Status.OK_STATUS; } }); if (result[0] == null) return Status.CANCEL_STATUS; return result[0]; } @Override protected void canceling() { super.canceling(); Thread thread = getThread(); if (thread != null) { thread.interrupt(); } } private static File createTempPath(String url) { String fileName = getFileName(url); String ext = FileUtils.getExtension(fileName); String prefix = fileName.substring(0, fileName.length() - ext.length()); return Core.getWorkspace().createTempFile("download", prefix + "_", //$NON-NLS-1$//$NON-NLS-2$ ext); } private static IStorage createTempStorage() { File tempDir = Core.getWorkspace() .createTempFile("openFromDownloadedFile", "", ".temp"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ tempDir.mkdirs(); return new DirectoryStorage(tempDir); } private static String getFileName(String url) { String path; try { path = new URI(url).getPath(); } catch (URISyntaxException e) { int j = url.lastIndexOf('?'); if (j < 0) path = url; else path = url.substring(0, j); } int i = path.lastIndexOf('/'); if (i < 0) return path; return path.substring(i + 1); } }