티스토리 뷰

XML을 사용하여 EMF의 model을 save하고 load하는 방법을 알아보자. 
EMF 모델의 구조를 살펴보면, 최상위에는 DocumentRoot가 위치 하게 된다. 따라서 Save나 Load를 할 때 DocumentRoot를 통해서 해야한다. 만약 XMI를 사용한다면, Root를 임으로 설정할 수 있기 때문에 원하는 Root를 선택 할 수 있다. 
하지만 XML을 기반으로 EMF 모델을 저장하고 불러오고 싶다면 DocumentRoo를 통해야 한다.

모델의 구조는 다음과 같이 가정한다. Company가 모델의 최상위 node이다.

1. 불러오기(Loading)
일단 불러오는 코드를 살펴 보자.

URI resourceURI = EditUIUtil.getURI(getEditorInput());

EditingDomain ed = ...
Resource resource = ed.getResourceSet().getResource(resourceURI, true);
Company c = ((DocumentRoot) resource.getContents().get(0)).getCompany();

일단 code의 첫줄에 나오는 URI는 여러분이 가지고 있다고 가정한다. 지금 예제에서는 eclipe.ui.editor에서 EMF모델을 사용 하려고 하기 떄문에 getEditorInput()을 통해서 URI을 얻어 올 수 있다. 
XML파일으로 부터 EMF모델을 가져 오기 위해서는 resource를 사용해야 한다. resource를 만들고 URI에 있는 파일로 부터 정보를 가져와야 한다. 여기서 getResource(URI, true) 함수가 중요하다. 2번째 parameter는 ture로 선택 되어 있는데 이것은 loadOnDemend라고 해서 요청이 들어 올면 file로 부터 loading하라는 뜻이다. 
그후 파일로 부터 정보를 통해서 resource를 구성하고 이 resource의 root node가 DocumentRoot가 되기 때문에 이것을 Type casting을 통해서 강제로 바꿔준후, DocumentRoot로 부터 Model을 얻어 올 수 있다. 

※주의
Company c = ((DocumentRoot) resource.getContents().get(0)).getCompany();
위 구문이 실행되기 이전에 Model의 Package를 생성해주어야 한다.
위의 예제에서는 
CompanyPackege.eINSTANCE;
이 구문을 실행해 주어야 한다.
만약 Package를 생성해주지 않으면 Package Not found Eception을 보게 될 것이다.

※Resource란?
일단 공식 JAVA doc에 따르면 영구문서(Persistent  Document)라고 되어 있다.
일반적으로 Resource들은 관련된 다른 Resource와 함께 ResourceSet이라는 컨테이너(Container)에 속해 있다고 보면 된다. 
Resource는 URI를 가지고 Model을 어디에 저장 해야 할지, 어떤 모델을 가지고 와야 할 지를 알고 있다. 
또한 Resource의 다른 중요한 역할은 모델화 된 Content를 제공한다는 것이다. 일반적으로 Content는 tree로 된 구조로 관리 된다.

2. 저장하기(Saving)
저장하는 방법은 불러오는 것에 비해서 조금 복잡하다. 아래의 코드를 살펴보자.

Company c = ...

final Map options = new HashMap();
options.put(Resource.OPTION_SAVE_ONLY_IF_CHANGED, Resource.OPTION_SAVE_ONLY_IF_CHANGED_MEMORY_BUFFER);

URI resourceURI = EditUIUtil.getURI(getEditorInput());
Resource.Factory resourceFactory = Resource.Factory.Registry.INSTANCE.getFactory(resourceURI);
Resource resource = resourceFactory.createResource(resourceURI);

DocumentRoot docmRoot = CompanyFactory.createDocumentRoot();
docmRoot.setCompany(c);
resource.getContents().add(docmRoot);
resource.save(options);

조금 복잡한 코드로 보이지만, 알고보면 별것 없다. 일단 Save를 할 떄 파일을 어떻게 구성할지에 대한 option을 준다. 위에서 선택한 Option은 모델이 수정되었을 떄, 메모리버퍼가 수정되었을때만 저장 하도록 선택 한것이다. 대부분 이부분은 재활용하면 된다. 
그리고 URI를 통해서 새로운 Resource를 선언하고, 이 Resource에 content를 넣어준뒤 저장하면 끝이다. 
만약 Resource를 통해서 모델을 관리 했다면 기존의 Resource를 재활용 할 수 있다. 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31