class AbstractEditor implements Editor {

    @Override
    public Worker<Transfer> open(final ApplicationQuitCallback quit, final TransferErrorCallback error, final FileWatcherListener listener) {
        final Worker<Transfer> worker = new EditOpenWorker(session.getHost(), this, error,
            new ApplicationQuitCallback() {
                @Override
                public void callback() {
                    quit.callback();
                    close();
                    delete();
                }
            }, this.listener, listener, notification) {
            @Override
            public void cleanup(final Transfer download) {
                // Save checksum before edit
                try {
                    checksum = ChecksumComputeFactory.get(HashAlgorithm.md5).compute(local.getInputStream(), new TransferStatus());
                }
                catch(BackgroundException e) {
                    log.warn(String.format("Error computing checksum for %s. %s", local, e));
                }

            }
        };
        if(log.isDebugEnabled()) {
            log.debug(String.format("Download file for edit %s", local));
        }
        return worker;
    }

    public  AbstractEditor(final Application application,
                          final SessionPool session,
                          final Path file,
                          final ProgressListener listener);
    public  AbstractEditor(final Application application,
                          final SessionPool session,
                          final Path file,
                          final ApplicationLauncher launcher,
                          final ApplicationFinder finder,
                          final ProgressListener listener);

}