Eclipse plugin 如何访问subclipse在运行时使用的SVNClientAdapter?

Eclipse plugin 如何访问subclipse在运行时使用的SVNClientAdapter?,eclipse-plugin,listener,subclipse,Eclipse Plugin,Listener,Subclipse,我正在使用SubclipseAPI,我想实现ISVNOTIFYLISTENT,以便在运行时发现Subclipse事件。我相信我需要将我的notify listener实例添加(订阅)到客户端适配器将通知的侦听器集中,但是我不知道如何在运行时访问Subclipse正在使用的客户端适配器。是否有办法访问它,以便我可以将我的侦听器添加到集合中?抱歉,但不幸的是,Subclipse没有以这种方式编码以提供对内部的访问。Subclipse为需要在Subversion中进行的每个API调用构造一个新的ISV

我正在使用SubclipseAPI,我想实现ISVNOTIFYLISTENT,以便在运行时发现Subclipse事件。我相信我需要将我的notify listener实例添加(订阅)到客户端适配器将通知的侦听器集中,但是我不知道如何在运行时访问Subclipse正在使用的客户端适配器。是否有办法访问它,以便我可以将我的侦听器添加到集合中?

抱歉,但不幸的是,Subclipse没有以这种方式编码以提供对内部的访问。Subclipse为需要在Subversion中进行的每个API调用构造一个新的ISVNClientAdapter对象,并根据需要动态将其ISVNOTIFYLISTER添加到此对象。所以你没有办法打断你自己的听众

也许您可以编写一个实现IConsoleListener的类,并让它充当Subclipse类的代理。然后可以调用SVNProviderPlugin.getConsoleListener来获取当前控制台侦听器,并在类中存储对它的引用。然后调用SVNProviderPlugin.setConsoleListener以将Subclipse中的类替换为您的类。由于事件是在类中激发的,所以您可以将它们转发到Subclipse类,并对代码中的事件执行任何操作。大概是这样的:

import java.io.File;

import org.tigris.subversion.subclipse.core.client.IConsoleListener;
import org.tigris.subversion.svnclientadapter.SVNNodeKind;

public class ProxyListener implements IConsoleListener {

    private IConsoleListener subclipseListener;

    public ProxyListener(IConsoleListener subclipseListener) {
        super();
        this.subclipseListener = subclipseListener;
    }


    public void setCommand(int command) {
        subclipseListener.setCommand(command);
        // TODO add your code

    }

    public void logCommandLine(String commandLine) {
        subclipseListener.logCommandLine(commandLine);
        // TODO add your code

    }

    public void logMessage(String message) {
        subclipseListener.logMessage(message);
        // TODO add your code

    }

    public void logError(String message) {
        subclipseListener.logError(message);
        // TODO add your code

    }

    public void logRevision(long revision, String path) {
        subclipseListener.logRevision(revision , path);
        // TODO add your code

    }

    public void logCompleted(String message) {
        subclipseListener.logCompleted(message);
        // TODO add your code

    }

    public void onNotify(File path, SVNNodeKind kind) {
        subclipseListener.onNotify(path, kind);
        // TODO add your code

    }

}

谢谢你,马克!我的插件中有类似的设置。我还将初始的consoleListener抛出到一个temp中,然后将“this”(这是一个控制台侦听器)设置为SVNProviderPlugin的控制台侦听器。然而,当我测试我的插件并执行各种subclipse命令(如提交)时,我在setCommand、onNotify等中输入的打印语句不会写入控制台。你知道为什么我的控制台侦听器实现没有收到这些事件的通知吗?另外,你提到了将事件转发到Subclipse类(我假设你是指我从SVNProviderPlugin中取出的默认IConsoleListener)。这是Subclipse正常运行所需要做的事情吗?换句话说,我不想破坏Subclipse的功能,我只想在Subclipse事件实时发生时了解它们。在我上面给出的示例中,您将替换Subclipse为您的类提供的事件。如果您的类不充当代理并将调用转发给Subclipse的类,那么它将无法执行其预期的操作。在本例中,Subclipse类负责将结果写入Eclipse控制台。顺便说一句,Eclipse控制台不是标准输出。因此,您不能简单地“打印”来添加内容。您必须编写EclipseSWT代码,以便在您可以看到的地方输出信息。如果你正在写stdout,那么它将显示在Eclipse.log中,你可以在那里看到它。因此,我通过在插件项目上执行'runas'->'eclipseapplication',从Eclipse启动/部署我的插件。它启动了一个新的Eclipse工作区,但我希望打印的输出显示在原始Eclipse工作区的控制台中。我从插件的其他区域看到了我的print语句,但是当我从部署的WS执行subclipse命令时,ProxyListener的setCommand等方法中的print语句根本没有出现。我想我的听众根本没有得到通知。你知道为什么会这样吗?SVNProviderPlugin已设置为使用my ProxyListener。如果未看到任何输出,则不能调用代码。我会检查SVNProviderPlugin对象,看看您的类是否设置为控制台侦听器。也许你在SubclipseUI插件之前设置了你的监听器,它取代了你的监听器。或者这个想法根本不起作用。