'emf'에 해당되는 글 3건

  1. 2011.04.18 EMF, XML 1.1 읽어들이기 문제
  2. 2010.09.27 How to Customize EMF Loading
  3. 2009.06.08 EMF 트랜잭션 관리

XML 1.1을 사용하면 1.0에서는 사용할 수 없던 제어문자를 어트리뷰트 값으로 사용할 수 있기 때문에, XML1.1로 변경하는 작업을 최근 진행했다. 그러자 이상하게도 간헐적으로 EMF가 모델을 XML로 부터 읽어들이지 못하는 문제가 발생했다.

주요 증세

  • PackageNotFound 예외
  • 패키지 URI가 널일 수 없다는 예외
  • 이상한 명칭의 EClass 를 찾지 못했다는 예외

원인

사실 이 문제가 XML 버전과 연관이 있다는 사실을 알아내는데만도 반나절 이상의 시간을 소비해야 했다.

문제는 JVM에 기본 포함된 저시스 SAX파서가 XML 1.1의 경우 몇몇 어트리뷰트를 토큰 레벨에서 부터 제대로 스캔하지 못하는 경우가 발생했기 때문이었다. 이로인해 EMF XML 계층에 잘못된 Sax Event가 전달되어, 그 중에서도 xsi:type 어트리뷰트 값이 엉뚱한 값이 들어가 타입명으로 부터 EClass를 찾지 못하거나, 어트리뷰트 값으로 부터 패키지 URI를 파싱하지 못해 문제가 발생한다.

이 문제는 EMF의 XMLLoadImpl을 개인화 하여, 파서를 교체하여 해결 할 수 있다. 필자의 경우, 문제를 해결하기 위해 저시스 2.11 (XML 1.1스키마용 베타) 버전을 다운 받아 빌드 패스에 넣고, 아래와 같이 XMLLoadImpl을 개인화하여 문제를 수정했다.

수정 코드:

public class MyXMLLoadImpl extends XMILoadImpl {
	@Override
	protected SAXParser makeParser() throws 
		ParserConfigurationException, SAXException {
		SAXParserFactory f = 
			SAXParserFactory.newInstance(
				SAXParserFactoryImpl.class.getCanonicalName(), 
				getClass().getClassLoader()
			);
		return f.newSAXParser();
	}
}

EMF 로딩 커스터마이징 하기도 함께 읽어 보세요.

'EMF' 카테고리의 다른 글

How to Customize EMF Loading  (0) 2010.09.27
EMF 트랜잭션 관리  (0) 2009.06.08
Posted by 지이이이율
,

How to Customize EMF Loading

EMF 2010. 9. 27. 15:02
EMF문서는 일반적으로 굉장히 복잡한 과정을 거쳐 파일로 부터 EObject 문서를 만들어 내기 때문에 어느지점을 수정해야할지 막막하기 그지없습니다. 주요역할을 하는 개체로는 리소스, Load, 로드 핸들러, 헬퍼가 있으며, 그 흐름은 다음과 같습니다.

EMF 문서의 읽기의 개요

ResourceImpl -> LoadImpl: doLoad
LoadImpl -> LoadHandler: SAX Events
LoadHandler -> XMLHelper: Deligates
XMLHelper -> XMLHelper : Build EObject DOM
XMLHelper -> ResourceImpl: 

ResourceImpl

리소스 객체는 기본적으로 EObject 문서를 시리얼라이즈 디시리얼라이즈 하는 진입점이 됩니다. 또한 리소스셋과 함께 멀티플 리소스의 관리도 이루어집니다.

  • createXMLLoad() / createXMLSave() : XMLLoad및 XMLSave를 만듭니다.
  • createXMLHelper() : XMLLoad및 XMLSave를 도와줄 XMLHelper를 만듭니다.

XMLLoadImpl

입력스트림을 SAX 처리하여, 문서를 구성하고 노드들을 탐색하며 에러등을 처리합니다. 대부분의 작업은 LoadHandler에 위임됩니다.

  • makeDefaultHandler() : SAX이벤트에 대응하여 문서를 작성하는 핸들러를 생성합니다.
  • handleErrors() : 문서의 진단 정보를 어떻게 처리할 것인지를 오버라이드 할 수 있습니다.

