/*******************************************************************************
* Copyright (c) 2000, 2008 QNX Software Systems 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:
* QNX Software Systems - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.model;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.IPathEntry;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.runtime.CoreException;
/**
*/
public class SetPathEntriesOperation extends CModelOperation {
/**
* An empty array of strings indicating that a project doesn't have any prerequesite projects.
*/
static final String[] NO_PREREQUISITES = new String[0];
IPathEntry[] oldResolvedEntries;
IPathEntry[] newRawEntries;
ICProject cproject;
public SetPathEntriesOperation(ICProject project, IPathEntry[] oldResolvedEntries, IPathEntry[] newRawEntries) {
super(project);
this.oldResolvedEntries = oldResolvedEntries;
this.newRawEntries = newRawEntries;
this.cproject = project;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.model.CModelOperation#executeOperation()
*/
@Override
protected void executeOperation() throws CModelException {
// project reference updated - may throw an exception if unable to write .cdtproject file
updateProjectReferencesIfNecessary();
PathEntryManager mgr = PathEntryManager.getDefault();
hasModifiedResource = true;
mgr.saveRawPathEntries(cproject, newRawEntries);
done();
}
protected void updateProjectReferencesIfNecessary() throws CModelException {
PathEntryManager mgr = PathEntryManager.getDefault();
String[] oldRequired = mgr.projectPrerequisites(oldResolvedEntries);
String[] newRequired = mgr.projectPrerequisites(newRawEntries);
try {
IProject projectResource = cproject.getProject();
IProjectDescription description = projectResource.getDescription();
IProject[] projectReferences = description.getReferencedProjects();
HashSet<String> oldReferences = new HashSet<String>(projectReferences.length);
for (IProject projectReference : projectReferences) {
String projectName = projectReference.getName();
oldReferences.add(projectName);
}
@SuppressWarnings("unchecked")
HashSet<String> newReferences = (HashSet<String>) oldReferences.clone();
for (String projectName : oldRequired) {
newReferences.remove(projectName);
}
for (String projectName : newRequired) {
newReferences.add(projectName);
}
Iterator<String> iter;
int newSize = newReferences.size();
checkIdentity : {
if (oldReferences.size() == newSize) {
iter = newReferences.iterator();
while (iter.hasNext()) {
if (!oldReferences.contains(iter.next())) {
break checkIdentity;
}
}
return;
}
}
String[] requiredProjectNames = new String[newSize];
int index = 0;
iter = newReferences.iterator();
while (iter.hasNext()) {
requiredProjectNames[index++] = iter.next();
}
Arrays.sort(requiredProjectNames); // ensure that if changed, the order is consistent
IProject[] requiredProjectArray = new IProject[newSize];
IWorkspaceRoot wksRoot = projectResource.getWorkspace().getRoot();
for (int i = 0; i < newSize; i++) {
requiredProjectArray[i] = wksRoot.getProject(requiredProjectNames[i]);
}
description.setReferencedProjects(requiredProjectArray);
projectResource.setDescription(description, this.fMonitor);
} catch (CoreException e) {
throw new CModelException(e);
}
}
}