/******************************************************************************* * Copyright (c) 2008, 2010 IBM Corporation 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: * Serge Beauchamp (Freescale Semiconductor) - initial API and implementation * IBM Corporation - ongoing implementation *******************************************************************************/ 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 { 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()); throw new CoreException(new Status(IStatus.ERROR, ResourcesPlugin.PI_RESOURCES, Platform.PLUGIN_ERROR, message, new Error())); } 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 (int i= 0; i < list.length; i++) { IFileInfo info= list[i]; Iterator objIt= filters.iterator(); boolean filtersWereApplicable= false; while (objIt.hasNext()) { Filter 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 (int i= 0; i < list.length; i++) { IFileInfo info= list[i]; Iterator objIt= filters.iterator(); boolean shouldBeExcluded= false; while (objIt.hasNext()) { Filter 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; } }