2011-02-12 26 views
2

我需要在程序中始終保持某些文件的最新內容。 我創建了一個EMF資源集。文件更改時如何自動更新EMF ResourceSet?

因爲resourceSet.getResource(resourceURI, true)需要很多時間才能完成我將資源集存儲在一個靜態字段中,因此文件可以被緩存。

I.e.一旦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需要考慮修改郵票?

回答

4

兩件事情:第一,如果你想重新加載資源,你必須調用

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

由於EMF不以任何方式要求Eclipse中ResourceResourceSet類是不一樣的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 
    } 
} 
+0

所以這意味着我必須寫我自己的「聰明」實施的ResourceSet的:)有可能在檢查文件是否已經被使用日食「時間戳」改變 – javapowered

+0

Eclipse工作區將做的工作,爲您和在發生實際變化時通知您的聽衆。當編輯器保存時或者例如工作區被刷新到文件系統時,這種改變可能會發生。 –

+0

當我嘗試這個時,我所有的模型對象被設置爲代理時,我叫'卸載'。這是正常的,並由文檔描述。但是,當我調用'load'時,模型對象始終是代理,並且它們不會使用文件中的新信息進行更新。你知道爲什麼會出現這種情況,我能做些什麼嗎? – Lii