In order to do this, there are 2 different approaches:
- Add a feature within Identifier EObject that calculates the dotted name/oid and saves the value as a feature (attribute).
- Do Model to Model Transformation (MMT).
I will opt for the first as this is rather a natural addition to the existing MIB model. Came across
XCore that does provide exactly this and the functionality is called "Derived Feature".
To enable this, need to:
- Take over the Ecore/Genmodel generation from Xtext
- Export this Ecore/Genmodel to Xcore
- Finally make Xtext to refer to the Xcore instead.
- Make sure Xcore is available in Eclipse
- Before exporting Mib.genmodel to Xcore, make necessary changes for generation directories/id. Because once exported to Xcore, all the files are auto-generated - its messy work to clean up later.
- Export Mib.genmodel to Xcore. Specify the location to "platform:/resource/com.ravi.mib.xtext/model/xcore/". Noticed it always fail on the first attempt and successful on the second.
- Import Mib model instead of generating it:
Mib.xtext |
---|
//generate mib "http://www.ravi.com/mib/xtext/Mib" import "http://www.ravi.com/mib/xtext/Mib" |
- Modify MWE to stop generating ECore and re-point the Xcore:
GenerateMib.mwe2 |
---|
component = Generator { pathRtProject = runtimeProject pathUiProject = "${runtimeProject}.ui" pathTestProject = "${runtimeProject}.tests" projectNameRt = projectName projectNameUi = "${projectName}.ui" encoding = encoding language = auto-inject { // switch to xcore loadedResource = "platform:/resource/org.eclipse.emf.ecore.xcore.lib/model/XcoreLang.xcore" loadedResource = "classpath:/model/Xbase.ecore" loadedResource = "classpath:/model/Xbase.genmodel" loadedResource = "classpath:/model/Ecore.ecore" loadedResource = "classpath:/model/Ecore.genmodel" loadedResource = "platform:/resource/${projectName}/model/xcore/Mib.xcore" uri = grammarURI // Java API to access grammar elements (required by several other fragments) fragment = grammarAccess.GrammarAccessFragment auto-inject {} // generates Java API for the generated EPackages // switch to xcore // fragment = ecore.EMFGeneratorFragment auto-inject {} |
- Add Xcore plugin to MANIFEST.MF:
MANIFEST.MF |
---|
Require-Bundle: org.eclipse.xtext;visibility:=reexport, ... org.eclipse.xtext.xbase.lib, org.eclipse.emf.ecore.xcore Import-Package: org.apache.log4j, |
- Now, running MWE should not cause any error (besides maybe need to manual trigger Xcore code generation - by making the Xcore file dirty e.g enter space and save)
TODO: How to add Xcore generation in MWE?
Now add following derive feature to Xcore to generate dotted name (under Identifier) and dotted oid (under OidValue).
Mib.xcore |
---|
class Identifier { String name contains OidValue value derived String dottedName get { var p = value.parent var dname = name while (p != null) { dname = p.name + "." + dname p = p.value.parent } dname } } ... class OidValue { refers Identifier parent int oidnum derived String dottedOid get { var p = parent var doid = oidnum.toString while (p != null) { doid = p.value.oidnum + "." + doid p = p.value.parent } doid } } |
No comments:
Post a Comment