LaunchModeComputer.java
package com.codeaffine.extras.launch.internal.dialog;
import static java.util.Objects.requireNonNull;
import java.util.stream.Stream;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchMode;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.debug.ui.ILaunchGroup;
public class LaunchModeComputer {
private final ILaunchConfiguration launchConfig;
private final ILaunchMode preferredLaunchMode;
public LaunchModeComputer( ILaunchConfiguration launchConfig, ILaunchMode preferredLaunchMode ) {
requireNonNull( launchConfig, "launchConfig" );
this.launchConfig = launchConfig;
this.preferredLaunchMode = preferredLaunchMode;
}
public ILaunchMode computeLaunchMode() {
ILaunchMode result;
if( isLaunchModeSupported( preferredLaunchMode ) ) {
result = preferredLaunchMode;
} else {
result = findAlternativeLaunchMode();
}
return result;
}
public ILaunchGroup computeLaunchGroup() {
ILaunchGroup result = null;
ILaunchMode launchMode = computeLaunchMode();
if( launchMode != null ) {
result = DebugUITools.getLaunchGroup( launchConfig, launchMode.getIdentifier() );
}
return result;
}
private ILaunchMode findAlternativeLaunchMode() {
return Stream.of( allLaunchModes() ).filter( this::isLaunchModeSupported ).findFirst().orElse( null );
}
private boolean isLaunchModeSupported( ILaunchMode launchMode ) {
try {
return launchMode != null && launchConfig.supportsMode( launchMode.getIdentifier() );
} catch( CoreException ignore ) {
return false;
}
}
private static ILaunchMode[] allLaunchModes() {
return DebugPlugin.getDefault().getLaunchManager().getLaunchModes();
}
}