/**
* Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved.
* Licensed under the terms of the Eclipse Public License (EPL).
* Please see the license.txt included with this distribution for details.
* Any modifications to this file must keep this entire header intact.
*/
package org.python.pydev.navigator.elements;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.core.filesystem.IFileInfo;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.mapping.ResourceMapping;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.debug.ui.actions.IToggleBreakpointsTarget;
import org.eclipse.debug.ui.actions.IWatchExpressionFactoryAdapter2;
import org.eclipse.search.ui.ISearchPageScoreComputer;
import org.eclipse.ui.IContributorResourceAdapter;
import org.eclipse.ui.model.IWorkbenchAdapter;
import org.eclipse.ui.model.IWorkbenchAdapter2;
import org.eclipse.ui.progress.IDeferredWorkbenchAdapter;
import org.eclipse.ui.views.tasklist.ITaskListResourceAdapter;
import org.python.pydev.core.FullRepIterable;
import org.python.pydev.core.log.Log;
import com.aptana.shared_core.string.FastStringBuffer;
/**
* This class represents a resource that is wrapped for the python model.
*
* @author Fabio
*
* @param <X>
*/
public class WrappedResource<X extends IResource> implements IWrappedResource, IContributorResourceAdapter, IAdaptable {
protected IWrappedResource parentElement;
protected X actualObject;
protected PythonSourceFolder pythonSourceFolder;
protected int rank;
public WrappedResource(IWrappedResource parentElement, X actualObject, PythonSourceFolder pythonSourceFolder,
int rank) {
this.parentElement = parentElement;
this.actualObject = actualObject;
this.pythonSourceFolder = pythonSourceFolder;
this.pythonSourceFolder.addChild(this);
this.rank = rank;
}
public X getActualObject() {
return actualObject;
}
public IWrappedResource getParentElement() {
return parentElement;
}
public PythonSourceFolder getSourceFolder() {
return pythonSourceFolder;
}
public int getRank() {
return rank;
}
public IResource getAdaptedResource(IAdaptable adaptable) {
return (IResource) getActualObject();
}
public boolean equals(Object other) {
if (other instanceof IWrappedResource) {
if (other == this) {
return true;
}
IWrappedResource w = (IWrappedResource) other;
return this.actualObject.equals(w.getActualObject());
}
return false;
//now returns always false because it could generate null things in the search page... the reason is that when the
//decorator manager had an update and passed in the search page, it thought that a file/folder was the python file/folder,
//and then, later when it tried to update it with that info, it ended up removing the element because it didn't know how
//to handle it.
//
// -- and this was also not a correct equals, because other.equals(this) would not return true as this was returning
// (basically we can't compare apples to oranges)
// return actualObject.equals(other);
}
@Override
public int hashCode() {
return this.getActualObject().hashCode();
}
public Object getAdapter(Class adapter) {
if (adapter == IContributorResourceAdapter.class) {
return this;
}
return this.getAdapterFromActualObject((IResource) this.getActualObject(), adapter);
}
public String toString() {
FastStringBuffer buf = new FastStringBuffer();
buf.append(FullRepIterable.getLastPart(super.toString())); //something as org.eclipse.ui.internal.WorkingSet@2813 will become WorkingSet@2813
buf.append(" (");
buf.append(this.getActualObject().toString());
buf.append(")");
return buf.toString();
}
public static Set<Class> logged = new HashSet<Class>();
private static Object lock = new Object();
public static Object getAdapterFromActualObject(IResource actualObject2, Class adapter) {
if (IProject.class.equals(adapter) || IResource.class.equals(adapter) || IFolder.class.equals(adapter)
|| IContainer.class.equals(adapter) || IFile.class.equals(adapter)
|| ResourceMapping.class.equals(adapter) || IFileStore.class.equals(adapter)
||
//Added in 3.6
ISearchPageScoreComputer.class.equals(adapter) || IToggleBreakpointsTarget.class.equals(adapter)
|| ITaskListResourceAdapter.class.equals(adapter) || IFileInfo.class.equals(adapter)) {
return actualObject2.getAdapter(adapter);
}
try {
if (IWatchExpressionFactoryAdapter2.class.equals(adapter)) {
return actualObject2.getAdapter(adapter);
}
} catch (Throwable e) {
//Ignore (not available in eclipse 3.2)
}
if (IDeferredWorkbenchAdapter.class.equals(adapter) || IWorkbenchAdapter2.class.equals(adapter)
|| IWorkbenchAdapter.class.equals(adapter)) {
return null;
}
synchronized (lock) {
if (!logged.contains(adapter)) {
logged.add(adapter);
//Only log once per session.
Log.logInfo("Did not expect adapter request: " + adapter);
}
}
return null;
}
}