/*
* -----------------------------------------------------------------------
* File: $HeadURL: http://keith-laptop/svn/krs/LanguageTest/trunk/org.thanlwinsoft.languagetest/src/org/thanlwinsoft/eclipse/WorkbenchResource.java $
* Revision $LastChangedRevision: 852 $
* Last Modified: $LastChangedDate: 2007-06-09 16:02:23 +0700 (Sat, 09 Jun 2007) $
* Last Change by: $LastChangedBy: keith $
* -----------------------------------------------------------------------
* Copyright (C) 2007 Keith Stribley <devel@thanlwinsoft.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
* -----------------------------------------------------------------------
*/
package org.thanlwinsoft.eclipse;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.QualifiedName;
import org.eclipse.core.runtime.content.IContentDescription;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.ui.IResourceActionFilter;
import org.eclipse.ui.actions.SimpleWildcardTester;
import org.eclipse.ui.model.WorkbenchAdapter;
/**
* An IWorkbenchAdapter that represents IResources.
*/
public abstract class WorkbenchResource extends WorkbenchAdapter implements
IResourceActionFilter
{
/**
* Answer the appropriate base image to use for the resource.
*/
protected abstract ImageDescriptor getBaseImage(IResource resource);
/**
* Returns an image descriptor for this object.
*/
public ImageDescriptor getImageDescriptor(Object o)
{
IResource resource = getResource(o);
return resource == null ? null : getBaseImage(resource);
}
/**
* getLabel method comment.
*/
public String getLabel(Object o)
{
IResource resource = getResource(o);
return resource == null ? null : resource.getName();
}
/**
* Returns the parent of the given object. Returns null if the
* parent is not available.
*/
public Object getParent(Object o)
{
IResource resource = getResource(o);
return resource == null ? null : resource.getParent();
}
/**
* Returns the resource corresponding to this object,
* or null if there is none.
*/
protected IResource getResource(Object o)
{
if (o instanceof IResource) {
return (IResource) o;
}
if (o instanceof IAdaptable) {
return (IResource) ((IAdaptable) o).getAdapter(IResource.class);
}
return null;
}
/**
* Returns whether the specific attribute matches the state of the target
* object.
*
* @param target the target object
* @param name the attribute name
* @param value the attribute value
* @return <code>true</code> if the attribute matches; <code>false</code> otherwise
*/
public boolean testAttribute(Object target, String name, String value)
{
if (!(target instanceof IResource))
{
return false;
}
IResource res = (IResource) target;
if (name.equals(NAME)) {
return SimpleWildcardTester.testWildcardIgnoreCase(value, res
.getName());
} else if (name.equals(PATH)) {
return SimpleWildcardTester.testWildcardIgnoreCase(value, res
.getFullPath().toString());
} else if (name.equals(EXTENSION)) {
return SimpleWildcardTester.testWildcardIgnoreCase(value, res
.getFileExtension());
} else if (name.equals(READ_ONLY)) {
return (res.getResourceAttributes().isReadOnly() == value.equalsIgnoreCase("true"));//$NON-NLS-1$
} else if (name.equals(PROJECT_NATURE)) {
try {
IProject proj = res.getProject();
return proj.isAccessible() && proj.hasNature(value);
} catch (CoreException e) {
return false;
}
} else if (name.equals(PERSISTENT_PROPERTY)) {
return testProperty(res, true, false, value);
} else if (name.equals(PROJECT_PERSISTENT_PROPERTY)) {
return testProperty(res, true, true, value);
} else if (name.equals(SESSION_PROPERTY)) {
return testProperty(res, false, false, value);
} else if (name.equals(PROJECT_SESSION_PROPERTY)) {
return testProperty(res, false, true, value);
} else if (name.equals(CONTENT_TYPE_ID)) {
return testContentTypeProperty(res, value);
}
return false;
}
/**
* Tests whether the content type for <code>resource</code> matches the
* <code>contentTypeId</code>. It is possible that this method call could
* cause the resource to be read. It is also possible (through poor plug-in
* design) for this method to load plug-ins.
*
* @param resource
* The resource for which the content type should be determined;
* must not be <code>null</code>.
* @param contentTypeId
* The expected content type; must not be <code>null</code>.
* @return <code>true</code> iff the best matching content type has an
* identifier that matches <code>contentTypeId</code>;
* <code>false</code> otherwise.
*/
private final boolean testContentTypeProperty(final IResource resource,
final String contentTypeId)
{
final String expectedValue = contentTypeId.trim();
if (!(resource instanceof IFile)) {
return false;
}
final IFile file = (IFile) resource;
String actualValue = null;
try {
final IContentDescription contentDescription = file
.getContentDescription();
if (contentDescription != null) {
final IContentType contentType = contentDescription
.getContentType();
actualValue = contentType.getId();
}
}
catch (CoreException e)
{
//ignore - this just means the file does not exist or is not accessible
}
return expectedValue == null || expectedValue.equals(actualValue);
}
/**
* Tests whether a session or persistent property on the resource or its project
* matches the given value.
*
* @param resource
* the resource to check
* @param persistentFlag
* <code>true</code> for a persistent property, <code>false</code>
* for a session property
* @param projectFlag
* <code>true</code> to check the resource's project,
* <code>false</code> to check the resource itself
* @param value
* the attribute value, which has either the form "propertyName" or
* "propertyName=propertyValue"
* @return whether there is a match
*/
private boolean testProperty(IResource resource, boolean persistentFlag,
boolean projectFlag, String value)
{
String propertyName;
String expectedVal;
int i = value.indexOf('=');
if (i != -1) {
propertyName = value.substring(0, i).trim();
expectedVal = value.substring(i + 1).trim();
} else {
propertyName = value.trim();
expectedVal = null;
}
try {
QualifiedName key;
int dot = propertyName.lastIndexOf('.');
if (dot != -1) {
key = new QualifiedName(propertyName.substring(0, dot),
propertyName.substring(dot + 1));
} else {
key = new QualifiedName(null, propertyName);
}
IResource resToCheck = projectFlag ? resource.getProject()
: resource;
// getProject() on workspace root can be null
if (resToCheck == null) {
return false;
}
if (persistentFlag) {
String actualVal = resToCheck.getPersistentProperty(key);
if (actualVal == null) {
return false;
}
return expectedVal == null || expectedVal.equals(actualVal);
}
Object actualVal = resToCheck.getSessionProperty(key);
if (actualVal == null) {
return false;
}
return expectedVal == null
|| expectedVal.equals(actualVal.toString());
} catch (CoreException e) {
// ignore
}
return false;
}
}