Как мне правильно обрабатывать сохранения файлов в проекте платформы NetBeans (плагин)

#java #netbeans #netbeans-platform #netbeans-plugins

#java #netbeans #netbeans-платформа #netbeans-плагины

Вопрос:

Я пытаюсь создать новую языковую поддержку для NetBeans 7.4 и выше.

Когда файлы сохраняются локально, мне нужно развернуть их на сервере. Итак, мне нужно обработать событие сохранения. Я сделал это, реализуя Savable:

 
     public class VFDataObject extends MultiDataObject implements Savable {
       .......
       @Override
       public void save() throws IOException {
         .......
       }
     }
  

И это отлично сработало для события сохранения. Но потом я понял, что мне нужно расширить HtmlDataObject вместо MultiDataObject:

 
    public class VFDataObject extends HtmlDataObject implements Savable {
       .......
       @Override
       public void save() throws IOException {
         .......
       }
    }
  

И теперь функция save () не выполняется. Почему? Поскольку HtmlDataObject расширяет MultiDataObject. Что нужно сделать, чтобы это сработало?

Также есть ли способ перехватить все события сохранения в NetBeans? Есть ли у вас какая-либо информация о том, изменилось ли что-либо в 8.0 в этом отношении?

Большое спасибо.

Ответ №1:

Вы пробовали OnSaveTask SPI (https://netbeans.org/bugzilla/show_bug.cgi?id=140719 )? API может использоваться для выполнения задач при сохранении файлов заданного типа.

Что-то вроде этого можно использовать для прослушивания всех событий сохранения для данного типа MIME (в данном случае «text / x-sieve-java»):

 public static class CustomOnSaveTask implements OnSaveTask {

    private final Context context;

    public CustomOnSaveTask(Context ctx) {
        context = ctx;
    }

    @Override
    public void performTask() {
        System.out.println(">>> Save performed on "   
                NbEditorUtilities.getDataObject(context.getDocument()).toString());
    }

    @Override
    public void runLocked(Runnable r) {
        r.run();
    }

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

    @MimeRegistration(mimeType = "text/x-sieve-java", service = OnSaveTask.Factory.class, position = 1600)
    public static class CustomOnSaveTaskFactory implements OnSaveTask.Factory {

        @Override
        public OnSaveTask createTask(Context cntxt) {
            return new CustomOnSaveTask(cntxt);
        }

    }
}
  

Комментарии:

1. Я не могу найти много информации о OnSaveTask. Что, если я хотел бы обрабатывать несколько типов mime? Нужно ли мне создавать новый класс для обработки этого, или я каким-то образом могу обрабатывать сохранения для всех файлов, которые мне нужны, в одном месте? Как мне заставить это работать для приложения-плагина NetBeans, просто создав класс? Еще раз спасибо.

2. Я также не очень разбираюсь в NetBeans API, с этим OnSaveTask я столкнулся при реализации одного плагина, и даже в конце мне пришлось решать свою проблему с помощью другого API. Поскольку @MimeRegistration аннотацию нельзя использовать несколько раз, вам нужно либо создать несколько классов для нескольких типов mime, либо вы можете использовать один класс и зарегистрировать его для нескольких типов mime вручную в layer.xml (я не пробовал, но, насколько я знаю NB API, это должно работать). Единственная проблема с этим может быть в том случае, если вы заранее не знаете всех типов mime. Это ваш случай?

3. В случае, если вы заранее не знаете типы mime, вы можете взглянуть на ListeningOnSaveEvents , где кратко показано, как следить за сохранением всех открытых файлов в редакторе NB. Однако это не только событие сохранения всех, вы получите уведомление обо всех событиях сохранения. В моем плагине мне нужно было следить только за одним объектом dataobject заданного типа mime, поэтому я попробовал OnSaveTask , а затем по некоторым практическим причинам я использовал только PropertyChangeListener для данного объекта данных (я создал объект данных, чтобы у меня была ссылка на него).

4. Попробовал это, и это отлично сработало для событий save и saveAll.

5. https://www.youtube.com/watch?v=8IIrf_JSuQk