私は大きな問題を抱えています:
atlプラグインを使用して、通常の方法で行うと問題なく動作するATL変換があります。
しかし、Java を起動しようとすると、モデルのクラスが見つかりません (org.eclipse.emf.ecore.xmi.ClassNotFoundException: Class 'operationalTemplateGroup' is not found or is abstract)
例: モデルに「operationalTemplateGroup」クラスがありますが、メタモデルでは次のように記述されています。
<eClassifiers xsi:type="ecore:EClass" name="OPERATIONALTEMPLATEGROUP">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="name" value="OPERATIONALTEMPLATEGROUP"/>
<details key="kind" value="elementOnly"/>
</eAnnotations>
OperationalTemplateGroup ではなく OPERATIONALTEMPLATEGROUP を参照してください。プラグインは解析できるのに、Java ランチャーは解析できないのはなぜですか? 私はこの問題を 1 つのモデルだけで抱えており、他のモデルは正常に動作しています。それを operationTemplateGroup に変更すると、同じ問題が発生する次のクラス (約 6000 行のコード) まで動作します。方法:
public static void main(String[] args) {
try {
System.out.println("Running...");
/*
* Paths
*/
String inModelPath = "models/architectures/AToMS.acmehealth";
String inModelPath2 = "models/openehr/TemplatesAToMS.openehr2008v4";
String outModelPath = "models/richubi/TemplatesAToMS22.rich_interface_model";
String archMMPath = "metamodels/architectures/ACMEHealthv2.ecore";
String openEHRMMPath = "metamodels/openehr/openehr2008v4.ecore";
String richUbiMMPath = "metamodels/richubi/rich_interface_components.ecore";
System.out.println("inModelPath: " inModelPath);
System.out.println("inModelPath2: " inModelPath2);
System.out.println("outModelPath: " outModelPath);
System.out.println("archMMPath: " archMMPath);
System.out.println("openEHRMMPath: " openEHRMMPath);
System.out.println("richUbiMMPath: " richUbiMMPath);
/*
* Initializations
*/
ILauncher transformationLauncher = new EMFVMLauncher();
ModelFactory modelFactory = new EMFModelFactory();
IInjector injector = new EMFInjector();
IExtractor extractor = new EMFExtractor();
/*
* Load metamodels
*/
IReferenceModel archMetamodel = modelFactory.newReferenceModel();
injector.inject(archMetamodel, archMMPath);
IReferenceModel openEHRMetamodel = modelFactory.newReferenceModel();
injector.inject(openEHRMetamodel, openEHRMMPath);
IReferenceModel richUbiMetamodel = modelFactory.newReferenceModel();
injector.inject(richUbiMetamodel, richUbiMMPath);
System.out.println("Metamodels loaded.");
/*
* Load models and run transformation
*/
IModel inModel2 = modelFactory.newModel(openEHRMetamodel);
injector.inject(inModel2, inModelPath2); // ERROR HERE!!!!
IModel inModel = modelFactory.newModel(archMetamodel);
injector.inject(inModel, inModelPath);
IModel outModel = modelFactory.newModel(richUbiMetamodel);
System.out.println("IN, OUT models loaded.");
System.out.print("Running ATL trasformation...");
transformationLauncher.initialize(new HashMap<String, Object>());
transformationLauncher.addLibrary("LibHelpers",
new FileInputStream("transformations/LibHelpers.asm"));
transformationLauncher.addInModel(inModel, "archMM", "openEHRMM");
transformationLauncher.addInModel(inModel2, null, "openEHRMM");
transformationLauncher.addOutModel(outModel, "archM", "openEHRM");
transformationLauncher
.launch(ILauncher.RUN_MODE,
new NullProgressMonitor(),
new HashMap<String, Object>(),
new FileInputStream(
"/home/operador/workspace/Transformation/transformations/OpenEHRTemplates2RichUbi.asm"));
System.out.println("Done.");
System.out.print("Extracting OUT model...");
extractor.extract(outModel, outModelPath);
System.out.println("Done.");
/*
* Unload all models and metamodels (EMF-specific)
*/
EMFModelFactory emfModelFactory = (EMFModelFactory) modelFactory;
emfModelFactory.unload((EMFModel) inModel);
emfModelFactory.unload((EMFModel) outModel);
emfModelFactory.unload((EMFReferenceModel) archMetamodel);
emfModelFactory.unload((EMFReferenceModel) openEHRMetamodel);
} catch (ATLCoreException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}