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
/******************************************************************************* * 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.
/** * 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.
/** * 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; } }