/******************************************************************************* * Copyright (c) 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.zend.php.zendserver.deployment.ui; import java.util.*; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceDelta; import org.eclipse.core.resources.IResourceDeltaVisitor; /** * A visitor which collects changed class files. */ public class ChangedFilesVisitor implements IResourceDeltaVisitor { private static final IProject[] ZERO_PROJECTS = new IProject[0]; /** * The collection of changed class files. */ final protected Map<IProject, List<IResourceDelta>> map = new HashMap<IProject, List<IResourceDelta>>(); /** * Answers whether children should be visited. * <p> * If the associated resource is a file which has been changed, record it. */ public boolean visit(IResourceDelta delta) { if (delta == null) return false; if (delta.getKind() == IResourceDelta.REMOVED || delta.getKind() == IResourceDelta.ADDED) { addResourceDelta(delta); return true; } if (0 == (delta.getKind() & IResourceDelta.CHANGED)) { return false; } IResource resource = delta.getResource(); if (resource != null) { switch (resource.getType()) { case IResource.FOLDER: // ignore configuration folders (.settings,.svn) String name = resource.getName(); if (name.startsWith(".")) { //$NON-NLS-1$ return false; } break; case IResource.FILE: if (0 == (delta.getFlags() & IResourceDelta.CONTENT)) return false; addResourceDelta(delta); return false; default: return true; } } return true; } private void addResourceDelta(IResourceDelta delta) { IResource resource = delta.getResource(); IProject project = resource.getProject(); List<IResourceDelta> deltas = map.get(project); if (deltas == null) { deltas = new ArrayList<IResourceDelta>(); } deltas.add(delta); map.put(project, deltas); } public IProject[] getAllProjects() { Set<IProject> keySet = map.keySet(); if (keySet.size() == 0) { return ZERO_PROJECTS; } return (IProject[]) keySet.toArray(new IProject[keySet.size()]); } /** * Answers a collection of changed files */ public IResourceDelta[] getChangedFiles(IProject project) { List<IResourceDelta> list = map.get(project); if (list == null) { return null; } return (IResourceDelta[]) list.toArray(new IResourceDelta[list.size()]); } }