2016-12-16 13 views
0

컨텍스트를 얻으려면 현재 ecore에서 java 모델로 변환하는 중입니다. 실제로, 일부 ecore 파일을 읽고 유효한 자바 인터페이스 소스 코드가되는 문자열을 생성합니다.ECore 반영 및 상호 참조

예를 들어, 여기 내 코드 생성 워크 플로가 있습니다.

projectA.ecore :

ECLASS는 'A'를 정의

package projectA : projectA = 'http://www.example.org/projectA' 
{ 
    class A; 
} 

projectB.ecore :

사용 'A'에서 상속 ECLASS 'B'를 정의 a.ecore에 대한 상호 참조로 액세스 할 수 있습니다. 그에서

import projectA : '../../projectA/model/projectA.ecore#/'; 

package projectB : projectB = 'http://www.example.org/projectB' 
{ 
    class B extends projectA::A; 
} 

는 내가 처음 projectA.ecore위한 인터페이스 생성 Ecore를 :

package projecta; 

interface ProjectA<A> { 
    // ... 
} 

을 그리고 지금은 projectB.ecore을 위해 같은 일을 할 다음과 같은 인터페이스를 가져왔다 :

package projectb; 

import projecta.ProjectA; 

interface ProjectB<A,B> extends ProjectA<A> { 
    // ... 
} 

이렇게하려면 A와 EClass가 상호 참조를 사용하여 액세스하고 올바른 인터페이스 확장을 생성하기 위해 projectA.ecore에서 일부 분석을 수행해야합니다 ...

나는 ecore reflection API에서 깨끗하고 명확한 방법을 찾지 않고 둘러 보았습니다. 이것이 가능한가? 그래, 어떻게?

편집 : 기술 정보

나는 이러한 종류의 코드를 사용하여 Ecore를로드하고있어이 :

final ResourceSetImpl resourceSet = new ResourceSetImpl(); 
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("ecore", new XMIResourceFactoryImpl()); 
final Resource resource = resourceSet.getResource(uri, true); 
final EPackage ePackage = (EPackage) resource.getContents().get(0); 
final String fileContent = new GenerateAlgebra().process(ePackage); 

GenerateAlgebra는 문자열 변환에 .ecore 전용 클래스입니다. 기술적으로 Xtend (https://github.com/manuelleduc/ecore-oa/blob/master/fr.inria.diverse.ecorealgebragenerator/src/fr/inria/diverse/objectalgebragenerator/popup/actions/GenerateAlgebra.xtend)를 사용하여 개발되었습니다.

+0

resourceSet.getResources()을 반복 시도하고 가능한 EMF 생성기를 사용하지?ecore xmi를 java Objects로로드하고 proxys를 다른 EPackage의 상호 참조 된 EClayer로 해석하면 둘 사이의 연결이 성립됩니다. 어떻게하면 더 구체적으로 생성 할 수 있습니까? –

+0

아직 귀하의 문제를 완전히 이해하지 못했습니다. 연결로 Epackages를 모두로드해야합니까? B의 상위 유형 A를 식별 할 수 있도록? –

+0

기본적으로 EClass가 정의 된 .ecore 파일을 찾을 수 있어야합니다. –

답변

1

당신은 단지 ECLASS 사용을 자원 URI을 정의되어있는 Ecore를 파일에 파일 경로를 얻고 싶은 경우에

시도해보십시오는 Ecore 파일에 당신에게 실제 URI를 제공

ePackage.eResource().getURI()하는 패키지와 모든 EClasses가 정의됩니다. 다음과 같을 수 있습니다. file:/Users/../../yourPath/projectA.ecore getNsURI(), getName()을 사용하여 두 개의 ecore 파일을 식별 할 수도 있습니다.

Resourceet을 사용하는 경우처럼 여러 ecore 파일간에 상호 참조가 있으면 세트는 다른 모든 자원도로드하려고 시도합니다. 즉, resourceSet.getResource(uri, true)을 호출하면 리소스 세트에 두 리소스가 모두 포함되어야합니다.

당신은 당신의 자신의 특정 코드 생성기를 구현하려는