Systems-Modeling / SysML-v2-Pilot-Implementation

Proof-of-concept pilot implementation of the SysML v2 textual notation and visualization
GNU Lesser General Public License v3.0
114 stars 23 forks source link

Ecore model serialization to textual notation fails #509

Closed LorenzoL94 closed 7 months ago

LorenzoL94 commented 7 months ago

SysMLv2 Pilot Implementation version: 2023-08

I have created an eclipse plugin that serialize a SysML v2 ecore model instance (created programmatically) into its SysML v2 textual notation. However whenever the model instance contains a Usage (port, part, attribute) the serialization fails with the following error:

java.lang.NullPointerException: Cannot invoke "org.eclipse.xtext.serializer.analysis.IGrammarConstraintProvider$IFeatureInfo.getFeature()" because "feature" is null
    at org.eclipse.xtext.serializer.diagnostic.SequencerDiagnosticProvider.createBacktrackingFailedDiagnostic(SequencerDiagnosticProvider.java:75)
    at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:514)
    at org.omg.sysml.xtext.serializer.AbstractSysMLSemanticSequencer.sequence_BasicUsagePrefix_DefinitionBodyItem_Identification_MultiplicityPart_OccurrenceUsagePrefix_Redefines_Redefinitions_RefPrefix_References_Subsets_Subsettings_TypedBy_Typings_UsageExtensionKeyword_ValuePart(AbstractSysMLSemanticSequencer.java:7012)
    at org.omg.sysml.xtext.serializer.AbstractSysMLSemanticSequencer.sequence(AbstractSysMLSemanticSequencer.java:1419)
    at org.eclipse.xtext.serializer.sequencer.AbstractSemanticSequencer.createSequence(AbstractSemanticSequencer.java:68)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptEObjectRuleCall(SequenceFeeder.java:327)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptRuleCall(SequenceFeeder.java:354)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.accept(SequenceFeeder.java:265)
    at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.accept(BacktrackingSemanticSequencer.java:445)
    at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:512)
    at org.omg.sysml.xtext.serializer.AbstractSysMLSemanticSequencer.sequence_MemberPrefix_PackageMember(AbstractSysMLSemanticSequencer.java:10088)
    at org.omg.sysml.xtext.serializer.AbstractSysMLSemanticSequencer.sequence(AbstractSysMLSemanticSequencer.java:1325)
    at org.eclipse.xtext.serializer.sequencer.AbstractSemanticSequencer.createSequence(AbstractSemanticSequencer.java:68)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptEObjectRuleCall(SequenceFeeder.java:327)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptRuleCall(SequenceFeeder.java:354)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.accept(SequenceFeeder.java:265)
    at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.accept(BacktrackingSemanticSequencer.java:445)
    at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:512)
    at org.omg.sysml.xtext.serializer.AbstractSysMLSemanticSequencer.sequence_Identification_Package_PackageBody(AbstractSysMLSemanticSequencer.java:9729)
    at org.omg.sysml.xtext.serializer.AbstractSysMLSemanticSequencer.sequence(AbstractSysMLSemanticSequencer.java:1356)
    at org.eclipse.xtext.serializer.sequencer.AbstractSemanticSequencer.createSequence(AbstractSemanticSequencer.java:68)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptEObjectRuleCall(SequenceFeeder.java:327)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptRuleCall(SequenceFeeder.java:354)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.accept(SequenceFeeder.java:265)
    at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.accept(BacktrackingSemanticSequencer.java:445)
    at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:512)
    at org.omg.sysml.xtext.serializer.AbstractSysMLSemanticSequencer.sequence_MemberPrefix_PackageMember(AbstractSysMLSemanticSequencer.java:10088)
    at org.omg.sysml.xtext.serializer.AbstractSysMLSemanticSequencer.sequence(AbstractSysMLSemanticSequencer.java:1325)
    at org.eclipse.xtext.serializer.sequencer.AbstractSemanticSequencer.createSequence(AbstractSemanticSequencer.java:68)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptEObjectRuleCall(SequenceFeeder.java:327)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptRuleCall(SequenceFeeder.java:354)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.accept(SequenceFeeder.java:265)
    at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.accept(BacktrackingSemanticSequencer.java:445)
    at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:512)
    at org.omg.sysml.xtext.serializer.AbstractSysMLSemanticSequencer.sequence_PackageBodyElement_RootNamespace(AbstractSysMLSemanticSequencer.java:10540)
    at org.omg.sysml.xtext.serializer.AbstractSysMLSemanticSequencer.sequence(AbstractSysMLSemanticSequencer.java:1173)
    at org.eclipse.xtext.serializer.sequencer.AbstractSemanticSequencer.createSequence(AbstractSemanticSequencer.java:68)
    at org.eclipse.xtext.serializer.impl.Serializer.serialize(Serializer.java:122)
    at org.eclipse.xtext.serializer.impl.Serializer.serialize(Serializer.java:135)
    at org.eclipse.xtext.serializer.impl.Serializer.serialize(Serializer.java:205)
    at org.eclipse.xtext.resource.XtextResource.doSave(XtextResource.java:399)
    at org.eclipse.emf.ecore.resource.impl.ResourceImpl.save(ResourceImpl.java:1475)
    at org.eclipse.emf.ecore.resource.impl.ResourceImpl.save(ResourceImpl.java:1044)

