Is there a simpler way to serialize / deserialize business object?

Hi,
I create custom meta model:

{
  "name": "ext",
  "uri": "http://some-company/schema/bpmn/qa",
  "prefix": "au",
  "xml": {
    "tagAlias": "lowerCase"
  },
  "types": [
    {
      "name": "NewTask",
      "extends": ["bpmn:Task"],
      "properties": [
        {
          "name": "task-description",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "arr",
          "isMany": true,
          "type": "String"
        },
        {
          "name": "obj",
          "type": "TaskExt"
        }
      ]
    },
    {
      "name": "TaskExt",
      "superClass": [ "Element" ],
      "properties": [
        {
          "name": "str",
          "type": "String"
        },
        {
          "name": "num",
          "isAttr": true,
          "type": "Integer"
        },
        {
          "name": "arr",
          "isMany": true,
          "type": "String"
        }
      ]
    }
  ],
  "emumerations": [],
  "associations": []
}

And successfully (I guess) save it to Task element and export to xml.
Save method:

function updateTask(element) {
  function getExtensionElement(element, type) {
  if (!element.extensionElements) {
    return;
  }

  return element.extensionElements.values.filter((extensionElement) => {
    return extensionElement.$instanceOf(type);
  })[0];
}

  const businessObject = getBusinessObject(element);
  const extensionElements = businessObject.extensionElements || modeler.get("moddle").create('bpmn:ExtensionElements');
  let obj = getExtensionElement(businessObject, "au:TaskExt")

  if (!obj) {
    obj = modeler.get("moddle").create("au:TaskExt");
    extensionElements.get("values").push(obj)
  }

  obj.str = "test"
  obj.num = 2,
  obj.arr = ["test1","test2"]

  modeler.get("modeling").updateModdleProperties(element,getBusinessObject(element), {
    name: "New task",
    "task-description": "description",
    arr: ["1","2","3"],
    extensionElements,
  });
}

and result xml:

...
<bpmn2:task id="Activity_1a76hwu" name="New task" au:task-description="testest">
      <bpmn2:extensionElements>
        <au:taskExt num="2">
          <au:str>test</au:str>
          <au:arr>test1</au:arr>
          <au:arr>test2</au:arr>
        </au:taskExt>
      </bpmn2:extensionElements>
      <bpmn2:incoming>Flow_0ho1ls1</bpmn2:incoming>
      <bpmn2:outgoing>Flow_0j8ypqx</bpmn2:outgoing>
      <au:arr>1</au:arr>
      <au:arr>2</au:arr>
      <au:arr>3</au:arr>
    </bpmn2:task>
...

ModdleElement (businessObject):

image

And finally, my question :smiley: is there a simpler way to read/write elements models? Like for example:

...
modeler.get("modeling").updateModel(element, {
    name: "New task",
    "task-description": "description",
    arr: ["1", "2", "3"],
    obj: {
      str: "test",
      num: 2,
      arr: ["test1", "test2"]
    }
  });
  ...
  const NewTask = modeler.get("moddle").getModel(element)
  // Result: 
  // {
  //   name: "New task",
  //   "task-description": "description",
  //   arr: ["1", "2", "3"],
  //   obj: {
  //     str: "test",
  //     num: 2,
  //     arr: ["test1", "test2"]
  //   }
  // }

No, there isn’t. You’re not dealing with plain objects but with instances that carry more information than just the properties you see.

1 Like

This topic was automatically closed 7 days after the last reply. New replies are no longer allowed.