From: <bd...@us...> - 2011-07-29 07:13:58
|
Revision: 10803 http://unicore.svn.sourceforge.net/unicore/?rev=10803&view=rev Author: bdemuth Date: 2011-07-29 07:13:52 +0000 (Fri, 29 Jul 2011) Log Message: ----------- Deal more gracefully with trying to open very large files with a text editor Modified Paths: -------------- eclipseclient/trunk/plugins/de.fzj.unicore.rcp.servicebrowser/plugin.xml eclipseclient/trunk/plugins/de.fzj.unicore.rcp.servicebrowser/src/main/java/de/fzj/unicore/rcp/servicebrowser/showEditor/RemoteEditorInput.java Added Paths: ----------- eclipseclient/trunk/plugins/de.fzj.unicore.rcp.servicebrowser/src/main/java/de/fzj/unicore/rcp/servicebrowser/exceptions/ eclipseclient/trunk/plugins/de.fzj.unicore.rcp.servicebrowser/src/main/java/de/fzj/unicore/rcp/servicebrowser/exceptions/FileTooLargeException.java eclipseclient/trunk/plugins/de.fzj.unicore.rcp.servicebrowser/src/main/java/de/fzj/unicore/rcp/servicebrowser/problems/ChangeFileAssociationsSolution.java Modified: eclipseclient/trunk/plugins/de.fzj.unicore.rcp.servicebrowser/plugin.xml =================================================================== --- eclipseclient/trunk/plugins/de.fzj.unicore.rcp.servicebrowser/plugin.xml 2011-07-29 07:12:21 UTC (rev 10802) +++ eclipseclient/trunk/plugins/de.fzj.unicore.rcp.servicebrowser/plugin.xml 2011-07-29 07:13:52 UTC (rev 10803) @@ -125,6 +125,9 @@ type="java.lang.Object"> </propertyTester> </extension> + <extension + point="org.eclipse.ui.exportWizards"> + </extension> <extension point="de.fzj.unicore.rcp.logmonitor.problems"> @@ -134,9 +137,42 @@ </complexSolution> </solution> </extension> + <extension - point="org.eclipse.ui.exportWizards"> - </extension> + point="de.fzj.unicore.rcp.logmonitor.problems"> + <matcher> + <simpleMatcher + reasonId="FILE_TOO_LARGE_FOR_EDITING"> + <and> + <or> + <exceptionMatches + exceptionClass="de.fzj.unicore.rcp.servicebrowser.exceptions.FileTooLargeException" + position="deepest"> + </exceptionMatches> + <exceptionMatches + exceptionClass="java.lang.OutOfMemoryError" + position="deepest"> + </exceptionMatches> + </or> + <messageMatches + messagePattern="(?i).*editor.*"> + </messageMatches> + </and> + </simpleMatcher> + </matcher> + <reason> + <simpleReason + description="The selected operation cannot be performed because the file is too large." + id="FILE_TOO_LARGE_FOR_EDITING" + name="The file is too large for the associated editor."> + </simpleReason> + </reason> + <solution> + <complexSolution + class="de.fzj.unicore.rcp.servicebrowser.problems.ChangeFileAssociationsSolution"> + </complexSolution> + </solution> +</extension> <extension point="org.eclipse.ui.exportWizards"> Added: eclipseclient/trunk/plugins/de.fzj.unicore.rcp.servicebrowser/src/main/java/de/fzj/unicore/rcp/servicebrowser/exceptions/FileTooLargeException.java =================================================================== --- eclipseclient/trunk/plugins/de.fzj.unicore.rcp.servicebrowser/src/main/java/de/fzj/unicore/rcp/servicebrowser/exceptions/FileTooLargeException.java (rev 0) +++ eclipseclient/trunk/plugins/de.fzj.unicore.rcp.servicebrowser/src/main/java/de/fzj/unicore/rcp/servicebrowser/exceptions/FileTooLargeException.java 2011-07-29 07:13:52 UTC (rev 10803) @@ -0,0 +1,34 @@ +package de.fzj.unicore.rcp.servicebrowser.exceptions; + + +/** + * This exception can be thrown when a remote site seems to be too large to + * handle, e.g. when we would run out of memory if we were to display it in a + * simple text editor. + * @author bdemuth + * + */ +public class FileTooLargeException extends Exception { + + /** + * + */ + private static final long serialVersionUID = -1341565509493543031L; + + public FileTooLargeException() { + super(); + } + + public FileTooLargeException(String arg0, Throwable arg1) { + super(arg0, arg1); + } + + public FileTooLargeException(String arg0) { + super(arg0); + } + + public FileTooLargeException(Throwable arg0) { + super(arg0); + } + +} Added: eclipseclient/trunk/plugins/de.fzj.unicore.rcp.servicebrowser/src/main/java/de/fzj/unicore/rcp/servicebrowser/problems/ChangeFileAssociationsSolution.java =================================================================== --- eclipseclient/trunk/plugins/de.fzj.unicore.rcp.servicebrowser/src/main/java/de/fzj/unicore/rcp/servicebrowser/problems/ChangeFileAssociationsSolution.java (rev 0) +++ eclipseclient/trunk/plugins/de.fzj.unicore.rcp.servicebrowser/src/main/java/de/fzj/unicore/rcp/servicebrowser/problems/ChangeFileAssociationsSolution.java 2011-07-29 07:13:52 UTC (rev 10803) @@ -0,0 +1,20 @@ +package de.fzj.unicore.rcp.servicebrowser.problems; + +import org.eclipse.ui.ExtensionFactory; + +import de.fzj.unicore.rcp.common.Constants; +import de.fzj.unicore.rcp.logmonitor.problems.ShowPreferencePageSolution; + +public class ChangeFileAssociationsSolution extends ShowPreferencePageSolution { + + public ChangeFileAssociationsSolution() { + super("CHANGE_FILE_ASSOCIATIONS_FOR_EDITING", "FILE_TOO_LARGE_FOR_EDITING", + "Change associated editor for this content type..."); + } + + @Override + protected String getPreferencePageId() { + return "org.eclipse.ui.preferencePages.FileEditors"; + } + +} Modified: eclipseclient/trunk/plugins/de.fzj.unicore.rcp.servicebrowser/src/main/java/de/fzj/unicore/rcp/servicebrowser/showEditor/RemoteEditorInput.java =================================================================== --- eclipseclient/trunk/plugins/de.fzj.unicore.rcp.servicebrowser/src/main/java/de/fzj/unicore/rcp/servicebrowser/showEditor/RemoteEditorInput.java 2011-07-29 07:12:21 UTC (rev 10802) +++ eclipseclient/trunk/plugins/de.fzj.unicore.rcp.servicebrowser/src/main/java/de/fzj/unicore/rcp/servicebrowser/showEditor/RemoteEditorInput.java 2011-07-29 07:13:52 UTC (rev 10803) @@ -60,26 +60,32 @@ import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchWindow; -import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import de.fzj.unicore.rcp.common.utils.PathUtils; import de.fzj.unicore.rcp.servicebrowser.ServiceBrowserActivator; public class RemoteEditorInput extends PlatformObject implements - IPathEditorInput, IStorageEditorInput, IURIEditorInput, - IFileEditorInput, IPartListener, IPropertyListener { +IPathEditorInput, IStorageEditorInput, IURIEditorInput, +IFileEditorInput, IPartListener, IPropertyListener { + private static final String textEditorId = "org.eclipse.ui.DefaultTextEditor"; + private IRemoteFile remoteFile; private CachedFile cachedFile = null; private IFile localFile = null; private IEditorPart editorPart; + // check whether we're trying to use an editor that will read the whole file + // into our memory + private boolean isProblematicEditor = false; + public RemoteEditorInput(IRemoteFile storage) { this.remoteFile = storage; } public void cacheFileAndOpenEditor() { + Job j = new Job("Opening editor") { @Override public IStatus run(IProgressMonitor progress) { @@ -87,8 +93,29 @@ IPath p = new Path(UUID.randomUUID().toString() + "/" + remoteFile.getName()); localFile = PathUtils.getTempFile(p, null); + + IEditorDescriptor desc = PlatformUI.getWorkbench() + .getEditorRegistry().getDefaultEditor(RemoteEditorInput.this.getName()); + + String editorId = textEditorId; + if (desc != null) { + editorId = desc.getId(); + } + isProblematicEditor = textEditorId.equals(editorId); + long fileSize = remoteFile.getSize(); +// if(isProblematicEditor && fileSize > Runtime.getRuntime().freeMemory() - 5*1024*1024) +// { +// // we won't even have 5 MB of memory left +// // so this will use up too much memory +// Exception e = new RemoteFileTooLargeException(); +// ServiceBrowserActivator.log(IStatus.ERROR, "Unable to edit file with this editor, this would cause an OutOfMemoryError.",e); +// return Status.CANCEL_STATUS; +// +// } + cachedFile = new CachedFile(localFile, remoteFile, true); cachedFile.cache(progress); + openEditor(); return Status.OK_STATUS; @@ -201,23 +228,30 @@ IWorkbenchPage page = win.getActivePage(); if (page != null) { IEditorDescriptor desc = PlatformUI.getWorkbench() - .getEditorRegistry().getDefaultEditor(getName()); - String editorId = "org.eclipse.ui.DefaultTextEditor"; + .getEditorRegistry().getDefaultEditor(getName()); + + String editorId = textEditorId; if (desc != null) { editorId = desc.getId(); } IEditorPart editor; try { editor = page.openEditor(RemoteEditorInput.this, - editorId); + editorId,true); + setEditorPart(editor); - } catch (PartInitException e) { - ServiceBrowserActivator.log(IStatus.ERROR, - "Can't open editor : " + e.getMessage(), e); + } + + catch(Exception e) + { + ServiceBrowserActivator.log(IStatus.ERROR, + "Can't open editor : " + e.getMessage(), e); + + } } else { ServiceBrowserActivator.log(IStatus.ERROR, - "Can't open editor : page is null"); + "Can't open editor : page is null"); } } }); @@ -263,5 +297,6 @@ editorPart.getSite().getPage().addPartListener(this); editorPart.addPropertyListener(this); } + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |