package com.mobilesorcery.sdk.internal;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IAdaptable;
import com.mobilesorcery.sdk.core.IFilter;
import com.mobilesorcery.sdk.core.MoSyncNatureTester;
import com.mobilesorcery.sdk.core.MoSyncProject;
public class IsExcludableFromBuildTester extends MoSyncNatureTester {
public static String EXCLUDABLE = "excludable";
public static String INCLUDABLE = "includable";
public IsExcludableFromBuildTester() {
// TODO Auto-generated constructor stub
}
public boolean test(Object receiver, String property, Object[] args,
Object expectedValue) {
MoSyncProject project = extractProject(receiver, property, args,
expectedValue);
if (project != null) {
List<IResource> resources = extractApplicableResources(receiver,
property, args, expectedValue);
return resources.size() > 0;
}
return false;
}
private List<IResource> extractApplicableResources(Object receiver,
String property, Object[] args, Object expectedValue) {
ArrayList result = new ArrayList();
if (receiver instanceof List) {
List list = (List) receiver;
for (int i = 0; i < list.size(); i++) {
IResource resource = extractApplicableResource(list.get(i),
property, args, expectedValue);
if (resource != null) {
result.add(resource);
}
}
} else {
IResource resource = extractApplicableResource(receiver, property,
args, expectedValue);
if (resource != null) {
result.add(resource);
}
}
return result;
}
private IResource extractApplicableResource(Object receiver,
String property, Object[] args, Object expectedValue) {
if (receiver instanceof IResource) {
IResource resource = (IResource) receiver;
if (test(resource, expectedValue)) {
return resource;
}
} else if (receiver instanceof IAdaptable) {
return extractApplicableResource(((IAdaptable) receiver)
.getAdapter(IResource.class), property, args, expectedValue);
}
return null;
}
private boolean test(IResource resource, Object expectedValue) {
boolean isIncludable = INCLUDABLE.equals(expectedValue);
boolean isExcludable = EXCLUDABLE.equals(expectedValue);
if (isExcludable || isIncludable) {
if (resource.getType() == IResource.FILE
|| resource.getType() == IResource.FOLDER) {
IFilter<IResource> filter = MoSyncProject
.getExclusionFilter(MoSyncProject.create(resource.getProject()), true);
boolean isIncluded = filter.accept(resource);
return isExcludable ? isIncluded : !isIncluded;
}
}
return false;
}
}