1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-13 20:15:22 +02:00

[238294] ClassCastException using Link With Editor

This commit is contained in:
David McKnight 2008-07-07 19:40:59 +00:00
parent f0dc80f98b
commit 40f3441b57

View file

@ -11,6 +11,7 @@
* *
* Contributors: * Contributors:
* David McKnight (IBM) - [187711] Link with Editor action for System View * David McKnight (IBM) - [187711] Link with Editor action for System View
* David McKnight (IBM) - [238294] ClassCastException using Link With Editor
*******************************************************************************/ *******************************************************************************/
package org.eclipse.rse.internal.files.ui.actions; package org.eclipse.rse.internal.files.ui.actions;
@ -29,12 +30,12 @@ import org.eclipse.rse.core.RSECorePlugin;
import org.eclipse.rse.core.filters.ISystemFilter; import org.eclipse.rse.core.filters.ISystemFilter;
import org.eclipse.rse.core.filters.ISystemFilterPoolReferenceManager; import org.eclipse.rse.core.filters.ISystemFilterPoolReferenceManager;
import org.eclipse.rse.core.filters.ISystemFilterReference; import org.eclipse.rse.core.filters.ISystemFilterReference;
import org.eclipse.rse.core.subsystems.ISubSystem;
import org.eclipse.rse.internal.files.ui.FileResources; import org.eclipse.rse.internal.files.ui.FileResources;
import org.eclipse.rse.internal.files.ui.resources.SystemRemoteEditManager; import org.eclipse.rse.internal.files.ui.resources.SystemRemoteEditManager;
import org.eclipse.rse.internal.ui.view.SystemViewPart; import org.eclipse.rse.internal.ui.view.SystemViewPart;
import org.eclipse.rse.subsystems.files.core.SystemIFileProperties; import org.eclipse.rse.subsystems.files.core.SystemIFileProperties;
import org.eclipse.rse.subsystems.files.core.model.RemoteFileFilterString; import org.eclipse.rse.subsystems.files.core.model.RemoteFileFilterString;
import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFile;
import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFileSubSystem; import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFileSubSystem;
import org.eclipse.rse.ui.view.ContextObject; import org.eclipse.rse.ui.view.ContextObject;
import org.eclipse.rse.ui.view.ISystemEditableRemoteObject; import org.eclipse.rse.ui.view.ISystemEditableRemoteObject;
@ -65,18 +66,23 @@ public class LinkWithSystemViewAction implements IViewActionDelegate {
private Object _parentObject; private Object _parentObject;
private Object[] _children; private Object[] _children;
private ISystemTree _systemTree; private ISystemTree _systemTree;
private IRemoteFile _targetRemoteFile; private IAdaptable _targetRemoteObj;
private ISystemFilterReference _filterReference; private ISystemFilterReference _filterReference;
public ShowChildrenInTree(Object parentObject, Object[] children, ISystemFilterReference filterReference, ISystemTree systemTree, IRemoteFile targetRemoteFile) public ShowChildrenInTree(Object parentObject, Object[] children, ISystemFilterReference filterReference, ISystemTree systemTree, IAdaptable targetRemoteObj)
{ {
_parentObject = parentObject; _parentObject = parentObject;
_children = children; _children = children;
_systemTree = systemTree; _systemTree = systemTree;
_targetRemoteFile = targetRemoteFile; _targetRemoteObj = targetRemoteObj;
_filterReference = filterReference; _filterReference = filterReference;
} }
private String getAbsolutePath(IAdaptable adaptable){
ISystemViewElementAdapter adapter = (ISystemViewElementAdapter)adaptable.getAdapter(ISystemViewElementAdapter.class);
return adapter.getAbsoluteName(adaptable);
}
public void run() public void run()
{ {
// make sure the filter is expanded // make sure the filter is expanded
@ -90,29 +96,30 @@ public class LinkWithSystemViewAction implements IViewActionDelegate {
_systemTree.createTreeItems(item, _children); _systemTree.createTreeItems(item, _children);
item.setExpanded(true); item.setExpanded(true);
IRemoteFile containingFolder = null; IAdaptable containingFolder = null;
// is one of these items our remote file? // is one of these items our remote file?
for (int i = 0; i < item.getItemCount(); i++){ for (int i = 0; i < item.getItemCount(); i++){
TreeItem childItem = item.getItem(i); TreeItem childItem = item.getItem(i);
Object data = childItem.getData(); Object data = childItem.getData();
if (data instanceof IRemoteFile){ if (data instanceof IAdaptable){
IRemoteFile childFile = (IRemoteFile)data; IAdaptable childObj = (IAdaptable)data;
String childPath = childFile.getAbsolutePath(); String childPath = getAbsolutePath(childObj);
if (childPath.equals(_targetRemoteFile.getAbsolutePath())){ String targetPath = getAbsolutePath(_targetRemoteObj);
if (childPath.equals(targetPath)){
// select our remote file // select our remote file
_systemTree.getTree().setSelection(childItem); _systemTree.getTree().setSelection(childItem);
return; // we're done! return; // we're done!
} }
else if (_targetRemoteFile.getAbsolutePath().startsWith(childPath)){ else if (targetPath.startsWith(childPath)){
containingFolder = childFile; // using this to start a deeper search for the target remote file containingFolder = childObj; // using this to start a deeper search for the target remote file
} }
} }
} }
// remote file not found so now we have to expand further // remote file not found so now we have to expand further
if (containingFolder != null){ if (containingFolder != null){
LinkFromFolderJob job = new LinkFromFolderJob(containingFolder, _filterReference, _targetRemoteFile, _systemTree); LinkFromFolderJob job = new LinkFromFolderJob(containingFolder, _filterReference, _targetRemoteObj, _systemTree);
job.schedule(); job.schedule();
} }
} }
@ -124,21 +131,28 @@ public class LinkWithSystemViewAction implements IViewActionDelegate {
*/ */
private class LinkFromFolderJob extends Job private class LinkFromFolderJob extends Job
{ {
private IRemoteFileSubSystem _subSystem; private ISubSystem _subSystem;
private IRemoteFile _remoteFolder; private IAdaptable _remoteFolder;
private IRemoteFile _targetRemoteFile; private IAdaptable _targetRemoteObj;
private ISystemTree _systemTree; private ISystemTree _systemTree;
private ISystemFilterReference _filterRef; private ISystemFilterReference _filterRef;
private ISystemViewElementAdapter _adapter;
public LinkFromFolderJob(IRemoteFile remoteFolder, ISystemFilterReference filterRef, IRemoteFile targetRemoteFile, ISystemTree systemTree) { public LinkFromFolderJob(IAdaptable remoteFolder, ISystemFilterReference filterRef, IAdaptable targetRemoteObj, ISystemTree systemTree) {
super(FileResources.MESSAGE_EXPANDING_FOLDER); super(FileResources.MESSAGE_EXPANDING_FOLDER);
_remoteFolder = remoteFolder; _remoteFolder = remoteFolder;
_subSystem = _remoteFolder.getParentRemoteFileSubSystem(); _subSystem = getSubSystem(remoteFolder);
_filterRef = filterRef; // used for context of query _filterRef = filterRef; // used for context of query
_targetRemoteFile = targetRemoteFile; _targetRemoteObj = targetRemoteObj;
_systemTree = systemTree; _systemTree = systemTree;
} }
private ISubSystem getSubSystem(IAdaptable adaptable)
{
ISystemViewElementAdapter adapter = (ISystemViewElementAdapter)adaptable.getAdapter(ISystemViewElementAdapter.class);
return adapter.getSubSystem(adaptable);
}
public IStatus run(IProgressMonitor monitor){ public IStatus run(IProgressMonitor monitor){
try try
{ {
@ -157,7 +171,7 @@ public class LinkWithSystemViewAction implements IViewActionDelegate {
// put these items in the tree and look for remoteFile // put these items in the tree and look for remoteFile
// if we can't find the remote file under this filter, the ShowChildrenInTree will recurse // if we can't find the remote file under this filter, the ShowChildrenInTree will recurse
Display.getDefault().asyncExec(new ShowChildrenInTree(_remoteFolder, children, _filterRef, _systemTree, _targetRemoteFile)); Display.getDefault().asyncExec(new ShowChildrenInTree(_remoteFolder, children, _filterRef, _systemTree, _targetRemoteObj));
} }
catch (Exception e){ catch (Exception e){
} }
@ -171,18 +185,29 @@ public class LinkWithSystemViewAction implements IViewActionDelegate {
*/ */
private class LinkFromFilterJob extends Job private class LinkFromFilterJob extends Job
{ {
private IRemoteFileSubSystem _subSystem; private ISubSystem _subSystem;
private IRemoteFile _targetRemoteFile; private IAdaptable _targetRemoteObj;
private ISystemTree _systemTree; private ISystemTree _systemTree;
public LinkFromFilterJob(IRemoteFile targetRemoteFile, ISystemTree systemTree) { public LinkFromFilterJob(IAdaptable targetRemoteObject, ISystemTree systemTree) {
super(FileResources.MESSAGE_EXPANDING_FILTER); super(FileResources.MESSAGE_EXPANDING_FILTER);
_targetRemoteFile = targetRemoteFile; _targetRemoteObj = targetRemoteObject;
_subSystem = _targetRemoteFile.getParentRemoteFileSubSystem(); _subSystem = getSubSystem(_targetRemoteObj);
_systemTree = systemTree; _systemTree = systemTree;
} }
private ISystemViewElementAdapter getAdapter(IAdaptable adaptable)
{
return (ISystemViewElementAdapter)adaptable.getAdapter(ISystemViewElementAdapter.class);
}
private ISubSystem getSubSystem(IAdaptable adaptable)
{
ISystemViewElementAdapter adapter = getAdapter(adaptable);
return adapter.getSubSystem(adaptable);
}
public IStatus run(IProgressMonitor monitor){ public IStatus run(IProgressMonitor monitor){
try try
{ {
@ -193,16 +218,12 @@ public class LinkWithSystemViewAction implements IViewActionDelegate {
// the object is nowhere to be found! // the object is nowhere to be found!
return Status.OK_STATUS; return Status.OK_STATUS;
} }
// get the adapter
ISystemViewElementAdapter adapter = (ISystemViewElementAdapter)((IAdaptable)ref).getAdapter(ISystemViewElementAdapter.class);
// get the context // get the context
ContextObject contextObject = new ContextObject(ref, _subSystem, ref); ContextObject contextObject = new ContextObject(ref, _subSystem, ref);
// get the children // get the children
Object[] children = adapter.getChildren(contextObject, monitor); Object[] children = getAdapter((IAdaptable)ref).getChildren(contextObject, monitor);
if (monitor.isCanceled()){ if (monitor.isCanceled()){
return Status.CANCEL_STATUS; return Status.CANCEL_STATUS;
@ -210,16 +231,17 @@ public class LinkWithSystemViewAction implements IViewActionDelegate {
// put these items in the tree and look for remoteFile // put these items in the tree and look for remoteFile
// if we can't find the remote file under this filter, the ShowChildrenInTree will recurse // if we can't find the remote file under this filter, the ShowChildrenInTree will recurse
Display.getDefault().asyncExec(new ShowChildrenInTree(ref, children, ref, _systemTree, _targetRemoteFile)); Display.getDefault().asyncExec(new ShowChildrenInTree(ref, children, ref, _systemTree, _targetRemoteObj));
} }
catch (Exception e){ catch (Exception e){
e.printStackTrace();
} }
return Status.OK_STATUS; return Status.OK_STATUS;
} }
private ISystemFilterReference findMatchingFilterReference() private ISystemFilterReference findMatchingFilterReference()
{ {
String remoteObjectName = _targetRemoteFile.getAbsolutePath(); String remoteObjectName = getAbsolutePath(_targetRemoteObj);
ISystemFilterPoolReferenceManager refmgr = _subSystem.getFilterPoolReferenceManager(); ISystemFilterPoolReferenceManager refmgr = _subSystem.getFilterPoolReferenceManager();
if (refmgr != null){ if (refmgr != null){
ISystemFilterReference[] refs = refmgr.getSystemFilterReferences(_subSystem); ISystemFilterReference[] refs = refmgr.getSystemFilterReferences(_subSystem);
@ -234,6 +256,11 @@ public class LinkWithSystemViewAction implements IViewActionDelegate {
return null; return null;
} }
private String getAbsolutePath(IAdaptable adaptable){
ISystemViewElementAdapter adapter = (ISystemViewElementAdapter)adaptable.getAdapter(ISystemViewElementAdapter.class);
return adapter.getAbsoluteName(adaptable);
}
private boolean doesFilterEncompass(ISystemFilter filter, String remoteObjectAbsoluteName) private boolean doesFilterEncompass(ISystemFilter filter, String remoteObjectAbsoluteName)
{ {
boolean would = false; boolean would = false;
@ -247,10 +274,12 @@ public class LinkWithSystemViewAction implements IViewActionDelegate {
{ {
// my home filter - will encompass iff remoteObjectAbsoluteName is within the home dir // my home filter - will encompass iff remoteObjectAbsoluteName is within the home dir
try try
{ {
IRemoteFile homeDir = _subSystem.getRemoteFileObject(".", new NullProgressMonitor()); IAdaptable homeObj = (IAdaptable)_subSystem.getObjectWithAbsoluteName(".", new NullProgressMonitor());
String homePath = homeDir.getAbsolutePath(); if (homeObj != null){
would = remoteObjectAbsoluteName.startsWith(homePath); String homePath = getAbsolutePath(homeObj);
would = remoteObjectAbsoluteName.startsWith(homePath);
}
} }
catch (Exception e){ catch (Exception e){
} }
@ -264,37 +293,42 @@ public class LinkWithSystemViewAction implements IViewActionDelegate {
private boolean doesFilterStringEncompass(String filterString, String remoteObjectAbsoluteName) private boolean doesFilterStringEncompass(String filterString, String remoteObjectAbsoluteName)
{ {
RemoteFileFilterString rffs = new RemoteFileFilterString(_subSystem.getParentRemoteFileSubSystemConfiguration(), filterString); if (_subSystem instanceof IRemoteFileSubSystem){
// ok, this is a tweak: if the absolute name has " -folder" at the end, that means it is a folder... RemoteFileFilterString rffs = new RemoteFileFilterString(((IRemoteFileSubSystem)_subSystem).getParentRemoteFileSubSystemConfiguration(), filterString);
if (remoteObjectAbsoluteName.endsWith(" -folder")) //$NON-NLS-1$ // ok, this is a tweak: if the absolute name has " -folder" at the end, that means it is a folder...
{ if (remoteObjectAbsoluteName.endsWith(" -folder")) //$NON-NLS-1$
if (!rffs.getShowSubDirs()) {
if (!rffs.getShowSubDirs())
return false;
remoteObjectAbsoluteName = remoteObjectAbsoluteName.substring(0, remoteObjectAbsoluteName.indexOf(" -folder")); //$NON-NLS-1$
}
// problem 1: we don't know if the given remote object name represents a file or folder. We have to assume a file,
// since we don't support filtering by folder names.
if (!rffs.getShowFiles())
return false; return false;
remoteObjectAbsoluteName = remoteObjectAbsoluteName.substring(0, remoteObjectAbsoluteName.indexOf(" -folder")); //$NON-NLS-1$
}
// problem 1: we don't know if the given remote object name represents a file or folder. We have to assume a file,
// since we don't support filtering by folder names.
if (!rffs.getShowFiles())
return false;
// step 1: verify the path of the remote object matches the path of the filter string // step 1: verify the path of the remote object matches the path of the filter string
String container = rffs.getPath(); String container = rffs.getPath();
if (container == null) if (container == null)
return false; return false;
if (container.equals(".")) //$NON-NLS-1$ if (container.equals(".")) //$NON-NLS-1$
{ {
try try
{ {
container = _subSystem.getRemoteFileObject(container, new NullProgressMonitor()).getAbsolutePath(); IAdaptable containerObj = (IAdaptable)_subSystem.getObjectWithAbsoluteName(container, new NullProgressMonitor());
} if (containerObj != null){
catch (Exception e) container = getAbsolutePath(containerObj);
{ }
} }
} catch (Exception e)
{
}
}
if (remoteObjectAbsoluteName.startsWith(container)){ if (remoteObjectAbsoluteName.startsWith(container)){
return true; return true;
}
} }
return false; return false;
@ -308,11 +342,11 @@ public class LinkWithSystemViewAction implements IViewActionDelegate {
*/ */
private class SelectFileJob extends Job private class SelectFileJob extends Job
{ {
private IRemoteFileSubSystem _subSystem; private ISubSystem _subSystem;
private String _path; private String _path;
private ISystemTree _systemTree; private ISystemTree _systemTree;
public SelectFileJob(IRemoteFileSubSystem subSystem, String path, ISystemTree systemTree) { public SelectFileJob(ISubSystem subSystem, String path, ISystemTree systemTree) {
super(FileResources.MESSSAGE_QUERYING_FILE); super(FileResources.MESSSAGE_QUERYING_FILE);
_subSystem = subSystem; _subSystem = subSystem;
_path = path; _path = path;
@ -323,21 +357,21 @@ public class LinkWithSystemViewAction implements IViewActionDelegate {
try try
{ {
// doing query to get the remote file // doing query to get the remote file
final IRemoteFile remoteFile = _subSystem.getRemoteFileObject(_path, monitor); final IAdaptable remoteObj = (IAdaptable)_subSystem.getObjectWithAbsoluteName(_path, monitor);
Display.getDefault().asyncExec(new Runnable() Display.getDefault().asyncExec(new Runnable()
{ {
public void run() public void run()
{ {
// on main thread, looking for the reference in the tree // on main thread, looking for the reference in the tree
TreeItem item = (TreeItem)_systemTree.findFirstRemoteItemReference(remoteFile, null); TreeItem item = (TreeItem)_systemTree.findFirstRemoteItemReference(remoteObj, null);
if (item != null){ if (item != null){
_systemTree.getTree().setSelection(item); _systemTree.getTree().setSelection(item);
} }
else else
{ {
// no reference in the tree so we will search forward from the filter in a job (avoiding query on the main thread) // no reference in the tree so we will search forward from the filter in a job (avoiding query on the main thread)
LinkFromFilterJob job = new LinkFromFilterJob(remoteFile, _systemTree); LinkFromFilterJob job = new LinkFromFilterJob(remoteObj, _systemTree);
job.schedule(); job.schedule();
} }
} }
@ -411,12 +445,12 @@ public class LinkWithSystemViewAction implements IViewActionDelegate {
IFile file = fileInput.getFile(); IFile file = fileInput.getFile();
SystemIFileProperties properties = new SystemIFileProperties(file); SystemIFileProperties properties = new SystemIFileProperties(file);
Object rmtEditable = properties.getRemoteFileObject(); Object rmtEditable = properties.getRemoteFileObject();
IRemoteFile remoteObj = null; IAdaptable remoteObj = null;
IRemoteFileSubSystem subSystem = null; ISubSystem subSystem = null;
if (rmtEditable != null && rmtEditable instanceof ISystemEditableRemoteObject) if (rmtEditable != null && rmtEditable instanceof ISystemEditableRemoteObject)
{ {
ISystemEditableRemoteObject editable = (ISystemEditableRemoteObject) rmtEditable; ISystemEditableRemoteObject editable = (ISystemEditableRemoteObject) rmtEditable;
remoteObj = (IRemoteFile)editable.getRemoteObject(); remoteObj = editable.getRemoteObject();
TreeItem item = (TreeItem)systemTree.findFirstRemoteItemReference(remoteObj, null); TreeItem item = (TreeItem)systemTree.findFirstRemoteItemReference(remoteObj, null);
if (item != null){ if (item != null){
@ -424,7 +458,8 @@ public class LinkWithSystemViewAction implements IViewActionDelegate {
} }
else else
{ {
subSystem = remoteObj.getParentRemoteFileSubSystem(); ISystemViewElementAdapter adapter = (ISystemViewElementAdapter)remoteObj.getAdapter(ISystemViewElementAdapter.class);
subSystem = adapter.getSubSystem(remoteObj);
// no match, so we will expand from filter // no match, so we will expand from filter
// query matching filter in a job (to avoid main thread) // query matching filter in a job (to avoid main thread)
@ -439,7 +474,7 @@ public class LinkWithSystemViewAction implements IViewActionDelegate {
String path = properties.getRemoteFilePath(); String path = properties.getRemoteFilePath();
if (subsystemId != null && path != null) if (subsystemId != null && path != null)
{ {
subSystem = (IRemoteFileSubSystem)RSECorePlugin.getTheSystemRegistry().getSubSystem(subsystemId); subSystem = RSECorePlugin.getTheSystemRegistry().getSubSystem(subsystemId);
if (subSystem != null) if (subSystem != null)
{ {
// query for file in a job (to avoid main thread) // query for file in a job (to avoid main thread)