Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Content layer
id1043546914


Content column
id1043546918


Content block
id1043546912

On this page

Table of Contents
maxLevel3
minLevel3


Content block
id1043546917

TWC operates at the EMF level, while MagicDraw operates at the UML level, which is on the top of EMF. REST API, which is the TWC API, also operates at the EMF level.

Therefore, TWC is not affected by UML-specific implementation, and all derived properties may not be saved in the TWC database. The best-known derived property is owner. This is the result when there is no such “setOwner” in REST API.

Even though all non-derived properties are saved in the TWC database, they are saved as raw EMF data. The user is required to have knowledge about UML models to manipulate data. For example, an applied stereotype is saved as a hierarchy of InstanceSpecification, Slot, and ValueSpecification.

This section describes how to traverse into a UML model and create some elements in it.

MagicDraw project

In TWC terminology, a MagicDraw project is referred to as a resource. Although REST API can be used to create a TWC resource, it is only a bare project MagicDraw cannot read. A MagicDraw project is composed of many MagicDraw-specific meta-data such as project options, primary project, and used projects configuration. The best way to create a MagicDraw project is creating to create it by MagicDraw and submit it to the TWC server.

MagicDraw primary project

To traverse through a UML model, the primary project must be identified. The model data starts at the revision level. Issuing GET to /revisions/{revisionId} shows the first-level object in the revision. UUIDs of the first-level object are listed in rootObjectIDs.

Code Block
languagetext
{
	"commitType": "NORMAL",
    "branchID": "../..",
    "resourceID": "../../..",
    "@base": "http://127.0.0.1:8111/osmc/resources/4615e8fa-81e5-40e0-a51b-8496a48caf18/revisions/5/elements",
    "author": "Administrator",
    "@type": 
	[
    	"RDFSource",
    	"kerml:Revision"
    ],
    "pickedRevision": -1,
    "description": "Branch \"xx\" created",
    "@context": "http://127.0.0.1:8111/osmc/schemas/revision",
    "directParent": 3,
    "dependencies": [],
    "rootObjectIDs": 
	[
      	"429f969a-5c81-45f4-94af-8cf983f22950",
		"ec6060a3-f3d9-482b-93a3-32af9e19202c",
		"ca9a0235-f0f7-46b7-a142-e79a67c2d00d",     
		"f7c3ae92-af44-4dab-8163-a199ca05c006",
		"ba3d0700-1062-4baf-a1df-a55a4f31ce54",
		"0f14cd2d-2fd0-4523-950c-627d59e1a43d",
      	"7cd22dea-aaf8-4e08-bd67-5bd975c3f06a",
     	"af1042fa-8b1b-4cf2-bb7d-98dd1b881da3",
		"6d24e5e7-cdff-4e9e-85b8-28b3088f85b6",
		"243020e5-da6c-4896-b32a-fcba0e93ac8d",
		"f7449238-5cd1-41eb-9025-040210b02d93",
      	"4d2459a1-49dc-4eb7-aa82-9bbb4a76b038",
		"b242613d-957e-4aec-9333-e5938f50b2ab",  
		"9b953064-e422-4391-b7d9-43a2d4f14a32",
		"fc997cfd-23c5-4d0b-9953-06667dcde0dd",
		"29d9416b-ead5-4a9d-b530-b23de836f1b8",
		"7af3f24b-2da9-4b31-94b3-a87f15747296"
	],
	"createdDate": "1533051367",
	"ID": "",
    "artifacts": "artifacts"
},

Among these entries, the first element with the esiproject:EsiProject type specifies the primary project named main decomposition project. Other esiproject:EsiProject objects are the models (used projects) in a MagicDraw project. The main decomposition project is element 429f969a. You need to load element 429f969a and all their children. An element is represented in the JSONLD JSON-LD format. The attributes of the elements are in kerml:esiData. There will be an element named UML Model. The below code fragment shows the attributes of this element.

Code Block
languagetext
"kerml:esiData":
{
	"name": "UML Model",
    "namespace": "com.nomagic.magicdraw.uml_model",
	"project": 
	{
		"@id": "429f969a-5c81-45f4-94af-8cf983f22950"
	},
	"internalVersion": "1",
	"version": "17.0",
	"sections": 
	[
		{
			"@id": "b3e68e8e-2253-4726-8d05-d8f74fd0ba5a"
        }
	]
},

Take the first esiproject:EsiDataSection from the feature's sections list, which is b3e68e8e. The excerpt of the b3e68e8e data is shown below.

