content: /*
   * Copyright (c) 2009 Andrejs Jermakovics.
   * 
   * 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:
   *     Andrejs Jermakovics - initial implementation
   */
  package it.unibz.instasearch.indexing;
  
  import java.util.ArrayList;
  import java.util.Collection;
  import java.util.LinkedList;
  import java.util.List;
  import java.util.regex.Pattern;
  
  import org.eclipse.core.resources.IContainer;
  import org.eclipse.core.resources.IProject;
  import org.eclipse.core.resources.IResource;
  import org.eclipse.core.resources.IResourceVisitor;
  import org.eclipse.core.runtime.CoreException;
  
  public class ResourceCollector implements IResourceVisitor
  {
  	private Collection<IContainer> containers = new LinkedList<IContainer>();
  	private List<Pattern> excludedPatterns = new ArrayList<Pattern>();
  	
  	public ResourceCollector() {
  	}
  	
  	public boolean visit(IResource resource) throws CoreException {
  		
  		if( !(resource instanceof IContainer) )
  			return false;
  		
  		if( isResourceExcluded(resource, excludedPatterns) )
  			return false;
  		
  		switch(resource.getType()) 
  		{
  		case IResource.FOLDER:
  			containers.add((IContainer)resource);
  			break;
  		case IResource.PROJECT:
  			return visit((IProject) resource);
  		}
  		
  		return true; 
  	}
  	
  	
  	/**
  	 * @param resource
  	 * @param excludedDirPatterns
  	 * @return
  	 */
  	static boolean isResourceExcluded(IResource resource,
  			List<Pattern> excludedDirPatterns)
  	{
  		String path = resource.getFullPath().toString();
  		
  		if( path.startsWith("/") ) path = path.substring(1);
  		
  		for(Pattern pattern: excludedDirPatterns)
  		{
  			if( pattern.matcher(path).matches() )
  				return true;
  		}
  		
  		return false;
  	}
  
  	public boolean visit(IProject project) {
  		if( !project.isOpen()  ) // don't visit closed projects
  			return false;
  		
  		containers.add(project);
  		
  		return true;
  	}
  	
  	public Collection<IContainer> getContainers() {
  		return containers;
  	}
  	
  	/**
  	 * 
  	 */
  	public void clear() {
  		 containers.clear();
  		 excludedPatterns.clear();
  	}
  
  	/**
  	 * @param excludedDirRegExes 
  	 */
  	public void setExcludedDirRegExes(List<Pattern> excludedDirRegExes) {
  		 this.excludedPatterns = new ArrayList<Pattern>(excludedDirRegExes);
  	}
  
  }