2011-02-12 5 views
2

내 프로그램의 일부 파일에 항상 최신 내용이 있어야합니다. EMF 자원 세트를 만들었습니다.파일 변경시 EMF ResourceSet을 자동으로 업데이트하는 방법은 무엇입니까?

resourceSet.getResource(resourceURI, true)은 정적 필드에 설정된 리소스를 저장하기 위해 많은 시간이 걸리기 때문에 파일을 캐시 할 수 있습니다.

e.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

두 가지 : 당신은 자원을 다시로드하려면 첫째, 당신은 EMF 어떤 방법으로 이클립스를 필요로하지 않는 것처럼 ResourceResourceSet 클래스와 동일하지 않습니다

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

이클립스 작업 공간이 당신을 위해 일을 할 것입니다 확인하는 것이 가능해야하고 있음을 의미 실제 변경 사항이있을 경우 청취자에게 알리십시오. 이 변경은 편집기가 저장하거나 예를 들어 작업 공간이 파일 시스템과 관련하여 새로 고쳐질 때 발생할 수 있습니다. –

+0

이 모든 것을 시도 할 때 내 모델 객체는'언로드 '를 호출 할 때 프록시로 설정됩니다. 이는 정상이며 문서에 설명되어 있습니다. 그러나'load'를 호출하면 모델 객체는 계속 프록시가되고 파일의 새로운 정보로 업데이트되지 않습니다. 이것이 왜 그런지, 내가 그것에 대해 할 수있는 것에 대해 알고 있습니까? – Lii

관련 문제