Code Block
languagetext
{
	"kerml:name": "model",
	"@base": "http://127.0.0.1:8111/osmc/resources/4615e8fa-81e5-40e0-a51b-8496a48caf18/revisions/5/elements",
	"kerml:nsURI": "http://www.nomagic.com/ns/magicdraw/esiproject/1.0",
	"@type": "esiproject:EsiDataSection",
    "kerml:owner": 
	{
		"@id": "429f969a-5c81-45f4-94af-8cf983f22950"
    },
    "kerml:revision": "http://127.0.0.1:8111/osmc/resources/4615e8fa-81e5-40e0-a51b-8496a48caf18/revisions/5",
    "@context": 
	{
		"esiproject:EsiDataSection": "http://127.0.0.1:8111/osmc/schema/esiproject/2014345/EsiDataSection",
		"kerml": "http://127.0.0.1:8111/osmc/schema/kerml/20140325"
    },
    "kerml:ownedElement": [],
    "kerml:modifiedTime": "20180731223607ICT",
    "kerml:esiData": 
	{
		"featuredBy": 
		{
			"@id": "c9256728-4617-4097-8e9e-dc63e2823bf8"
		},
		"rootElements":
		[
			"ca9a0235-f0f7-46b7-a142-e79a67c2d00d"
		],
		"name": "model",
      	"project":
		{
			"@id": "429f969a-5c81-45f4-94af-8cf983f22950"
      	},
		"properties": []
	},
	"kerml:resource": "http://127.0.0.1:8111/osmc/resources/4615e8fa-81e5-40e0-a51b-8496a48caf18",
    "kerml:esiID": "b3e68e8e-2253-4726-8d05-d8f74fd0ba5a",
	"@id": "#b3e68e8e-2253-4726-8d05-d8f74fd0ba5a"
}

The first ID in the rootElements list of the data section will be the ID of the UML model root element in the resource. The root element should always be of the uml:Package type or derived from it.

Traversing to a MagicDraw model

Once a root project is retrieved, the whole hierarchy can be retrieved layer by layer. An element can be retrieved from /elements/{elementId}. Child UUIDs of the resulting element are in kerml:ownedElement.

Multiple elements can be retrieved by POST to /elements. In this case, you need to put UUID in the uuid.txtfile to load elements.

Code Block
languagetext
4eeb2e6d-9cbc-4f59-9d74-69263e52ba54,520bc74d-b5b4-40d5-87cb-9d0b8aba5d2e,7a057ae7-6281-462d-9dcd-de9931633f5c,a6212656-5ad1-4de6-a47f-db656c2c25fd

The command to load those elements is:

Code Block
languagetext
curl -v -H "Content-Type: text/plain" -X POST -s --cookie cookie.txt --insecure -d @uuid.txt --insecure "https://server:8111/osmc/resources/${projectId}/elements"

In most cases, loading multiple elements at once is substantially faster than loading them one by one.

Creating elements

To use REST API to create elements, you are required to have knowledge about UML models, especially how to set the owner. A combination of parent-child type yields differences in the owner attribute. For example, if you want to create a class under a class, you need to set the UMLClass attribute in the child class. For a class under a package, you need to set owningPackage in the child class. The easiest way to know which attribute is needed is to try creating it in MagicDraw and get it in REST API.

There are two URLs to create element(s), /resources/{resourceId}/elements and /resources/{resourceId}/elements{elementId}. Please note that the elementId in the latter form is not the parent. An Ecore is needed to create an element. It can be specified in the following ways:

  • Specified from the elementId in /resources/{resourceId}/elements/{elementId}. This form is used in most cases, except from for creating the first element in the project. The new element data type will be in the same namespace of this specified element.

    Code Block
    languagetext
    {
    	"@type": "uml:Class",
    	"kerml:nsURI": "http://www.nomagic.com/magicdraw/UML/2.5.1.1",
    	"kerml:esiData": 
    	{
    		"owningPackage": 
    		{
    			"@id": "757be712-f397-404d-a5ff-b97567eb240f"
            },
            "name": "c3"
        }
    }
  • Specified from kerml:nsURI.
  • Specifying the whole Ecore in kerml:ecore. This mode is rarely used.

    Code Block
    languagetext
    {
    	"@type": "ikml:Container",
    	"kerml:esiData": 
    	{
    		"name": "txdhdhdhd",
    		"uri": "http://www.chula.ac.th",
        },
    	"kerml:ecore": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<ecore:EPackage xmi:version=\"2.0\" xmlns:xmi=\"http://www.omg.org/XMI\" 
    	xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n
    	xmlns:ecore=\"http://www.eclipse.org/emf/2002/Ecore\"
    	name=\"ikml\" nsURI=\"http://www.nomagic.com/ikml/1.0\"
    	nsPrefix=\"ikml\">\r\n 
    	<eClassifiers xsi:type=\"ecore:EClass\" name=\"Element\" abstract=\"true\"><\/eClassifiers>\r\n<\/ecore:EPackage>\r\n"
    }

The following script creates an element:

