blob: de82118edc8066371b7547e3d25c3af738bd1e3e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009 xored software, Inc.
*
* 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:
* xored software, Inc. - initial API and Implementation (Alex Panchenko)
*******************************************************************************/
package org.eclipse.dltk.internal.core;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.dltk.core.DLTKCore;
import org.eclipse.dltk.core.IModelElement;
import org.eclipse.dltk.core.IProjectFragment;
import org.eclipse.dltk.core.IScriptFolder;
import org.eclipse.dltk.core.IScriptProject;
import org.eclipse.dltk.core.ISourceModule;
import org.eclipse.dltk.core.ModelException;
public class ProjectRefreshOperation extends ModelOperation {
public ProjectRefreshOperation(IScriptProject[] projects) {
super(projects, new IModelElement[] { DLTKCore.create(ResourcesPlugin
.getWorkspace().getRoot()) }, false);
}
private ModelElementDelta delta = null;
@Override
protected void executeOperation() throws ModelException {
final IModelElement[] projects = elementsToProcess;
beginTask(Messages.ProjectRefreshOperation_0,
(projects != null ? projects.length * 3 : 0) + 1);
if (projects != null) {
for (IModelElement project : projects) {
if (project.getElementType() == IModelElement.SCRIPT_PROJECT) {
refreshProject((IScriptProject) project);
}
}
}
// report delta
if (delta != null) {
addDelta(delta);
delta = null;
}
worked(1);
done();
}
private void refreshProject(IScriptProject project) throws ModelException {
Set<ISourceModule> modules = new HashSet<ISourceModule>();
for (IProjectFragment fragment : project.getProjectFragments()) {
if (!fragment.isExternal()
&& fragment.getKind() == IProjectFragment.K_SOURCE) {
for (IModelElement element : fragment.getChildren()) {
if (element.getElementType() == IModelElement.SCRIPT_FOLDER
&& element.exists()) {
for (ISourceModule module : ((IScriptFolder) element)
.getSourceModules()) {
modules.add(module);
}
}
}
}
}
worked(1);
project.close();
for (IProjectFragment fragment : project.getProjectFragments()) {
if (!fragment.isExternal()
&& fragment.getKind() == IProjectFragment.K_SOURCE) {
for (IModelElement element : fragment.getChildren()) {
if (element.getElementType() == IModelElement.SCRIPT_FOLDER) {
for (ISourceModule module : ((IScriptFolder) element)
.getSourceModules()) {
if (!modules.remove(module)) {
if (delta == null) {
delta = newModelElementDelta();
}
delta.added(module);
}
}
}
}
}
}
worked(1);
for (ISourceModule module : modules) {
if (delta == null) {
delta = newModelElementDelta();
}
delta.removed(module);
final IResource resource = module.getResource();
if (resource != null) {
delta.find(project).addResourceDelta(resource);
}
}
worked(1);
}
}