/*******************************************************************************
* Copyright (c) 2017 Rogue Wave Software Inc. and others.
* 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:
* Rogue Wave Software Inc. - initial implementation
*******************************************************************************/
package org.eclipse.php.phpunit.ui.launch;
import java.util.Arrays;
import java.util.List;
import org.eclipse.core.expressions.PropertyTester;
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.dltk.core.IModelElement;
import org.eclipse.dltk.core.IScriptProject;
import org.eclipse.dltk.core.ISourceModule;
import org.eclipse.php.core.PHPToolkitUtil;
import org.eclipse.php.internal.core.PHPCorePlugin;
import org.eclipse.ui.IFileEditorInput;
public class PHPUnitPropertyTester extends PropertyTester {
private static final String PROPERTY = "testablePHP"; //$NON-NLS-1$
/**
* true only if receiver is a PHP model element and is project or folder, or
* file with extension xml/php/php4/php5, or a method
*/
@Override
public boolean test(Object receiver, String property, Object[] args, Object expectedValue) {
if (!PROPERTY.equals(property)) {
return false;
}
if (!isModelElement(receiver)) {
return false;
}
IResource res = getReceiverResource(receiver);
if (res instanceof IProject) {
try {
return PHPToolkitUtil.isPHPProject((IProject) res);
} catch (CoreException e) {
return false;
}
} else if (res instanceof IFile) {
String ext = ((IFile) res).getFileExtension();
if (ext == null) {
return false;
}
ext = ext.toLowerCase();
String[] acceptedExts = new String[] { "xml", "php", "php5", "php4" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
if (ext != null && Arrays.asList(acceptedExts).contains(ext)) {
return true;
}
} else { // always can run PHPUnit project or folder
return true;
}
return false;
}
private IResource getReceiverResource(Object receiver) {
if (receiver instanceof List) {
List<?> list = (List<?>) receiver;
if (list.size() == 1) {
receiver = list.get(0);
}
}
if (receiver instanceof IFileEditorInput) {
IFileEditorInput ei = (IFileEditorInput) receiver;
receiver = ei.getFile();
}
if (receiver instanceof ISourceModule) {
return ((ISourceModule) receiver).getResource();
}
if (receiver instanceof IFile) {
return (IResource) receiver;
}
if (receiver instanceof IProject) {
return (IProject) receiver;
}
if (receiver instanceof IScriptProject) {
return ((IScriptProject) receiver).getProject();
}
return null;
}
private boolean isModelElement(Object receiver) {
if (receiver instanceof List) {
List<?> list = (List<?>) receiver;
for (Object item : list) {
if (!(item instanceof IModelElement)) {
if (item instanceof IFileEditorInput) {
IFileEditorInput fileEditorInput = (IFileEditorInput) item;
return PHPToolkitUtil.isPHPFile(fileEditorInput.getFile());
} else if (item instanceof IResource) {
IResource folder = (IResource) item;
IProject project = folder.getProject();
try {
return PHPToolkitUtil.isPHPProject(project);
} catch (CoreException e) {
PHPCorePlugin.log(e);
}
}
return false;
}
}
}
return true;
}
}