2011-02-12 14 views
2

私のプログラムでは、常に最新の内容のファイルが必要です。 私はEMFリソースセットを作成しました。ファイルの変更時にEMF ResourceSetを自動的に更新する方法はありますか?

resourceSet.getResource(resourceURI, true)は、静的フィールドにリソースセットを格納するために多くの時間がかかるため、ファイルをキャッシュすることができます。

I.e.一部のURIに対してresourceSet.getResource(resourceURI, true)が呼び出されると、ファイルは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

2つのこと:あなたがリソースをリロードしたい場合はまず、あなたはEMFはResourceResourceSetクラスが同じではありませんどのような方法でEclipseを必要としないので

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

を呼び出す必要がありますEclipseワークスペースIResourceサブクラスは、ファイル・システム上のファイルを変更しても、EMFリソースが再ロードされることはありません。

XxxxEditor EMFが生成されていますが、ファイルの変更時にEclipseワークスペースからデルタを受け取るクラスはIResourceChangeListenerです。生成されたリスナーは、リソースをリロードしてこれらのデルタを処理します。

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

これを試してみると、私のモデルオブジェクトは、 'unload'を呼び出すとプロキシになるように設定されています。これは正常であり、ドキュメンテーションで説明されています。しかし、私が 'load'を呼び出すと、モデルオブジェクトはプロキシとして維持され、ファイルからの新しい情報で更新されません。なぜこれが事実であり、私がそれについて何ができるのかについて、あなたは何か考えがありますか? – Lii

関連する問題