Problem saving model instances with cross-references [message #1761158] |
Mon, 08 May 2017 07:18  |
Eclipse User |
|
|
|
Context: I have a model transformation from Excel into a few instances (with cross-references) of my Xtext meta model.
Question: How can I save my model instances with cross-references properly?
Example:
Definition of objects Defs.mydsl (this file has about 300 kb and around 1000 definitons):
...
define A {...}
define B {...}
...
Usages of objects (e. g. cross-references) Usages.mydsl:
...
use A for myUsage0 ...
use B for myUsage1 ...
...
As Defs.mydsl model contains all definitions it has to be saved first. Then we can save the models referencing to the definition.
However sometimes I get the following error upon saving the Usages.mydsl model:
Exception during transformation: java.lang.RuntimeException: No EObjectDescription could be found in Scope FBUsage.def for FBModel.usages[1936]->FBDef'A'
Semantic Object: FBModel.usages[0]->FBUsage'myUsage0'
URI: platform:/resource/atest/onboardnet/Usages.mydsl
EStructuralFeature: defsUsages::FBUsage.def
at org.eclipse.xtext.serializer.diagnostic.ISerializationDiagnostic$ExceptionThrowingAcceptor.accept(ISerializationDiagnostic.java:131)
at org.eclipse.xtext.serializer.tokens.CrossReferenceSerializer.getCrossReferenceNameFromScope(CrossReferenceSerializer.java:131)
at org.eclipse.xtext.serializer.tokens.CrossReferenceSerializer.serializeCrossRef(CrossReferenceSerializer.java:104)
at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.getToken(SequenceFeeder.java:481)
at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.accept(SequenceFeeder.java:244)
at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.accept(BacktrackingSemanticSequencer.java:419)
at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:478)
at fz.defs.usages.dsl.serializer.DefsUsagesSemanticSequencer.sequence_FBBoardnetSignal(DefsUsagesSemanticSequencer.java:329)
at fz.defs.usages.dsl.serializer.DefsUsagesSemanticSequencer.sequence(DefsUsagesSemanticSequencer.java:266)
at org.eclipse.xtext.serializer.sequencer.AbstractSemanticSequencer.createSequence(AbstractSemanticSequencer.java:67)
at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptEObjectRuleCall(SequenceFeeder.java:325)
at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptRuleCall(SequenceFeeder.java:352)
at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.accept(SequenceFeeder.java:263)
at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.accept(BacktrackingSemanticSequencer.java:412)
at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:478)
at fz.defs.usages.dsl.serializer.DefsUsagesSemanticSequencer.sequence_FBModel(DefsUsagesSemanticSequencer.java:366)
at fz.defs.usages.dsl.serializer.DefsUsagesSemanticSequencer.sequence(DefsUsagesSemanticSequencer.java:275)
at org.eclipse.xtext.serializer.sequencer.AbstractSemanticSequencer.createSequence(AbstractSemanticSequencer.java:67)
at org.eclipse.xtext.serializer.impl.Serializer.serialize(Serializer.java:118)
at org.eclipse.xtext.serializer.impl.Serializer.serialize(Serializer.java:142)
at org.eclipse.xtext.serializer.impl.Serializer.serialize(Serializer.java:206)
at org.eclipse.xtext.resource.XtextResource.doSave(XtextResource.java:369)
at org.eclipse.emf.ecore.resource.impl.ResourceImpl.save(ResourceImpl.java:1430)
at org.eclipse.emf.ecore.resource.impl.ResourceImpl.save(ResourceImpl.java:999)
....
I tried debuging CrossReferenceSerializer however when in debug mode it seems that the scope always contains the definition of 'A' (and thus the exception will not be thrown). This seems to be some kind of data race condition as in case we would wait a sufficient amount of time between the save operations the issue does not occur.
But sleeping is not a solution for me. I think that some kind of indexing must be done in the background so that the scope contains all saved elements properly.
The solutions I found so far:
- Injecting my own CrossReferenceSerializer which will not check the scope. (I guess this is a hack) This will not work when we would need customized formatter or when we need fully qualified names. (not very nice)
- I found some code which works by using some kind of waiting mechanism for auto-build (see waitForAutoBuild-method) https://github.com/NumberFour/n4js/blob/beadd39ac96b7a48ad96a246165603e3b0da975d/testhelpers/eu.numberfour.n4js.ui.tests.helper/src/eu/numberfour/n4js/tests/util/ProjectUtils.java (this is not very nice either)
- Currently I am using XtextResourceSetProvider for my resource set, I found there is XtextLiveScopeResourceSetProvider, which might be a solution, but I am unsure. Maybe someone can shed light on this functionality in the context of saving programatically generated models.
Did someone encounter the same problems? And found feasible solutions?
|
|
|
|
|
|
|
|
|
|
Powered by
FUDForum. Page generated in 0.04953 seconds