Eclipse插件:如何使用自定义启动配置和流程显示ProcessConsole的启动?

时间:2017-09-20 00:59:11

标签: java eclipse eclipse-plugin

我有一个自定义启动配置,实现ILaunchConfigurationDelegate。我通过IProcess创建了一个新的DebugPlugin.newProcess。我也有自定义流程工厂,因此我获得了自定义IProcess的实例。然后我写入进程的输出流监视器:

public class MyLauncher implements ILaunchConfigurationDelegate {
    @Override
    public void launch(ILaunchConfiguration configuration, String mode, ILaunch launch, IProgressMonitor monitor) throws CoreException {
        if (monitor == null) monitor = new NullProgressMonitor();

        // launch a new process
        MyProcess process = DebugPlugin.newProcess(launch, null, configuration.getName()).getAdapter(MyProcess.class);
        if (process == null) {
            // ERROR
            throw new CoreException(new Status(Status.ERROR, MyPlugin.ID, "Process factory not configured correctly in the launch configuration"));
        }

        process.out.append("Hello, World!\n");

        process.terminate();
    }
}

这一切都很好,但有一点不会发生:控制台不会出现。我可以让自定义控制台显示如下:

MyConsole console = /*code to make a custom console here*/;
console.activate();
ConsolePlugin.getDefault().getConsoleManager().addConsoles(new IConsole[] {console});

但这不是ProcessConsole,这就是Launch API应该为我提供的。它没有自动执行,而且它是启动使用这种控制台的标准程序,所以我知道我必须得到一个以某种方式出现。它被标记为内部,所以我不应该手动制作,我不会想。此外,DebugUITools.getConsole始终返回null

我有一种感觉,这是因为我忘了在我的自定义IProcess中做某事:

public class MyProcess implements IProcess {
    private ILaunch launch;
    private String label;
    private IStreamsProxy proxy;
    private Map<String, String> attributes;
    private boolean terminated;
    public MyOutputStream out;

    public MyProcess(ILaunch launch, String label, Map<String, String> attributes) {
        this.launch = launch;
        this.label = label;
        this.attributes = attributes;

        out = new MyOutputStream();

        proxy = new IStreamsProxy() {
            @Override
            public void write(String input) throws IOException {

            }

            @Override
            public IStreamMonitor getOutputStreamMonitor() {
                return out;
            }

            @Override
            public IStreamMonitor getErrorStreamMonitor() {
                return out;
            }
        };
    }

    @Override
    public <T> T getAdapter(Class<T> adapter) {
        if (adapter.equals(MyProcess.class)) {
            return (T) this;
        }

        return null;
    }

    @Override
    public boolean canTerminate() {
        return true;
    }

    @Override
    public boolean isTerminated() {
        return terminated;
    }

    @Override
    public void terminate() throws DebugException {
        launch.terminate();
        terminated = true;
    }

    @Override
    public String getLabel() {
        return label;
    }

    @Override
    public ILaunch getLaunch() {
        return launch;
    }

    @Override
    public IStreamsProxy getStreamsProxy() {
        return proxy;
    }

    @Override
    public void setAttribute(String key, String value) {
        attributes.put(key, value);
    }

    @Override
    public String getAttribute(String key) {
        return attributes.get(key);
    }

    @Override
    public int getExitValue() throws DebugException {
        return 0;
    }
}

public class MyOutputStream implements IStreamMonitor {
    private String contents = "";
    private List<IStreamListener> listeners = new ArrayList<>();

    @Override
    public void addListener(IStreamListener listener) {
        listeners.add(listener);
    }

    @Override
    public String getContents() {
        return contents;
    }

    @Override
    public void removeListener(IStreamListener listener) {
        listeners.remove(listener);
    }

    public void append(Object o) {
        contents += o;
        listeners.stream().forEach((l)->l.streamAppended(String.valueOf(o), this));
    }
}

因此,简而言之,如何让ProcessConsole出现?当您使用非标准IProcess时,是否可以执行此操作?

1 个答案:

答案 0 :(得分:0)

要为您的流程获取正确的功能,您不应直接实施IProcess;你应该扩展RuntimeProcess。它具有正确激活控制台视图所需的所有方法。

但是,如果您希望直接实施IProcess,则需要执行以下操作:

  • getLaunch().addProcess(this);添加到构造函数的末尾
  • 在正确的位置点火DebugEvent(创建,终止和更改属性)
  • 实施getAdapter以适应接收IProcessIDebugTargetILaunchILaunchConfiguration

如果您执行了所有这些操作,则在启动ProcessConsole时会显示IProcess