2016-06-15 6 views
1

ecore 모델에서 derived 속성 및 참조를 사용하고 싶지만, 지금까지 파생 된 속성/참조의 값을 계산하는 메소드에 대한 코드를 설정하는 방법에 대한 문서를 찾지 못했습니다.프로그래밍 방식으로 파생 된 속성의 구현을 지정하십시오.

내가 이해하는 한 기본 워크 플로는 특성/참조를 derived으로 표시하고 모델 코드를 생성 한 다음 구현을 수동으로 추가하는 것입니다. 그러나 Ecore API를 통해 동적으로 생성 된 모델로 작업합니다. 생성 된 파일을 수동으로 편집하지 않고 String을 가져 와서이 문자열을 파생 된 피쳐의 계산을위한 구현으로 지정하는 방법이 있습니까?

EDIT>

명확히하려면 : 내가 직접 파생 EStructuralFeatures의 게터에 대한 (문자열로) 메소드의 신체의를 지정하여, 생성 된 Java 파일을 변경하는 방법을 찾고 있어요.

답변

3

EMF는 "invocation delegate"를 사용하여 EOperationderived EAttribute의 전용 구현을 처리하는 방법을 제공합니다. 이 기능을 사용하면 문자열 형식으로 ecore 메타 모델에 직접 구현을 구현할 수 있습니다 (EMF에서 사용 언어를 "처리"할 수있게되면 즉, 호출 대리자가 있음).

지금까지 내가 아는 한, OCL은 잘 지원됩니다 https://wiki.eclipse.org/OCL/OCLinEcore#Invocation_Delegate

호출 위임의 등록 (독립형 사용을 위해) 등록 플러그인이나 손으로 하나 수행하고, 메커니즘은 EMF 반사 층으로 작동 (동적 EMF) : https://wiki.eclipse.org/EMF/New_and_Noteworthy/Helios#Registering_an_Invocation_Delegate

(.. 나는 그것이 존재 알고 난이 메커니즘을 경험 한 적이 있습니다,하지만 난 그것으로 해본 적이하시기 바랍니다)

EDIT>

질문은 파생 된 속성에 대한 동적 코드 실행과 관련이없는 것 같지만 코드 삽입 (나는 "문자열을 가져 와서이 문자열을 계산에 대한 구현으로 지정하는 방법이 있습니까? 파생 된 기능? ").

EMF는 ecore 메타 모델에 삽입 된 코드를 생성 된 코드에 직접 삽입하는 방법을 제공합니다.

EAttributederived 속성은 다음과 같습니다. EAttribute의 속성은 true : {derived volatile}이어야합니다 (transient도 추가 할 수 있음). EAttribute에 getter 및 setter 만 필요한 경우 changeablefalse으로 설정할 수도 있습니다.

EAttribute 아니라, 당신이 http://www.eclipse.org/emf/2002/GenModel로 설정 소스로 새로운 EAnnotationgetkey 설정된 항목 (아래 이미지 참조) 주입 될 코드에 value 세트를 추가해야 "구성"입니다 .

enter image description here

그리고 함으로써 해결할 수은, 당신의 코드는 게터에 주입 된 value 값으로 생성됩니다.

EOperation에 대해 get 대신 body을 사용하여 동일한 프로세스를 추가 할 수 있습니다.

+0

이것은 생성 된 출력으로 문자열을 가져 오는 인상적인 방법입니다. 그러나 나는 반사 액세스를 허용하는 것이 필요하다고 생각합니다. 이것은 코드가 직접 추가 된 파생 속성이 동적 EMF에서 작동하지 않는다는 것을 의미합니까? –

+0

내가 제공 한 솔루션은 생성 된 코드에 코드를 삽입하지 않지만 속성에 액세스 할 때 "구현을 나타내는 문자열"을 해석합니다. 이 방법은 동적 인 EMF (ecore 구현을 생성하지 않고) 만 사용하는 경우에도 작동합니다. 'ecore'에 주석이없고 생성 된 코드에서 "손으로 구현"하면 EMF는 생성 된 모델 플러그인이 잘로드되고 등록되어있는 한 코드에 추가 한 구현을 사용합니다. 생성 된 코드로 메타 모델에서 코드를 삽입하는 과정은 다르다. (편집 된 게시물보기) –

+0

이렇게 이해했는지 여부를 명확히하기 위해 : 당신의 솔루션은 기술적으로 내가 요청한 것을 (생성 된 코드 변경)하지는 않지만, 런타임 동작을 동일한 효과에 적용합니다. 나는 어쨌든 정말로 필요한 모든 것입니다. 그리고 공정하기를, 제 질문은 명시 적으로 생성 된 출력 코드를 조작하고 싶다고 말하지 않았습니다. –