/*******************************************************************************
* Copyright (c) 2012 Pivotal Software, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Pivotal Software, Inc. - initial API and implementation
*******************************************************************************/
package org.grails.ide.eclipse.core.internal;
import org.eclipse.core.expressions.PropertyTester;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.IType;
import org.grails.ide.eclipse.core.GrailsCoreActivator;
import org.springsource.ide.eclipse.commons.core.SpringCoreUtils;
/**
* @author Christian Dupuis
* @author Nieraj Singh
* @author Kris De Volder
* @since 2.2.0
*/
public class GrailsPropertyTester extends PropertyTester {
public boolean test(Object receiver, String property, Object[] args, Object expectedValue) {
if (receiver instanceof IResource && "isClasspathEnabled".equals(property)) {
return GrailsResourceUtil.hasClasspathContainer((IResource) receiver);
}
else if ((receiver instanceof IResource || receiver instanceof IAdaptable) && "canlaunch".equals(property)) {
IProject project = null;
if (receiver instanceof IResource) {
project = ((IResource) receiver).getProject();
}
else {
IResource res = (IResource) ((IAdaptable) receiver).getAdapter(IResource.class);
if (res != null) {
project = res.getProject();
}
}
return project != null && SpringCoreUtils.hasNature(project, GrailsNature.NATURE_ID)
&& GrailsCoreActivator.getDefault().getInstallManager().getGrailsInstall(project) != null;
}
else if ((receiver instanceof IResource || receiver instanceof IAdaptable) && isTestableResource(receiver)) {
return true;
}
//FIXKDV: We want to be able to select IJavaElements for test running as well
// else if ((receiver instanceof IJavaElement) && "cantest".equals(property)) {
// return isTestableJavaElement((IJavaElement)receiver);
// }
return false;
}
private boolean isTestableJavaElement(IJavaElement receiver) {
System.out.println("isTestableJavaElement? "+receiver);
if (receiver.getElementType() == IJavaElement.TYPE) {
System.out.println("isTestableJavaElement? >> It is a TYPE");
IType type = (IType) receiver;
IPackageFragmentRoot root = (IPackageFragmentRoot) type.getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT);
return GrailsResourceUtil.isSourceFolder(root) && isToplevelType(type);
}
System.out.println("isTestableJavaElement? >> NO: It is NOT a TYPE");
return false;
}
private boolean isToplevelType(IType type) {
return type.getDeclaringType() == null;
}
private boolean isTestableResource(Object receiver) {
IProject project = null;
IResource resource = null;
if (receiver instanceof IResource) {
resource = (IResource) receiver;
}
else if (receiver instanceof IAdaptable) {
IResource res = (IResource) ((IAdaptable) receiver).getAdapter(IResource.class);
if (res != null) {
resource = res;
}
}
if (resource!=null) {
project = resource.getProject();
return GrailsNature.isGrailsProject(project)
&& ( resource instanceof IProject
|| GrailsResourceUtil.isTestFolder(resource)
|| GrailsResourceUtil.isSourceFile(resource) );
}
return false;
}
}