Code Block
languagetext
cat file.txt | curl -v -H "Content-Type: application/ld+json" -X POST -s --cookie cookie.txt --insecure -d @-https://server:8111/osmc/resources/${projectId}/elements

Multiple elements can be created at once by specifying the query parameter batch=true in the URL. The script is shown below:

Code Block
languagetext
cat file.txt | curl -v -H "Content-Type: application/ld+json" -X POST -s --cookie cookie.txt --insecure -d @-"https://server:8111/osmc/resources/${projectId}/elements/${elementId}?batch=true"


Applied stereotypes

Applied stereotypes stored in the appliedStereotype attribute are the arrays containing reference objects to stereotype objects. The code below shows an example of an applied stereotype.

Code Block
languagetext
{
    "@id": "#bdeffbc9-daae-407c-8663-d3b1a0ed6077",
	"kerml:esiID": "bdeffbc9-daae-407c-8663-d3b1a0ed6077",
	"@type": "uml:Class",
	"kerml:esiData": {
		"ID": "_2021x_2_3360135_1630482378802_586147_17",
		"mdExtensions": [],
		"_representationText": null,
		"taggedValue": [
			{
				"@id": "edaa1dd8-583d-4a8b-8974-3111aef8d47b"
            }
		],
		"appliedStereotype": [
			{
				"@id": "8dbdc804-5eed-424d-9812-28e183a8dfdc"
            }
		]
	}
}

To apply the stereotype, set PATCH to the element you are working on, as shown below.

Code Block
languagetext
{
	"@context": {
		"@base": "http://127.0.0.1:8111/osmc/workspaces/59068af0-a7ae-4663-
b972-3c58a2fde23f/resources/b0585059-c4e3-4d82-90d9-c5386045bb2e/branches/
5dfb978f-0984-47ea-aaec-bdbb5a945687/elements/",
		"kerml": "http://127.0.0.1:8111/osmc/schema/kerml/20140325",
		"uml:Class": "http://127.0.0.1:8111/osmc/schema/uml/2014345/Class"
	},
	"kerml:esiData": {
		"appliedStereotype": [
			{
				"@id": "8dbdc804-5eed-424d-9812-28e183a8dfdc"
            }
		]
    }
}

The UUID 8dbdc804 is an ID of the applied stereotype whose content is applied via the following command where the UUID 8df9f306 is an ID of the element to which the stereotype is applied:

Code Block
languagetext
$ curl -v -H "Content-Type: application/ld+json" -X POST -s -c ..\get\cookie.txt -b
..\get\cookie.txt --insecure -d @- https://127.0.0.1:8111/osmc/resources/2663059e-8ef5-4f13-97b6-864a0353d2d0/elements/8df9f306-c4dc-41fb-ac9f-4a87fe71610a


Tagged values

Tagged values stored in the taggedValue attribute are the arrays containing reference objects to tagged value objects. The code below shows an example of an applied stereotype and tagged values.

Code Block
languagetext
{
	"@id": "#bdeffbc9-daae-407c-8663-d3b1a0ed6077",
	"kerml:esiID": "bdeffbc9-daae-407c-8663-d3b1a0ed6077",
	"@type": "uml:Class",
	"kerml:esiData": {
		"ID": "_2021x_2_3360135_1630482378802_586147_17",
        "mdExtensions": [],
		"_representationText": null,
		"taggedValue": [
			{
				"@id": "d9388ec6-ddca-4c18-9a5c-409d8649731f"
            },
            {
				"@id": "edaa1dd8-583d-4a8b-8974-3111aef8d47b"
            }
		],
		"appliedStereotype": [
			{
				"@id": "8dbdc804-5eed-424d-9812-28e183a8dfdc"
            }
        ]
    }
}

To add a tagged value, apply the stereotype to the target element first.

Note
titleNote

The model is incorrect if tagged values do not have their corresponding stereotypes.

To apply the tagged value, use the POST request with the following code:

Code Block
languagetext
{
	"@type": "uml:StringTaggedValue",
	"kerml:esiData": {
		"tagDefinition": {
			"@id": "657a3511-d012-4134-af5d-411a6df78745"
        },
		"taggedValueOwner": {
			"@id": "515073dd-fe25-4327-bfc2-6466375a50f7"
        },
		"value": [
			"somevaluefromrest"
        ]
    }
}

The command will be:

Code Block
languagetext
curl -v -H "Content-Type: application/ld+json" -X POST -s -c ..\get\cookie.txt -b ..\get\cookie.txt
--insecure -d @- https://127.0.0.1:8111/osmc/resources/2663059e-8ef5-4f13-97b6-864a0353d2d0/elements/8df9f306-c4dc-41fb-ac9f-4a87fe71610a


Content block
id1043575942

Related pages



...