Плагин редактора Eclipse: «ОШИБКА» при открытии файла вне проекта - PullRequest
8 голосов
/ 18 января 2009

Я разрабатываю плагин для редактора Eclipse. Он отлично работает с файлами в проектах Eclipse, но когда внешний файл открывается через меню «Файл -> Открыть файл» (который работает с файлом, например, с файлами Java), я получаю страницу, на которой отображается только синяя горизонтальная линия и слово "ОШИБКА". Журнал ошибок затмения пуст, как и файл журнала в каталоге .metadata.

Что может быть причиной этого? Как я могу диагностировать ошибку, когда у меня нет сообщения об ошибке, которое говорит мне, где искать? Похоже, нет способа получить более подробные записи в журнале Eclipse.

Edit:

Я обнаружил, что источник проблемы близок к тому, о котором упоминал jamesh, но нет ClassCastException - просто нет экземпляра IDocument для просмотра текста, потому что StorageDocumentProvider.createDocument() возвращает ноль. Причина этого в том, что он знает, как создавать документы только для экземпляров org.eclipse.ui.IStorageEditorInput, но в этом случае он получает экземпляр org.eclipse.ui.ide.FileStoreEditorInput, который не реализует этот интерфейс, а вместо этого реализует org.eclipse.ui.IURIEditorInput

Ответы [ 3 ]

9 голосов
/ 25 марта 2009

У меня была такая же проблема и, наконец, я нашел решение, работающее на меня. Вы должны предоставить 2 разных провайдера документов: сначала расширение FileDocumentProvider для файлов внутри рабочей среды, а второе расширение TextFileDocumentProvider для других ресурсов вне рабочей области. Затем вы регистрируете подходящего провайдера в соответствии с данными, введенными в ваших редакторах doSetInput метод, подобный этому:

private IDocumentProvider createDocumentProvider(IEditorInput input) {
    if(input instanceof IFileEditorInput){
        return new XMLTextDocumentProvider();
    } else if(input instanceof IStorageEditorInput){
        return new XMLFileDocumentProvider();
    } else {
        return new XMLTextDocumentProvider();
    }
}

@Override
protected final void doSetInput(IEditorInput input) throws CoreException {
    setDocumentProvider(createDocumentProvider(input));
    super.doSetInput(input);
}

затем в вашем новом провайдере документов (расширяющем TextFileDocumentProvider) вставьте что-то вроде этого:

protected FileInfo createFileInfo(Object element) throws CoreException {
        FileInfo info = super.createFileInfo(element);
        if(info==null){
            info = createEmptyFileInfo();
        }
        IDocument document = info.fTextFileBuffer.getDocument();
        if (document != null) {

            /* register your partitioner and other things here 
                       same way as in your fisrt document provider */
        }
        return info;
    }

Это работает для меня :) Наконец, я должен отметить, что я не настолько умен, и что я скопировал это решение из проекта Amateras (Opensource HTML-плагин редактора для eclipse)

2 голосов
/ 20 января 2009

В данный момент я немного отошел от исходного кода, хотя подозреваю, что проблема в ClassCastException:

  • Для файла рабочей области IEditorInput равно org.eclipse.ui.IFileEditorInput.
  • Для локального файла, не являющегося рабочим пространством, IEditorInput равен org.eclipse.ui.IStorageEditorInput

Разница в том, как вы получаете содержимое из IEditorInput. JDT выполняет явную проверку instanceof, чтобы выполнить переключение.

Я не думаю, что getAdapter(Class clazz) вернет java.io.InputStream, если вы предложите его.

Я не совсем понимаю, почему они так делают, но это ужасно.

Edit: Более общее замечание об отладке приложений eclipse - действительно очень полезно попробовать собрать все ваши журналы в одном месте (то есть в консоли).

Для этого убедитесь, что вы используете параметры командной строки -console и -consoleLog. Последнее помогло сэкономить бесчисленные часы времени. Если вы еще этого не сделали, изучите основные принципы работы с консолью (ss и start чаще всего используются). Это сэкономит еще немного времени на диагностике определенного класса проблем.

0 голосов
/ 18 января 2009

Вы пытались создать файл JAVA с помощью редактора вне рабочей области?

При вызове редактора с путем к файлу, concat "file: //" в начале файла path.eg: если путь C: //temp//Sample.java, то измените его как файл: //C://temp//Sample.java.

...