Как автоматически обновить EMF ResourceSet при изменении файла? - PullRequest
2 голосов
/ 12 февраля 2011

Мне нужно, чтобы в моей программе всегда было обновленное содержимое какого-либо файла. Я создал набор ресурсов EMF.

Поскольку resourceSet.getResource(resourceURI, true) занимает много времени, я сохраняю набор ресурсов в статическом поле, поэтому файлы могут кэшироваться.

т.е. как только resourceSet.getResource(resourceURI, true) вызывается для некоторого URI, файл кэшируется в resourceSet.

Проблема в том, что resourceSet не обновляет свой кеш автоматически:

т.е:.

resourceSet.getResource(resourceURI, true);
// delete resourceURI from file system

// Here I expect null, but old version of the file is returned
resourceSet.getResource(resourceURI, true);

Как заставить resourceSet обновить кеш при необходимости?

Я использую org.eclipse.emf.ecore.resource.impl.ResourceSetImpl, но, возможно, мне нужна другая версия ResourceSet, которая учитывает штампы модификации?

1 Ответ

4 голосов
/ 22 февраля 2011

Две вещи: во-первых, если вы хотите перезагрузить ресурс, вам нужно будет позвонить

aResource.unload([..]);
aResource.load([..])

Поскольку EMF никоим образом не требует Eclipse, классы Resource и ResourceSet не совпадают с подклассами рабочего пространства Eclipse IResource, что означает, что изменение файла в файловой системе не приведет к тому, что ресурсы EMF быть перезагружен.

Это довольно легко сделать, но посмотрите на сгенерированную для вас XxxxEditor EMF, класс создает экземпляр IResourceChangeListener, который будет получать дельты из рабочей области Eclipse при изменении файла. Сгенерированный слушатель обрабатывает эти дельты путем перезагрузки ресурсов.

protected IResourceChangeListener resourceChangeListener = new IResourceChangeListener() {
    public void resourceChanged(IResourceChangeEvent event) {
        IResourceDelta delta = event.getDelta();
        //find out which EMF Resource matches with the IResource and reload it
    }
}
...