/*************************************************************************************
* Copyright (c) 2015 Red Hat, Inc. 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:
* JBoss by Red Hat - Initial implementation.
************************************************************************************/
package org.jboss.tools.common.jdt.debug.internal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.debug.core.model.IPersistableSourceLocator;
import org.eclipse.debug.core.sourcelookup.AbstractSourceLookupDirector;
import org.eclipse.debug.core.sourcelookup.ISourceContainer;
import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.launching.sourcelookup.containers.JavaProjectSourceContainer;
import org.jboss.tools.common.jdt.debug.RemoteDebugActivator;
public class SourceLookupUtil {
public void addSelectedProjects(ILaunchConfigurationWorkingCopy wc, IJavaElement[] selection,
IJavaProject javaProject) throws CoreException {
if(( selection == null || selection.length == 0)) {
// Nothing to do
wc.setAttribute(RemoteDebugActivator.ATTR_SELECTED_PROJECTS, (List<String>)null);
} else {
ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager();
ISourceLookupDirector director = addSourceContainers(manager, wc, selection, javaProject);
if (director != null) {
wc.setAttribute(ILaunchConfiguration.ATTR_SOURCE_LOCATOR_MEMENTO, director.getMemento());
wc.setAttribute(ILaunchConfiguration.ATTR_SOURCE_LOCATOR_ID, director.getId());
}
}
}
private ISourceLookupDirector addSourceContainers(ILaunchManager manager,
ILaunchConfigurationWorkingCopy wc, IJavaElement[] selection, IJavaProject javaProject) throws CoreException {
String memento = null;
String locatorId = null;
try {
memento = wc.getAttribute(ILaunchConfiguration.ATTR_SOURCE_LOCATOR_MEMENTO,(String) null);
locatorId = wc.getAttribute(ILaunchConfiguration.ATTR_SOURCE_LOCATOR_ID,(String) null);
if (locatorId == null) {
locatorId = wc.getType().getSourceLocatorId();
}
} catch (CoreException e) {
RemoteDebugActivator.pluginLog().logError(e);
}
IPersistableSourceLocator locator = manager.newSourceLocator(locatorId);
if (memento != null) {
locator.initializeFromMemento(memento);
} else {
locator.initializeDefaults(wc);
}
if (locator instanceof AbstractSourceLookupDirector) {
ISourceLookupDirector director = (ISourceLookupDirector) locator;
ArrayList<ISourceContainer> sourceContainers = new ArrayList<ISourceContainer>(Arrays.asList(director.getSourceContainers()));
Set<String> projectNames = new LinkedHashSet<String>();
if( javaProject != null ) {
projectNames.add(javaProject.getElementName());
}
for( int i = 0; i < selection.length; i++ ) {
IJavaProject project = selection[i].getJavaProject();
if (project instanceof IJavaProject && !project.equals(javaProject)) {
projectNames.add( ((IJavaProject) project).getElementName());
sourceContainers.add(new JavaProjectSourceContainer((IJavaProject)project));
}
}
director.setSourceContainers((ISourceContainer[]) sourceContainers.toArray(new ISourceContainer[sourceContainers.size()]));
director.setFindDuplicates(true);
List<String> projectsList = new ArrayList<String>();
projectsList.addAll(projectNames);
wc.setAttribute(RemoteDebugActivator.ATTR_SELECTED_PROJECTS, projectsList);
wc.setAttribute(ILaunchConfiguration.ATTR_SOURCE_LOCATOR_MEMENTO, director.getMemento());
wc.setAttribute(ILaunchConfiguration.ATTR_SOURCE_LOCATOR_ID, director.getId());
return director;
} else {
RemoteDebugActivator.pluginLog().logWarning("Launch configuration doesn't support source lookup");
}
return null;
}
}