LoadHandler

SAXParser 이벤트 리스너와 유사합니다. 파일을 읽는 동안 진행상태등을 표시하려면 이것을 오버라이드 해야 합니다. save, load 시에 전달되는 Map에 IProgressMonitor등을 넣어두는 테크닉을 이용합니다.

  • sax이벤트 메소드들
  • 레퍼런스 업데이트

XMLHelper

XML과 EObject DOM사이의 최후의 중재자입니다. 로드 핸들러로부터 요청받아 DOM을 만들고, 속성을 지정하는 등의 작업을 수행합니다.

질문은 메일로만 받고 있습니다. jeeeyul@지메일.com

'EMF' 카테고리의 다른 글

EMF, XML 1.1 읽어들이기 문제  (0) 2011.04.18
EMF 트랜잭션 관리  (0) 2009.06.08
Posted by 지이이이율
,

EMF 트랜잭션 관리

EMF 2009. 6. 8. 19:42

ChangeRecorder

ChangeRecorder는 org.eclipse.emf.ecore.change에 포함되어 있는 도구로, EObject를 상속받은 객체들의 변경을 추적할 수 있는 도구이다. 이를 사용하는 예제는 다음과 같다:
// 임의의 ecore 모델을 하나 만든다.
Person jiyul = MyFactory.eINSTANCE.createPerson();
jiyul.setName("Jiyul");

// 롤백 디스크립션 작성 시작
ChangeRecorder recorder = new ChangeRecorder(jiyul);

// 모델을 변경 시킴
jiyul.setName("Sid Vicious");

// 녹화 종료
ChangeDescription rollbackDescription = recorder.endRecording();

// 녹화된 내용을 역으로 적용
rollbackDescription.apply();

System.out.println(jiyul.getName());
위의 코드를 수행 하면, jiyul:Person의 name을 시드 비샤스로 지정하였지만, 화면에는 지율이 출력된다. ChangeRecorder가 jiyul:Person이 발생시키는 모든 Notification을 수집하여 역으로 수행할 수 있는 ChangeDescription을 만들어 주기 때문이다. ChangeDescription은 녹화 이외에도 다른 방법으로도 생성할 수 있다.

트랜잭션 처리

위의 예제를 좀 더 일반화된 트랜잭션 관리 코드로 나타내면 다음과 같은 모양이 된다:
ChangeRecorder recorder = new ChangeRecorder(model);
try{
	모델을 조작하는 코드들이 여기에 위치한다...
}catch(Exception e){
	// 모델을 다루는 작업 도중 문제가 발생한 경우 롤백 시킨다.
	recorder.endRecording().apply();
}

ChangeDescription

그런데 재미있는 점은 모델의 변경을 기술하는 객체인 ChangeDescription 역시, EObject를 상속받는다는 점이다. 이 말은 ChangeDescription 역시 EMF를 통해 제네레이트 된 코드라는 뜻이다. 다시 말해 ChangeDescription은 XML로 시리얼라이즈 될 수 있다. 이 사실은 도전적인 독자들에게, XML로 시리얼라이즈된 ChangeDescription을 이용하여, 네트워크 너머의 모델을 수정할 수 있다라는 멋진 아이디어에 들뜨게 할 것이다. ChangeDescription은 ChangeFactory 및 ChangePackage를 이용하여 직접만들거나, 리소스로 부터 읽거나 쓸수 있다. 여기서는 간단한 예제만을 다뤄 보이겠다:
// 녹화 종료
ChangeDescription description = recorder.endRecording();

// 변경된 내용을 xml로 출력
ResourceSet rs = new ResourceSetImpl();
XMLResource resource = 
    (XMLResource) rs.createResource(URI.createFileURI("test.xml"));
resource.getContents().add(description);
resource.save(System.out, new HashMap<Object, Object>());
위의 코드를 수행하면 ChangeDescription의 내용이 시리얼라이즈 되는 것을 확인 할 수 있을 것이다.

'EMF' 카테고리의 다른 글

EMF, XML 1.1 읽어들이기 문제  (0) 2011.04.18
How to Customize EMF Loading  (0) 2010.09.27
Posted by 지이이이율
,