Here is the code where I am trying to create programmatically the model instance and then trying to serialize it:

private void createModel() {
      Injector injector = XtextActivator.getInstance().getInjector(XtextActivator.ORG_OMG_SYSML_XTEXT_SYSML);
      ResourceSet resourceSet = injector.getInstance(ResourceSet.class);

      var path = Paths.get("test", "sysml_dummy.sysml");
      URI uri = URI.createPlatformResourceURI(path.toString(), true);
      var dummy_resource = resourceSet.createResource(uri);

      // Namespace Creation
      var root = SysMLFactory.eINSTANCE.createNamespace();
      dummy_resource.getContents().add(root);

      // Package Creation
      var my_package = SysMLFactory.eINSTANCE.createPackage();
      my_package.setDeclaredName("my_package");
      NamespaceUtil.addOwnedMemberTo(root, my_package);

      // Part Definition Creation
      var part_def = SysMLFactory.eINSTANCE.createPartDefinition();
      part_def.setDeclaredName("my_part_def");
      NamespaceUtil.addOwnedMemberTo(my_package, part_def);

      // Part Usage Creation
      var part_usage = SysMLFactory.eINSTANCE.createPartUsage();
      part_usage.setDeclaredName("my_part_usage");
      NamespaceUtil.addOwnedMemberTo(my_package, part_usage);

      // Set Part Definition
      var feature_typing = SysMLFactory.eINSTANCE.createFeatureTyping();
      feature_typing.setType(part_def);
      feature_typing.setTypedFeature(part_usage);
      part_usage.getOwnedRelationship().add(feature_typing);

      try {
          // Serialize
          dummy_resource.save(null);
      } catch (IOException e) {
          e.printStackTrace();
      }
}

I also tried to load the ecore model instance from a manually written model in SysML v2 textual language (to be sure that the problem was not related to the programmatically created model) and then trying to serialize it in a different file but I encountered the same problem.

The manual written file:.

package a {
    part def b;
    part c : b;
}

The code:

private void testSerialization(IFile f) {
      Injector injector = XtextActivator.getInstance().getInjector(XtextActivator.ORG_OMG_SYSML_XTEXT_SYSML);
      ResourceSet resourceSet = injector.getInstance(ResourceSet.class);

      File file = GUIResource.getFile(f);
      Path wks_path = Paths.get(GUIResource.getWorkspaceLocation());
      String rel_file_path = wks_path.relativize(file.toPath()).toString();
      URI uri =URI.createPlatformResourceURI(rel_file_path, true);

      // Get the ecore model instance
      Resource res = resourceSet.getResource(uri, true);
      EList<EObject> res_contents = res.getContents();
      EObject root = res_contents.get(0);
      if (root instanceof Element) {
          // Serialize the model in a new file
          Path path = Paths.get("test", "dummy.sysml");
          URI new_uri = URI.createPlatformResourceURI(path.toString(), true);
          Resource new_res = resourceSet.createResource(new_uri);
          new_res.getContents().add(root);
          try {
              new_res.save(null);
          } catch (IOException e) {
              e.printStackTrace();
          }
      }
}

Serializing the models in XMI format works fine.

Am I doing something wrong or currently the automatic serialization is not supported ?

seidewitz commented 7 months ago

Xtext serialization is not supported in the Pilot Implementation. There are separate efforts on-going to implement the generation of textual notation from KerML and SysML v2 XMI, but they are not ready for public release yet.