blob: 837afce5bbb03e684458a04caf2fe19a18045cce [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2014 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Serge Beauchamp (Freescale Semiconductor) - initial API and implementation
* IBM Corporation - ongoing implementation
* James Blackburn (Broadcom Corp.) - ongoing development
* Sergey Prigogin (Google) - bug 424972
*******************************************************************************/
package org.eclipse.core.internal.resources;
import java.util.Iterator;
import java.util.LinkedList;
import org.eclipse.core.filesystem.IFileInfo;
import org.eclipse.core.internal.utils.Messages;
import org.eclipse.core.internal.utils.Policy;
import org.eclipse.core.resources.*;
import org.eclipse.core.resources.filtermatchers.AbstractFileInfoMatcher;
import org.eclipse.core.runtime.*;
import org.eclipse.osgi.util.NLS;
/**
* Class that instantiate IResourceFilter's that are stored in the project description.
*/
public class Filter {
/**
* A placeholder Filter provider that doesn't match any files or folders.
*/
private static class MatchNothingInfoMatcher extends AbstractFileInfoMatcher {
public MatchNothingInfoMatcher() {
}
@Override
public boolean matches(IContainer parent, IFileInfo fileInfo) {
return false;
}
@Override
public void initialize(IProject project, Object arguments) {
// No initialization required.
}
}
FilterDescription description;
IProject project;
AbstractFileInfoMatcher provider = null;
public Filter(IProject project, FilterDescription description) {
this.description = description;
this.project = project;
}
public boolean match(IContainer parent, IFileInfo fileInfo) throws CoreException {
if (provider == null) {
IFilterMatcherDescriptor filterDescriptor = project.getWorkspace().getFilterMatcherDescriptor(getId());
if (filterDescriptor != null)
provider = ((FilterDescriptor) filterDescriptor).createFilter();
if (provider == null) {
String message = NLS.bind(Messages.filters_missingFilterType, getId());
Policy.log(new Status(IStatus.ERROR, ResourcesPlugin.PI_RESOURCES, Platform.PLUGIN_ERROR, message, new Error()));
// Avoid further initialization attempts by instantiating a placeholder filter
// provider that doesn't match any files or folders.
provider = new MatchNothingInfoMatcher();
}
try {
provider.initialize(project, description.getFileInfoMatcherDescription().getArguments());
} catch (CoreException e) {
Policy.log(e.getStatus());
provider = null;
}
}
if (provider != null)
return provider.matches(parent, fileInfo);
return false;
}
public boolean isFirst() {
IFilterMatcherDescriptor descriptor = project.getWorkspace().getFilterMatcherDescriptor(getId());
if (descriptor != null)
return descriptor.isFirstOrdering();
return false;
}
public Object getArguments() {
return description.getFileInfoMatcherDescription().getArguments();
}
public String getId() {
return description.getFileInfoMatcherDescription().getId();
}
public int getType() {
return description.getType();
}
public boolean isIncludeOnly() {
return (getType() & IResourceFilterDescription.INCLUDE_ONLY) != 0;
}
public boolean appliesTo(IFileInfo info) {
if (info.isDirectory())
return (getType() & IResourceFilterDescription.FOLDERS) != 0;
return (getType() & IResourceFilterDescription.FILES) != 0;
}
public static IFileInfo[] filter(IProject project, LinkedList<Filter> includeFilters, LinkedList<Filter> excludeFilters, IContainer parent, IFileInfo[] list) throws CoreException {
IFileInfo[] result = filterIncludes(project, includeFilters, parent, list);
return filterExcludes(project, excludeFilters, parent, result);
}
public static IFileInfo[] filterIncludes(IProject project, LinkedList<Filter> filters, IContainer parent, IFileInfo[] list) throws CoreException {
if (filters.size() > 0) {
IFileInfo[] result = new IFileInfo[list.length];
int outputIndex = 0;
for (IFileInfo info : list) {
Iterator<Filter> objIt = filters.iterator();
boolean filtersWereApplicable = false;
while (objIt.hasNext()) {
Filter filter = objIt.next();
if (filter.appliesTo(info)) {
filtersWereApplicable = true;
if (filter.match(parent, info)) {
result[outputIndex++] = info;
break;
}
}
}
if (!filtersWereApplicable)
result[outputIndex++] = info;
}
if (outputIndex != result.length) {
IFileInfo[] tmp = new IFileInfo[outputIndex];
System.arraycopy(result, 0, tmp, 0, outputIndex);
result = tmp;
}
return result;
}
return list;
}
public static IFileInfo[] filterExcludes(IProject project, LinkedList<Filter> filters, IContainer parent, IFileInfo[] list) throws CoreException {
if (filters.size() > 0) {
IFileInfo[] result = new IFileInfo[list.length];
int outputIndex = 0;
for (IFileInfo info : list) {
Iterator<Filter> objIt = filters.iterator();
boolean shouldBeExcluded = false;
while (objIt.hasNext()) {
Filter filter = objIt.next();
if (filter.appliesTo(info)) {
if (filter.match(parent, info)) {
shouldBeExcluded = true;
break;
}
}
}
if (!shouldBeExcluded)
result[outputIndex++] = info;
}
if (outputIndex != result.length) {
IFileInfo[] tmp = new IFileInfo[outputIndex];
System.arraycopy(result, 0, tmp, 0, outputIndex);
result = tmp;
}
return result;
}
return list;
}
}