/*******************************************************************************
* Copyright (c) 2004, 2005 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.debug.ui.sourcelookup;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import org.eclipse.cdt.debug.core.CDebugUtils;
import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocation;
import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocator;
import org.eclipse.cdt.debug.core.sourcelookup.IProjectSourceLocation;
import org.eclipse.cdt.debug.internal.core.sourcelookup.CSourceLookupDirector;
import org.eclipse.cdt.debug.internal.core.sourcelookup.SourceUtils;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.sourcelookup.ISourceContainer;
import org.eclipse.debug.core.sourcelookup.containers.DefaultSourceContainer;
import org.w3c.dom.Element;
/**
* The replacement of the old default source locator. Used only for migration purposes.
*/
public class DefaultSourceLocator extends CSourceLookupDirector {
/* (non-Javadoc)
* @see org.eclipse.debug.core.sourcelookup.AbstractSourceLookupDirector#initializeFromMemento(java.lang.String, org.eclipse.debug.core.ILaunchConfiguration)
*/
public void initializeFromMemento(String memento, ILaunchConfiguration configuration) throws CoreException {
Element rootElement = DebugPlugin.parseDocument(memento);
if (rootElement.getNodeName().equalsIgnoreCase(OldDefaultSourceLocator.ELEMENT_NAME)) {
initializeFromOldMemento(memento, configuration);
} else {
super.initializeFromMemento(memento, configuration);
}
}
private void initializeFromOldMemento(String memento, ILaunchConfiguration configuration) throws CoreException {
dispose();
setLaunchConfiguration(configuration);
OldDefaultSourceLocator old = new OldDefaultSourceLocator();
old.initializeFromMemento(memento);
ICSourceLocator csl = (ICSourceLocator)old.getAdapter(ICSourceLocator.class);
setFindDuplicates(csl.searchForDuplicateFiles());
ICSourceLocation[] locations = csl.getSourceLocations();
// Check if the old source locator includes all referenced projects.
// If so, DefaultSpourceContainer should be used.
IProject project = csl.getProject();
List<IProject> list = CDebugUtils.getReferencedProjects(project);
HashSet<String> names = new HashSet<String>(list.size() + 1);
names.add(project.getName());
for (IProject proj : list) {
names.add(proj.getName());
}
boolean includesDefault = true;
for (int i = 0; i < locations.length; ++i) {
if (locations[i] instanceof IProjectSourceLocation && ((IProjectSourceLocation)locations[i]).isGeneric()) {
if (!names.contains(((IProjectSourceLocation)locations[i]).getProject().getName())) {
includesDefault = false;
break;
}
}
}
// Generate an array of new source containers including DefaultSourceContainer
ArrayList<ICSourceLocation> locs = new ArrayList<ICSourceLocation>(locations.length);
for (int i = 0; i < locations.length; ++i) {
if (!includesDefault || !(locations[i] instanceof IProjectSourceLocation &&
names.contains(((IProjectSourceLocation)locations[i]).getProject().getName()))) {
locs.add(locations[i]);
}
}
ISourceContainer[] containers = SourceUtils.convertSourceLocations(locs.toArray(new ICSourceLocation[locs.size()]));
ArrayList<ISourceContainer> cons = new ArrayList<ISourceContainer>(Arrays.asList(containers));
if (includesDefault) {
DefaultSourceContainer defaultContainer = new DefaultSourceContainer();
defaultContainer.init(this);
cons.add(0, defaultContainer);
}
setSourceContainers(cons.toArray(new ISourceContainer[cons.size()]));
initializeParticipants();
}
}