/******************************************************************************* * Copyright (c) 2014 Zend Technologies 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: * Zend Technologies - initial API and implementation *******************************************************************************/ package org.eclipse.php.internal.core.libfolders; import java.util.Collection; import java.util.HashSet; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceDelta; import org.eclipse.core.resources.IResourceDeltaVisitor; import org.eclipse.core.runtime.CoreException; import org.eclipse.php.internal.core.PHPCorePlugin; import org.eclipse.php.internal.core.project.PHPNature; /** * A resource delta visitor that finds in a resource delta all project that are * opened or have a new folder added. * * @author Kaloyan Raev */ public class OpenedAndChangedProjectsFinder implements IResourceDeltaVisitor { private IResourceDelta fDelta; private Collection<IProject> fFoundProjects; /** * Creates a new finder for the given resource delta. * * @param delta * a resource delta */ public OpenedAndChangedProjectsFinder(IResourceDelta delta) { fDelta = delta; } public boolean visit(IResourceDelta delta) throws CoreException { IResource resource = delta.getResource(); if (resource == null) return false; switch (resource.getType()) { case IResource.ROOT: return visitWorkspaceRoot(delta); case IResource.PROJECT: return visitProject(delta); case IResource.FOLDER: return visitFolder(delta); default: return false; } } /** * Returns all found projects in the resource delta. * * @return an array of projects */ public IProject[] getFoundProjects() { if (fFoundProjects == null) { fFoundProjects = new HashSet<IProject>(); try { fDelta.accept(this); } catch (CoreException e) { PHPCorePlugin.log(e); } } return fFoundProjects.toArray(new IProject[fFoundProjects.size()]); } private boolean visitWorkspaceRoot(IResourceDelta delta) { return delta.getKind() == IResourceDelta.CHANGED; } private boolean visitProject(IResourceDelta delta) throws CoreException { if ((delta.getFlags() & (IResourceDelta.OPEN | IResourceDelta.DESCRIPTION)) == 0) // visit project folders return true; IProject project = (IProject) delta.getResource(); if (!project.isOpen()) // the project is closed return false; if (!project.hasNature(PHPNature.ID)) // not a PHP project return false; // add the project to found projects fFoundProjects.add(project); // no need to visit project folders return false; } private boolean visitFolder(IResourceDelta delta) { if (delta.getKind() == IResourceDelta.ADDED) { // add folder's project to found projects IProject project = delta.getResource().getProject(); fFoundProjects.add(project); // no need to visit subfolders return false; } // visit subfolders return true; } }