diff --git a/core/src/main/java/org/lionweb/lioncore/java/serialization/LowLevelJsonSerialization.java b/core/src/main/java/org/lionweb/lioncore/java/serialization/LowLevelJsonSerialization.java new file mode 100644 index 00000000..84bd0440 --- /dev/null +++ b/core/src/main/java/org/lionweb/lioncore/java/serialization/LowLevelJsonSerialization.java @@ -0,0 +1,195 @@ +package org.lionweb.lioncore.java.serialization; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import org.lionweb.lioncore.java.serialization.data.*; + +import javax.annotation.Nullable; + +import static org.lionweb.lioncore.java.serialization.SerializationUtils.*; + +/** + * This class is responsible for handling serialization and unserialization from JSON and the low-level + * representation of models composed by SerializationBlock and the related classes. + */ +public class LowLevelJsonSerialization { + + /** + * This will return a lower-level representation of the information stored in JSON. + * It is intended to load broken models. + *

+ * Possible usages: repair a broken model, extract a metamodel from the model (“model archeology”), etc. + *

+ * This method follows a "best-effort" approach, try to limit exception thrown and return data whenever is possible, + * in the measure that it is possible. + */ + public SerializedChunk unserializeSerializationBlock(JsonElement jsonElement) { + SerializedChunk serializedChunk = new SerializedChunk(); + if (jsonElement.isJsonObject()) { + JsonObject topLevel = jsonElement.getAsJsonObject(); + readSerializationFormatVersion(serializedChunk, topLevel); + readMetamodels(serializedChunk, topLevel); + unserializeNodes(serializedChunk, topLevel); + return serializedChunk; + } else { + throw new IllegalArgumentException("We expected a Json Object, we got instead: " + jsonElement); + } + } + + public JsonElement serializeToJson(SerializedChunk serializedChunk) { + JsonObject topLevel = new JsonObject(); + topLevel.addProperty("serializationFormatVersion", serializedChunk.getSerializationFormatVersion()); + + JsonArray metamodels = new JsonArray(); + topLevel.add("metamodels", metamodels); + + JsonArray nodes = new JsonArray(); + for (SerializedNode node: serializedChunk.getNodes()) { + JsonObject nodeJson = new JsonObject(); + nodeJson.addProperty("id", node.getID()); + nodeJson.add("concept", serializeToJson(node.getConcept())); + + JsonArray properties = new JsonArray(); + for (SerializedPropertyValue propertyValue : node.getProperties()) { + JsonObject property = new JsonObject(); + property.add("property", serializeToJson(propertyValue.getMetaPointer())); + property.addProperty("value", propertyValue.getValue()); + properties.add(property); + } + nodeJson.add("properties", properties); + + JsonArray children = new JsonArray(); + for (SerializedContainmentValue childrenValue : node.getContainments()) { + JsonObject childrenJ = new JsonObject(); + childrenJ.add("containment", serializeToJson(childrenValue.getMetaPointer())); + childrenJ.add("children", toJsonArray(childrenValue.getValue())); + children.add(childrenJ); + } + nodeJson.add("children", children); + + JsonArray references = new JsonArray(); + for (SerializedReferenceValue referenceValue : node.getReferences()) { + JsonObject reference = new JsonObject(); + reference.add("reference", serializeToJson(referenceValue.getMetaPointer())); + reference.add("targets", toJsonArrayOfReferenceValues(referenceValue.getValue())); + references.add(reference); + } + nodeJson.add("references", references); + + nodeJson.addProperty("parent", node.getParentNodeID()); + + nodes.add(nodeJson); + } + topLevel.add("nodes", nodes); + + return topLevel; + } + + private void readSerializationFormatVersion(SerializedChunk serializedChunk, JsonObject topLevel) { + if (!topLevel.has("serializationFormatVersion")) { + throw new IllegalArgumentException("serializationFormatVersion not specified"); + } + String serializationFormatVersion = topLevel.get("serializationFormatVersion").getAsString(); + serializedChunk.setSerializationFormatVersion(serializationFormatVersion); + } + + private void readMetamodels(SerializedChunk serializedChunk, JsonObject topLevel) { + if (!topLevel.has("metamodels")) { + throw new IllegalArgumentException("metamodels not specified"); + } + if (topLevel.get("metamodels").isJsonArray()) { + topLevel.get("metamodels").getAsJsonArray().asList().stream().forEach(element -> { + try { + MetamodelKeyVersion metamodelKeyVersion = new MetamodelKeyVersion(); + if (element.isJsonObject()) { + JsonObject jsonObject = element.getAsJsonObject(); + if (!jsonObject.has("key") || !jsonObject.has("version")) { + throw new IllegalArgumentException("Metamodel should have keys key and version. Found: " + + element); + } + metamodelKeyVersion.setKey(jsonObject.get("key").getAsString()); + metamodelKeyVersion.setVersion(jsonObject.get("version").getAsString()); + } else { + throw new IllegalArgumentException("Metamodel should be an object. Found: " + element); + } + serializedChunk.addMetamodel(metamodelKeyVersion); + } catch (Exception e) { + throw new RuntimeException("Issue while unserializing " + element, e); + } + }); + } else { + throw new IllegalArgumentException("We expected a Json Array, we got instead: " + + topLevel.get("metamodels")); + } + } + + private void unserializeNodes(SerializedChunk serializedChunk, JsonObject topLevel) { + if (!topLevel.has("nodes")) { + throw new IllegalArgumentException("nodes not specified"); + } + if (topLevel.get("nodes").isJsonArray()) { + topLevel.get("nodes").getAsJsonArray().asList().stream().forEach(element -> { + try { + SerializedNode node = unserializeNode(element); + serializedChunk.addNode(node); + } catch (Exception e) { + throw new RuntimeException("Issue while unserializing " + element, e); + } + }); + } else { + throw new IllegalArgumentException("We expected a Json Array, we got instead: " + topLevel.get("nodes")); + } + } + + private JsonElement serializeToJson(MetaPointer metapointer) { + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("metamodel", metapointer.getMetamodel()); + jsonObject.addProperty("version", metapointer.getVersion()); + jsonObject.addProperty("key", metapointer.getKey()); + return jsonObject; + } + + @Nullable + private SerializedNode unserializeNode(JsonElement jsonElement) { + if (!jsonElement.isJsonObject()) { + throw new IllegalArgumentException("Malformed JSON. Object expected but found " + jsonElement); + } + JsonObject jsonObject = jsonElement.getAsJsonObject(); + + SerializedNode serializedNode = new SerializedNode(); + serializedNode.setID(tryToGetStringProperty(jsonObject, "id")); + serializedNode.setConcept(tryToGetMetaPointerProperty(jsonObject, "concept")); + serializedNode.setParentNodeID(tryToGetStringProperty(jsonObject, "parent")); + + JsonArray properties = jsonObject.get("properties").getAsJsonArray(); + properties.forEach(property -> { + JsonObject propertyJO = property.getAsJsonObject(); + serializedNode.addPropertyValue(new SerializedPropertyValue( + tryToGetMetaPointerProperty(propertyJO, "property"), + tryToGetStringProperty(propertyJO, "value") + )); + }); + + JsonArray children = jsonObject.get("children").getAsJsonArray(); + children.forEach(childrenEntry -> { + JsonObject childrenJO = childrenEntry.getAsJsonObject(); + serializedNode.addContainmentValue(new SerializedContainmentValue( + tryToGetMetaPointerProperty(childrenJO, "containment"), + tryToGetArrayOfStringsProperty(childrenJO, "children") + )); + }); + + JsonArray references = jsonObject.get("references").getAsJsonArray(); + references.forEach(referenceEntry -> { + JsonObject referenceJO = referenceEntry.getAsJsonObject(); + serializedNode.addReferenceValue(new SerializedReferenceValue( + tryToGetMetaPointerProperty(referenceJO, "reference"), + tryToGetArrayOfReferencesProperty(referenceJO, "targets") + )); + }); + + return serializedNode; + } + +} diff --git a/core/src/main/java/org/lionweb/lioncore/java/serialization/SerializationUtils.java b/core/src/main/java/org/lionweb/lioncore/java/serialization/SerializationUtils.java new file mode 100644 index 00000000..aeb2f246 --- /dev/null +++ b/core/src/main/java/org/lionweb/lioncore/java/serialization/SerializationUtils.java @@ -0,0 +1,109 @@ +package org.lionweb.lioncore.java.serialization; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import org.lionweb.lioncore.java.model.ReferenceValue; +import org.lionweb.lioncore.java.serialization.data.MetaPointer; +import org.lionweb.lioncore.java.serialization.data.SerializedReferenceValue; + +import javax.annotation.Nullable; +import java.util.List; +import java.util.stream.Collectors; + +/** + * Collection of utility methods to simplify serialization and unserialization to JSON. + */ +class SerializationUtils { + + private SerializationUtils() { + // Prevent instantiation + } + + @Nullable + static String getAsStringOrNull(JsonElement element) { + if (element == null || element.isJsonNull()) { + return null; + } else { + return element.getAsString(); + } + } + + @Nullable + static String tryToGetStringProperty(JsonObject jsonObject, String propertyName) { + if (!jsonObject.has(propertyName)) { + return null; + } + JsonElement value = jsonObject.get(propertyName); + if (value.isJsonPrimitive() && value.getAsJsonPrimitive().isString()) { + return value.getAsJsonPrimitive().getAsString(); + } else { + return null; + } + } + + @Nullable + static MetaPointer tryToGetMetaPointerProperty(JsonObject jsonObject, String propertyName) { + if (!jsonObject.has(propertyName)) { + return null; + } + JsonElement value = jsonObject.get(propertyName); + if (value.isJsonObject()) { + JsonObject valueJO = value.getAsJsonObject(); + return new MetaPointer(tryToGetStringProperty(valueJO,"metamodel"), + tryToGetStringProperty(valueJO,"version"), + tryToGetStringProperty(valueJO,"key")); + } else { + return null; + } + } + + @Nullable + static List tryToGetArrayOfStringsProperty(JsonObject jsonObject, String propertyName) { + if (!jsonObject.has(propertyName)) { + return null; + } + JsonElement value = jsonObject.get(propertyName); + if (value.isJsonArray()) { + JsonArray valueJA = value.getAsJsonArray(); + return valueJA.asList().stream().map(e -> e.getAsString()).collect(Collectors.toList()); + } else { + return null; + } + } + + @Nullable + static List tryToGetArrayOfReferencesProperty(JsonObject jsonObject, + String propertyName) { + if (!jsonObject.has(propertyName)) { + return null; + } + JsonElement value = jsonObject.get(propertyName); + if (value.isJsonArray()) { + JsonArray valueJA = value.getAsJsonArray(); + return valueJA.asList().stream().map(e -> new SerializedReferenceValue.Entry( + tryToGetStringProperty(e.getAsJsonObject(), "reference"), + tryToGetStringProperty(e.getAsJsonObject(), "resolveInfo") + )).collect(Collectors.toList()); + } else { + return null; + } + } + + static JsonArray toJsonArray(List stringList) { + JsonArray jsonArray = new JsonArray(); + stringList.forEach(s -> jsonArray.add(s)); + return jsonArray; + } + + static JsonArray toJsonArrayOfReferenceValues(List entries) { + JsonArray jsonArray = new JsonArray(); + entries.forEach(e -> { + JsonObject entryJson = new JsonObject(); + entryJson.addProperty("resolveInfo", e.getResolveInfo()); + entryJson.addProperty("reference", e.getReference()); + jsonArray.add(entryJson); + }); + return jsonArray; + } +} diff --git a/core/src/main/java/org/lionweb/lioncore/java/serialization/data/MetaPointer.java b/core/src/main/java/org/lionweb/lioncore/java/serialization/data/MetaPointer.java new file mode 100644 index 00000000..6aeddefa --- /dev/null +++ b/core/src/main/java/org/lionweb/lioncore/java/serialization/data/MetaPointer.java @@ -0,0 +1,97 @@ +package org.lionweb.lioncore.java.serialization.data; + +import org.lionweb.lioncore.java.metamodel.HasKey; +import org.lionweb.lioncore.java.metamodel.Metamodel; +import org.lionweb.lioncore.java.metamodel.MetamodelElement; + +import java.util.Objects; + +/** + * A MetaPointer is the combination of the pair Metamodel & Version with a Key, which identify one element within + * that metamodel. + */ +public class MetaPointer { + private String key; + private String version; + private String metamodel; + + public MetaPointer(String metamodel, String version, String key) { + this.key = key; + this.version = version; + this.metamodel = metamodel; + } + + public MetaPointer() { + + } + + public static MetaPointer from(MetamodelElement metamodelElement) { + MetaPointer metaPointer = new MetaPointer(); + metaPointer.setKey(metamodelElement.getKey()); + if (metamodelElement.getMetamodel() != null) { + metaPointer.setMetamodel(metamodelElement.getMetamodel().getKey()); + if (metamodelElement.getMetamodel().getVersion() != null) { + metaPointer.setVersion(metamodelElement.getMetamodel().getVersion()); + } + } + return metaPointer; + } + + public static MetaPointer from(HasKey elementWithKey, Metamodel metamodel) { + MetaPointer metaPointer = new MetaPointer(); + metaPointer.setKey(elementWithKey.getKey()); + if (metamodel != null) { + metaPointer.setMetamodel(metamodel.getKey()); + if (metamodel.getVersion() != null) { + metaPointer.setVersion(metamodel.getVersion()); + } + } + return metaPointer; + } + + public String getMetamodel() { + return metamodel; + } + + public void setMetamodel(String metamodel) { + this.metamodel = metamodel; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getVersion() { + return version; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof MetaPointer)) return false; + MetaPointer that = (MetaPointer) o; + return Objects.equals(key, that.key) && Objects.equals(version, that.version) && Objects.equals(metamodel, that.metamodel); + } + + @Override + public int hashCode() { + return Objects.hash(key, version, metamodel); + } + + public void setVersion(String version) { + this.version = version; + } + + @Override + public String toString() { + return "MetaPointer{" + + "key='" + key + '\'' + + ", version='" + version + '\'' + + ", metamodel='" + metamodel + '\'' + + '}'; + } +} diff --git a/core/src/main/java/org/lionweb/lioncore/java/serialization/data/MetamodelKeyVersion.java b/core/src/main/java/org/lionweb/lioncore/java/serialization/data/MetamodelKeyVersion.java new file mode 100644 index 00000000..574bc420 --- /dev/null +++ b/core/src/main/java/org/lionweb/lioncore/java/serialization/data/MetamodelKeyVersion.java @@ -0,0 +1,58 @@ +package org.lionweb.lioncore.java.serialization.data; + +import org.lionweb.lioncore.java.metamodel.Metamodel; + +import javax.annotation.Nonnull; +import java.util.Objects; + +/** + * The pair Metamodel Key and Metamodel Version identify a specific version of a metamodel. + */ +public class MetamodelKeyVersion { + private String key; + private String version; + + public MetamodelKeyVersion() { + + } + + public MetamodelKeyVersion(String key, String version) { + this.key = key; + this.version = version; + } + + public static MetamodelKeyVersion fromMetamodel(@Nonnull Metamodel metamodel) { + Objects.requireNonNull(metamodel, "Metamodel parameter should not be null"); + Objects.requireNonNull(metamodel.getVersion(), "Metamodel version should not be null"); + return new MetamodelKeyVersion(metamodel.getKey(), metamodel.getVersion()); + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof MetamodelKeyVersion)) return false; + MetamodelKeyVersion that = (MetamodelKeyVersion) o; + return Objects.equals(key, that.key) && Objects.equals(version, that.version); + } + + @Override + public int hashCode() { + return Objects.hash(key, version); + } +} diff --git a/core/src/main/java/org/lionweb/lioncore/java/serialization/data/RawReferenceValue.java b/core/src/main/java/org/lionweb/lioncore/java/serialization/data/RawReferenceValue.java new file mode 100644 index 00000000..c5af2093 --- /dev/null +++ b/core/src/main/java/org/lionweb/lioncore/java/serialization/data/RawReferenceValue.java @@ -0,0 +1,42 @@ +package org.lionweb.lioncore.java.serialization.data; + +import java.util.Objects; + +public class RawReferenceValue { + public String referredId; + public String resolveInfo; + + public String getReferredId() { + return referredId; + } + + public void setReferredId(String referredId) { + this.referredId = referredId; + } + + public String getResolveInfo() { + return resolveInfo; + } + + public void setResolveInfo(String resolveInfo) { + this.resolveInfo = resolveInfo; + } + + public RawReferenceValue(String referredId, String resolveInfo) { + this.referredId = referredId; + this.resolveInfo = resolveInfo; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof RawReferenceValue)) return false; + RawReferenceValue that = (RawReferenceValue) o; + return Objects.equals(referredId, that.referredId) && Objects.equals(resolveInfo, that.resolveInfo); + } + + @Override + public int hashCode() { + return Objects.hash(referredId, resolveInfo); + } +} diff --git a/core/src/main/java/org/lionweb/lioncore/java/serialization/data/SerializedChunk.java b/core/src/main/java/org/lionweb/lioncore/java/serialization/data/SerializedChunk.java new file mode 100644 index 00000000..2d27b448 --- /dev/null +++ b/core/src/main/java/org/lionweb/lioncore/java/serialization/data/SerializedChunk.java @@ -0,0 +1,78 @@ +package org.lionweb.lioncore.java.serialization.data; + +import javax.annotation.Nonnull; +import java.util.*; + +/** + * This represents a chunk of nodes which have been serialized. The serialization could be inconsistent. + * This is a low-level representation, intended to represent broken chunks or as an intermediate step during + * serialization or unserialization. + */ +public class SerializedChunk { + + private Map nodesByID = new HashMap<>(); + + private String serializationFormatVersion; + private List metamodels = new ArrayList<>(); + private List nodes = new ArrayList<>(); + + public void setSerializationFormatVersion(String value) { + this.serializationFormatVersion = value; + } + + public String getSerializationFormatVersion() { + return serializationFormatVersion; + } + + public List getNodes() { + return nodes; + } + + public void addNode(SerializedNode node) { + this.nodesByID.put(node.getID(), node); + nodes.add(node); + } + + @Nonnull + public SerializedNode getNodeByID(String nodeID) { + SerializedNode node = this.nodesByID.get(nodeID); + if (node == null) { + throw new IllegalArgumentException("Cannot find node with ID " + nodeID); + } + return node; + } + + public void addMetamodel(MetamodelKeyVersion metamodel) { + this.metamodels.add(metamodel); + } + + public Map getNodesByID() { + return nodesByID; + } + + public List getMetamodels() { + return metamodels; + } + + @Override + public String toString() { + return "SerializationBlock{" + + ", serializationFormatVersion='" + serializationFormatVersion + '\'' + + ", metamodels=" + metamodels + + ", nodes=" + nodes + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof SerializedChunk)) return false; + SerializedChunk that = (SerializedChunk) o; + return serializationFormatVersion.equals(that.serializationFormatVersion) && metamodels.equals(that.metamodels) && nodes.equals(that.nodes); + } + + @Override + public int hashCode() { + return Objects.hash(serializationFormatVersion, metamodels, nodes); + } +} diff --git a/core/src/main/java/org/lionweb/lioncore/java/serialization/data/SerializedContainmentValue.java b/core/src/main/java/org/lionweb/lioncore/java/serialization/data/SerializedContainmentValue.java new file mode 100644 index 00000000..2d1fceda --- /dev/null +++ b/core/src/main/java/org/lionweb/lioncore/java/serialization/data/SerializedContainmentValue.java @@ -0,0 +1,64 @@ +package org.lionweb.lioncore.java.serialization.data; + +import java.util.List; +import java.util.Objects; + +/** + * This represents the serialization of the values of a containment link in a Node. + */ +public class SerializedContainmentValue { + private MetaPointer metaPointer; + private List value; + + public SerializedContainmentValue() { + + } + + public SerializedContainmentValue(MetaPointer metaPointer, List value) { + this.metaPointer = metaPointer; + this.value = value; + } + + public MetaPointer getMetaPointer() { + return metaPointer; + } + + public void setMetaPointer(MetaPointer metaPointer) { + this.metaPointer = metaPointer; + } + + /** + * This returns the list of Node-IDs contained. + */ + public List getValue() { + return value; + } + + /** + * This expects the list of Node-IDs contained. + */ + public void setValue(List value) { + this.value = value; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof SerializedContainmentValue)) return false; + SerializedContainmentValue that = (SerializedContainmentValue) o; + return Objects.equals(metaPointer, that.metaPointer) && Objects.equals(value, that.value); + } + + @Override + public int hashCode() { + return Objects.hash(metaPointer, value); + } + + @Override + public String toString() { + return "SerializedContainmentValue{" + + "metaPointer=" + metaPointer + + ", value=" + value + + '}'; + } +} diff --git a/core/src/main/java/org/lionweb/lioncore/java/serialization/data/SerializedNode.java b/core/src/main/java/org/lionweb/lioncore/java/serialization/data/SerializedNode.java new file mode 100644 index 00000000..f63917d3 --- /dev/null +++ b/core/src/main/java/org/lionweb/lioncore/java/serialization/data/SerializedNode.java @@ -0,0 +1,140 @@ +package org.lionweb.lioncore.java.serialization.data; + +import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * Lower level representation of Node which is used to load broken nodes during serialization. + */ +public class SerializedNode { + private String id; + private MetaPointer concept; + private String parentNodeID; + + private List properties = new ArrayList<>(); + private List containments = new ArrayList<>(); + private List references = new ArrayList<>(); + + public SerializedNode() { + + } + + public SerializedNode(String id, MetaPointer concept) { + setID(id); + setConcept(concept); + } + + public String getParentNodeID() { + return parentNodeID; + } + + public void setParentNodeID(String parentNodeID) { + this.parentNodeID = parentNodeID; + } + + public List getContainments() { + return this.containments; + } + + public List getChildren() { + List children = new ArrayList<>(); + this.containments.forEach(c -> children.addAll(c.getValue())); + return children; + } + + public List getReferences() { + return this.references; + } + + public List getProperties() { + return properties; + } + + public void addPropertyValue(SerializedPropertyValue propertyValue) { + this.properties.add(propertyValue); + } + + public void addContainmentValue(SerializedContainmentValue containmentValue) { + this.containments.add(containmentValue); + } + + public void addReferenceValue(SerializedReferenceValue referenceValue) { + this.references.add(referenceValue); + } + + public MetaPointer getConcept() { + return concept; + } + + public void setConcept(MetaPointer concept) { + this.concept = concept; + } + + @Nullable + public String getID() { + return id; + } + + public void setID(String id) { + this.id = id; + } + + public void setPropertyValue(MetaPointer property, String serializedValue) { + this.properties.add(new SerializedPropertyValue(property, serializedValue)); + } + + public void addChildren(MetaPointer containment, List childrenIds) { + this.containments.add(new SerializedContainmentValue(containment, childrenIds)); + } + + public void addReferenceValue(MetaPointer reference, List referenceValues) { + this.references.add(new SerializedReferenceValue(reference, referenceValues)); + } + + @Nullable + public String getPropertyValue(String propertyKey) { + for (SerializedPropertyValue pv: this.getProperties()) { + if (pv.getMetaPointer().getKey().equals(propertyKey)) { + return pv.getValue(); + } + } + return null; + } + + @Nullable + public List getReferenceValues(String referenceKey) { + for (SerializedReferenceValue rv: this.getReferences()) { + if (rv.getMetaPointer().getKey().equals(referenceKey)) { + return rv.getValue(); + } + } + return null; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof SerializedNode)) return false; + SerializedNode that = (SerializedNode) o; + return Objects.equals(id, that.id) && Objects.equals(concept, that.concept) && Objects.equals(parentNodeID, that.parentNodeID) && Objects.equals(properties, that.properties) && Objects.equals(containments, that.containments) && Objects.equals(references, that.references); + } + + @Override + public int hashCode() { + return Objects.hash(id, concept, parentNodeID, properties, containments, references); + } + + @Override + public String toString() { + return "SerializedNode{" + + "id='" + id + '\'' + + ", concept=" + concept + + ", parentNodeID='" + parentNodeID + '\'' + + ", properties=" + properties + + ", containments=" + containments + + ", references=" + references + + '}'; + } +} diff --git a/core/src/main/java/org/lionweb/lioncore/java/serialization/data/SerializedPropertyValue.java b/core/src/main/java/org/lionweb/lioncore/java/serialization/data/SerializedPropertyValue.java new file mode 100644 index 00000000..691b1a71 --- /dev/null +++ b/core/src/main/java/org/lionweb/lioncore/java/serialization/data/SerializedPropertyValue.java @@ -0,0 +1,57 @@ +package org.lionweb.lioncore.java.serialization.data; + +import java.util.Objects; + +/** + * This represents the serialization of the value of a property in a Node. + */ +public class SerializedPropertyValue { + private MetaPointer metaPointer; + private String value; + + public SerializedPropertyValue() { + + } + + public SerializedPropertyValue(MetaPointer metaPointer, String value) { + this.metaPointer = metaPointer; + this.value = value; + } + + public MetaPointer getMetaPointer() { + return metaPointer; + } + + public void setMetaPointer(MetaPointer metaPointer) { + this.metaPointer = metaPointer; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + @Override + public String toString() { + return "SerializedPropertyValue{" + + "metaPointer=" + metaPointer + + ", value='" + value + '\'' + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof SerializedPropertyValue)) return false; + SerializedPropertyValue that = (SerializedPropertyValue) o; + return Objects.equals(metaPointer, that.metaPointer) && Objects.equals(value, that.value); + } + + @Override + public int hashCode() { + return Objects.hash(metaPointer, value); + } +} diff --git a/core/src/main/java/org/lionweb/lioncore/java/serialization/data/SerializedReferenceValue.java b/core/src/main/java/org/lionweb/lioncore/java/serialization/data/SerializedReferenceValue.java new file mode 100644 index 00000000..b1077971 --- /dev/null +++ b/core/src/main/java/org/lionweb/lioncore/java/serialization/data/SerializedReferenceValue.java @@ -0,0 +1,109 @@ +package org.lionweb.lioncore.java.serialization.data; + +import java.util.List; +import java.util.Objects; + +/** + * This represents the serialization of the values of a reference link in a Node. + */ +public class SerializedReferenceValue { + + public static class Entry { + private String resolveInfo; + private String reference; + + public Entry() { + } + + public Entry(String reference, String resolveInfo) { + this.resolveInfo = resolveInfo; + this.reference = reference; + } + + public String getResolveInfo() { + return resolveInfo; + } + + public void setResolveInfo(String resolveInfo) { + this.resolveInfo = resolveInfo; + } + + public String getReference() { + return reference; + } + + public void setReference(String reference) { + this.reference = reference; + } + + @Override + public String toString() { + return "Entry{" + + "resolveInfo='" + resolveInfo + '\'' + + ", reference='" + reference + '\'' + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Entry)) return false; + Entry entry = (Entry) o; + return Objects.equals(resolveInfo, entry.resolveInfo) && Objects.equals(reference, entry.reference); + } + + @Override + public int hashCode() { + return Objects.hash(resolveInfo, reference); + } + } + + private MetaPointer metaPointer; + private List value; + + public SerializedReferenceValue() { + + } + + public SerializedReferenceValue(MetaPointer metaPointer, List value) { + this.metaPointer = metaPointer; + this.value = value; + } + + public MetaPointer getMetaPointer() { + return metaPointer; + } + + public void setMetaPointer(MetaPointer metaPointer) { + this.metaPointer = metaPointer; + } + + public List getValue() { + return value; + } + + public void setValue(List value) { + this.value = value; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof SerializedReferenceValue)) return false; + SerializedReferenceValue that = (SerializedReferenceValue) o; + return Objects.equals(metaPointer, that.metaPointer) && Objects.equals(value, that.value); + } + + @Override + public int hashCode() { + return Objects.hash(metaPointer, value); + } + + @Override + public String toString() { + return "SerializedReferenceValue{" + + "metaPointer=" + metaPointer + + ", value=" + value + + '}'; + } +} diff --git a/core/src/test/java/org/lionweb/lioncore/java/serialization/LowLevelJsonSerializationTest.java b/core/src/test/java/org/lionweb/lioncore/java/serialization/LowLevelJsonSerializationTest.java new file mode 100644 index 00000000..2295898d --- /dev/null +++ b/core/src/test/java/org/lionweb/lioncore/java/serialization/LowLevelJsonSerializationTest.java @@ -0,0 +1,90 @@ +package org.lionweb.lioncore.java.serialization; + +import com.google.gson.JsonElement; +import com.google.gson.JsonParser; +import org.junit.Test; +import org.lionweb.lioncore.java.serialization.data.MetaPointer; +import org.lionweb.lioncore.java.serialization.data.SerializedChunk; +import org.lionweb.lioncore.java.serialization.data.SerializedNode; +import org.lionweb.lioncore.java.serialization.data.SerializedReferenceValue; + +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.Arrays; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.lionweb.lioncore.java.serialization.SerializedJsonComparisonUtils.assertEquivalentLionWebJson; + +public class LowLevelJsonSerializationTest { + + @Test + public void unserializeLionCoreToSerializedNodes() { + InputStream inputStream = this.getClass().getResourceAsStream("/serialization/lioncore.json"); + JsonElement jsonElement = JsonParser.parseReader(new InputStreamReader(inputStream)); + LowLevelJsonSerialization jsonSerialization = new LowLevelJsonSerialization(); + SerializedChunk serializedChunk = jsonSerialization.unserializeSerializationBlock(jsonElement); + List unserializedSerializedNodeData = serializedChunk.getNodes(); + + SerializedNode lioncore = unserializedSerializedNodeData.get(0); + assertEquals(new MetaPointer("LIonCore_M3", "1", "LIonCore_M3_Metamodel"), lioncore.getConcept()); + assertEquals("LIonCore_M3", lioncore.getID()); + assertEquals("LIonCore.M3", lioncore.getPropertyValue("LIonCore_M3_Metamodel_name")); + assertEquals(17, lioncore.getChildren().size()); + assertEquals(null, lioncore.getParentNodeID()); + + SerializedNode namespacedEntity = unserializedSerializedNodeData.stream().filter(e -> e.getID().equals("LIonCore_M3_NamespacedEntity")).findFirst().get(); + assertEquals(new MetaPointer("LIonCore_M3", "1", "LIonCore_M3_Concept"), namespacedEntity.getConcept()); + assertEquals("LIonCore_M3_NamespacedEntity", namespacedEntity.getID()); + assertEquals("true", namespacedEntity.getPropertyValue("LIonCore_M3_Concept_abstract")); + assertEquals("NamespacedEntity", namespacedEntity.getPropertyValue("LIonCore_M3_NamespacedEntity_simpleName")); + assertEquals(2, namespacedEntity.getChildren().size()); + assertEquals(lioncore.getID(), namespacedEntity.getParentNodeID()); + + SerializedNode simpleName = unserializedSerializedNodeData.stream().filter(e -> e.getID().equals("LIonCore_M3_NamespacedEntity_simpleName")).findFirst().get(); + assertEquals(new MetaPointer("LIonCore_M3", "1", "LIonCore_M3_Property"), simpleName.getConcept()); + assertEquals("simpleName", simpleName.getPropertyValue("LIonCore_M3_NamespacedEntity_simpleName")); + assertEquals("LIonCore_M3_NamespacedEntity", simpleName.getParentNodeID()); + assertEquals(Arrays.asList(new SerializedReferenceValue.Entry("LIonCore_M3_String", "String")), simpleName.getReferenceValues("LIonCore_M3_Property_type")); + } + + @Test + public void unserializeLibraryMetamodelToSerializedNodes() { + InputStream inputStream = this.getClass().getResourceAsStream("/serialization/library-metamodel.json"); + JsonElement jsonElement = JsonParser.parseReader(new InputStreamReader(inputStream)); + LowLevelJsonSerialization jsonSerialization = new LowLevelJsonSerialization(); + SerializedChunk serializedChunk = jsonSerialization.unserializeSerializationBlock(jsonElement); + SerializedNode book = serializedChunk.getNodeByID("library-Book"); + assertEquals("Book", book.getPropertyValue("LIonCore_M3_NamespacedEntity_simpleName")); + + SerializedNode guidedBookWriter = serializedChunk.getNodeByID("library-GuideBookWriter"); + assertEquals("GuideBookWriter", guidedBookWriter.getPropertyValue("LIonCore_M3_NamespacedEntity_simpleName")); + assertEquals(Arrays.asList(new SerializedReferenceValue.Entry("library-Writer", "Writer")), guidedBookWriter.getReferenceValues("LIonCore_M3_Concept_extends")); + } + + @Test + public void reserializeLibraryMetamodel() { + assertTheFileIsReserializedFromLowLevelCorrectly("/serialization/library-metamodel.json"); + } + + @Test + public void reserializeBobsLibrary() { + assertTheFileIsReserializedFromLowLevelCorrectly("/serialization/bobslibrary.json"); + } + + @Test + public void reserializeLanguageEngineeringLibrary() { + assertTheFileIsReserializedFromLowLevelCorrectly("/serialization/langeng-library.json"); + } + + private void assertTheFileIsReserializedFromLowLevelCorrectly(String filePath) { + InputStream inputStream = this.getClass().getResourceAsStream(filePath); + JsonElement jsonElement = JsonParser.parseReader(new InputStreamReader(inputStream)); + LowLevelJsonSerialization jsonSerialization = new LowLevelJsonSerialization(); + SerializedChunk serializedChunk = jsonSerialization.unserializeSerializationBlock(jsonElement); + JsonElement reserialized = jsonSerialization.serializeToJson(serializedChunk); + assertEquivalentLionWebJson(jsonElement.getAsJsonObject(), reserialized.getAsJsonObject()); + } + +} diff --git a/core/src/test/java/org/lionweb/lioncore/java/serialization/SerializedJsonComparisonUtils.java b/core/src/test/java/org/lionweb/lioncore/java/serialization/SerializedJsonComparisonUtils.java index 4f6b80b4..e563dfce 100644 --- a/core/src/test/java/org/lionweb/lioncore/java/serialization/SerializedJsonComparisonUtils.java +++ b/core/src/test/java/org/lionweb/lioncore/java/serialization/SerializedJsonComparisonUtils.java @@ -19,7 +19,7 @@ private SerializedJsonComparisonUtils() { } static void assertEquivalentLionWebJson(JsonObject expected, JsonObject actual) { - Set keys = new HashSet<>(Arrays.asList("serializationFormatVersion", "nodes")); + Set keys = new HashSet<>(Arrays.asList("serializationFormatVersion", "nodes", "metamodels")); if (!expected.keySet().equals(keys)) { throw new RuntimeException("The expected object has irregular keys: " + expected.keySet()); } @@ -85,17 +85,26 @@ private static void assertEquivalentNodes(JsonObject expected, JsonObject actual } else if (key.equals("id")) { assertEquals("(" + context + ") different id", expected.get("id"), actual.get("id")); } else if (key.equals("references")) { - assertEquivalentObjects(expected.getAsJsonObject("references"), actual.getAsJsonObject("references"), "References of " + context); + assertEquivalentArrays(expected.getAsJsonArray("references"), actual.getAsJsonArray("references"), "References of " + context); } else if (key.equals("children")) { - assertEquivalentObjects(expected.getAsJsonObject("children"), actual.getAsJsonObject("children"), "Children of " + context); + assertEquivalentArrays(expected.getAsJsonArray("children"), actual.getAsJsonArray("children"), "Children of " + context); } else if (key.equals("properties")) { - assertEquivalentObjects(expected.getAsJsonObject("properties"), actual.getAsJsonObject("properties"), "Properties of " + context); + assertEquivalentArrays(expected.getAsJsonArray("properties"), actual.getAsJsonArray("properties"), "Properties of " + context); } else { throw new AssertionError("(" + context + ") unexpected top-level key found: " + key); } } } + private static void assertEquivalentArrays(JsonArray expected, JsonArray actual, String context) { + if (expected.size() != actual.size()) { + throw new AssertionError("(" + context + ") Arrays with different sizes: expected=" + expected.size()+ " and actual=" + actual.size()); + } + for (int i=0;i actualMeaningfulKeys = actual.keySet().stream().filter(k -> !actual.get(k).equals(new JsonObject()) diff --git a/core/src/test/resources/serialization/bobslibrary.json b/core/src/test/resources/serialization/bobslibrary.json index b85e2641..2c864fb0 100644 --- a/core/src/test/resources/serialization/bobslibrary.json +++ b/core/src/test/resources/serialization/bobslibrary.json @@ -1,46 +1,110 @@ { "serializationFormatVersion": "1", + "metamodels": [], "nodes": [ { - "concept": "Pk1NRJfHMt4eSja2kpXia7x8vj6Vzc6WQCUzT3aVeYY", "id": "bl", - "properties": { - "LdgCnVXNgZD7CLbBhBin2Rcdumx4qZUYz_jh2QnP5z8": "Bob's Library" + "concept": { + "metamodel": "library", + "version": "1", + "key": "library-Library" }, - "children": { - "TFS1ME6sEyRbkRchsr8zaZCcj_uF1LM0LXK24gbnxZM": [ - "eb" - ] - }, - "references": {} + "properties": [ + { + "property": { + "metamodel": "library", + "version": "1", + "key": "library-Library-name" + }, + "value": "Bob\u0027s Library" + } + ], + "children": [ + { + "containment": { + "metamodel": "library", + "version": "1", + "key": "library-Library-books" + }, + "children": [ + "eb" + ] + } + ], + "references": [], + "parent": null }, { - "concept": "OcDK2GESljInG-ApIqtkXUoA2UeviB97u0UuiZzM0Hs", - "id": "eb", - "properties": { - "Ei9m_HbdmEYg_EwMLLVZ71ERRBZyXH8GHVyOVia8Sqg": "Explorer Book", - "OJhF8vB_qRMrA8A9a-H0LsByONdYtHGmQ-lk9rUHUc4": null - }, - "children": {}, - "references": { - "9ATCb8nXEuQAL3NOY-EUZwuThpIQnQ2C_2n97IRGA_g": [ - { - "resolveInfo": "Jack London", - "reference": "jl" - } - ] + "id": "jl", + "concept": { + "metamodel": "library", + "version": "1", + "key": "library-GuideBookWriter" }, - "parent": "bl" + "properties": [ + { + "property": { + "metamodel": "library", + "version": "1", + "key": "library-GuideBookWriter-countries" + }, + "value": "Alaska" + }, + { + "property": { + "metamodel": "library", + "version": "1", + "key": "library-Writer-name" + }, + "value": "Jack London" + } + ], + "children": [], + "references": [], + "parent": null }, { - "concept": "nNUEzZ7it7d2HoHPAtk5rGO4SsqVA3hAlBwkK1KP8QU", - "id": "jl", - "properties": { - "PoZyl6WXh-Cz5h2RspK1NL6zX9DdLwGpUUC-ygQmHMA": "Alaska", - "onRRrZaasiOtDU2qFJgyW8OVz8p5-hqQu0Vlc_7Aq6s": "Jack London" + "id": "eb", + "concept": { + "metamodel": "library", + "version": "1", + "key": "library-Book" }, - "children": {}, - "references": {} + "properties": [ + { + "property": { + "metamodel": "library", + "version": "1", + "key": "library-Book-title" + }, + "value": "Explorer Book" + }, + { + "property": { + "metamodel": "library", + "version": "1", + "key": "library-Book-pages" + }, + "value": null + } + ], + "children": [], + "references": [ + { + "reference": { + "metamodel": "library", + "version": "1", + "key": "library-Book-author" + }, + "targets": [ + { + "resolveInfo": "Jack London", + "reference": "jl" + } + ] + } + ], + "parent": "bl" } ] } \ No newline at end of file diff --git a/core/src/test/resources/serialization/foo-library.json b/core/src/test/resources/serialization/foo-library.json index c0e0ce9c..f251c82f 100644 --- a/core/src/test/resources/serialization/foo-library.json +++ b/core/src/test/resources/serialization/foo-library.json @@ -1,22 +1,23 @@ { "serializationFormatVersion": "1", + "metamodels": [], "nodes": [ { - "concept": "OcDK2GESljInG-ApIqtkXUoA2UeviB97u0UuiZzM0Hs", + "concept": {"metamodel":"library","version":"1","key":"library-Book"}, "id": "foo123", - "properties": { - "Ei9m_HbdmEYg_EwMLLVZ71ERRBZyXH8GHVyOVia8Sqg": null, - "OJhF8vB_qRMrA8A9a-H0LsByONdYtHGmQ-lk9rUHUc4": null - }, - "children": {}, - "references": { - "9ATCb8nXEuQAL3NOY-EUZwuThpIQnQ2C_2n97IRGA_g": [ + "properties": [ + {"property": {"metamodel":"library","version":"1","key":"library-Book-title"}, "value": null}, + {"property": {"metamodel":"library","version":"1","key":"library-Book-pages"}, "value": null} + ], + "children": [], + "references": [ + {"reference": {"metamodel":"library","version":"1","key":"library-Book-author"}, "targets": [ { "reference": "_Arthur_Foozillus_id_", "resolveInfo": null } ] - } + }] } ] } \ No newline at end of file diff --git a/core/src/test/resources/serialization/langeng-library.json b/core/src/test/resources/serialization/langeng-library.json index 1feb7efd..ca250113 100644 --- a/core/src/test/resources/serialization/langeng-library.json +++ b/core/src/test/resources/serialization/langeng-library.json @@ -1,55 +1,127 @@ { "serializationFormatVersion": "1", + "metamodels": [], "nodes": [ { - "concept": "Pk1NRJfHMt4eSja2kpXia7x8vj6Vzc6WQCUzT3aVeYY", "id": "lib-1", - "properties": { - "LdgCnVXNgZD7CLbBhBin2Rcdumx4qZUYz_jh2QnP5z8": "Language Engineering Library" + "concept": { + "metamodel": "library", + "version": "1", + "key": "library-Library" }, - "children": { - "TFS1ME6sEyRbkRchsr8zaZCcj_uF1LM0LXK24gbnxZM": [ - "de", - "bfd" - ] - }, - "references": {} + "properties": [ + { + "property": { + "metamodel": "library", + "version": "1", + "key": "library-Library-name" + }, + "value": "Language Engineering Library" + } + ], + "children": [ + { + "containment": { + "metamodel": "library", + "version": "1", + "key": "library-Library-books" + }, + "children": [ + "de", + "bfd" + ] + } + ], + "references": [], + "parent": null }, { - "concept": "OcDK2GESljInG-ApIqtkXUoA2UeviB97u0UuiZzM0Hs", "id": "de", - "properties": { - "Ei9m_HbdmEYg_EwMLLVZ71ERRBZyXH8GHVyOVia8Sqg": "DSL Engineering", - "OJhF8vB_qRMrA8A9a-H0LsByONdYtHGmQ-lk9rUHUc4": "558" - }, - "children": {}, - "references": { - "9ATCb8nXEuQAL3NOY-EUZwuThpIQnQ2C_2n97IRGA_g": [ - { - "resolveInfo": "Markus Völter", - "reference": "mv" - } - ] + "concept": { + "metamodel": "library", + "version": "1", + "key": "library-Book" }, + "properties": [ + { + "property": { + "metamodel": "library", + "version": "1", + "key": "library-Book-title" + }, + "value": "DSL Engineering" + }, + { + "property": { + "metamodel": "library", + "version": "1", + "key": "library-Book-pages" + }, + "value": "558" + } + ], + "children": [], + "references": [ + { + "reference": { + "metamodel": "library", + "version": "1", + "key": "library-Book-author" + }, + "targets": [ + { + "resolveInfo": "Markus Völter", + "reference": "mv" + } + ] + } + ], "parent": "lib-1" }, { - "concept": "OcDK2GESljInG-ApIqtkXUoA2UeviB97u0UuiZzM0Hs", "id": "bfd", - "properties": { - "Ei9m_HbdmEYg_EwMLLVZ71ERRBZyXH8GHVyOVia8Sqg": "Business-Friendly DSLs", - "OJhF8vB_qRMrA8A9a-H0LsByONdYtHGmQ-lk9rUHUc4": "517" - }, - "children": {}, - "references": { - "9ATCb8nXEuQAL3NOY-EUZwuThpIQnQ2C_2n97IRGA_g": [ - { - "resolveInfo": "Meinte Boersma", - "reference": "mb" - } - ] + "concept": { + "metamodel": "library", + "version": "1", + "key": "library-Book" }, + "properties": [ + { + "property": { + "metamodel": "library", + "version": "1", + "key": "library-Book-title" + }, + "value": "Business-Friendly DSLs" + }, + { + "property": { + "metamodel": "library", + "version": "1", + "key": "library-Book-pages" + }, + "value": "517" + } + ], + "children": [], + "references": [ + { + "reference": { + "metamodel": "library", + "version": "1", + "key": "library-Book-author" + }, + "targets": [ + { + "resolveInfo": "Meinte Boersma", + "reference": "mb" + } + ] + } + ], "parent": "lib-1" } ] -} \ No newline at end of file +} + + diff --git a/core/src/test/resources/serialization/library-metamodel.json b/core/src/test/resources/serialization/library-metamodel.json index 2d37a164..21cb85cc 100644 --- a/core/src/test/resources/serialization/library-metamodel.json +++ b/core/src/test/resources/serialization/library-metamodel.json @@ -1,327 +1,997 @@ { "serializationFormatVersion": "1", + "metamodels": [], "nodes": [ { - "concept": "LIonCore_M3_Metamodel", - "id": "txjxNU9yRzEuyghtmgJK_l-nF93qWt7d1vErz5RbLow", - "properties": { - "LIonCore_M3_Metamodel_name": "library" - }, - "children": { - "LIonCore_M3_Metamodel_elements": [ - "INhBvWyXvxwNsePuX0rdNGB_J9hi85cTb1Q0APXCyJ0", - "uHmTCy63BV23cvXwFSumVwK1DOh4IZvIyAnRJjW9eQI", - "gVp8_QSmXE2k4pd-sQZgjYMoW95SLLaVIH4yMYqqbt4", - "OcDK2GESljInG-ApIqtkXUoA2UeviB97u0UuiZzM0Hs", - "Pk1NRJfHMt4eSja2kpXia7x8vj6Vzc6WQCUzT3aVeYY", - "DuBg-a_slgc_VOG0huySkSWi3rZQX1Q20EEd2f7lvLE", - "nNUEzZ7it7d2HoHPAtk5rGO4SsqVA3hAlBwkK1KP8QU", - "RDa_L8gbU8XgW9z46oMysBi1Hb7vjcS8O8LUgXlFpeU" - ] - }, - "references": { - }, + "id": "library", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Metamodel" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Metamodel_name" + }, + "value": "library" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Metamodel_version" + }, + "value": "1" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "library" + } + ], + "children": [ + { + "containment": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Metamodel_elements" + }, + "children": [ + "library-Book", + "library-Library", + "library-Writer", + "library-GuideBookWriter", + "library-SpecialistBookWriter" + ] + } + ], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Metamodel_dependsOn" + }, + "targets": [] + } + ], "parent": null }, { - "concept": "LIonCore_M3_PrimitiveType", - "id": "INhBvWyXvxwNsePuX0rdNGB_J9hi85cTb1Q0APXCyJ0", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "String" - }, - "children": { - }, - "references": { - }, - "parent": "txjxNU9yRzEuyghtmgJK_l-nF93qWt7d1vErz5RbLow" - }, - { - "concept": "LIonCore_M3_PrimitiveType", - "id": "uHmTCy63BV23cvXwFSumVwK1DOh4IZvIyAnRJjW9eQI", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "boolean" - }, - "references": { - }, - "children": { - }, - "parent": "txjxNU9yRzEuyghtmgJK_l-nF93qWt7d1vErz5RbLow" - }, - { - "concept": "LIonCore_M3_PrimitiveType", - "id": "gVp8_QSmXE2k4pd-sQZgjYMoW95SLLaVIH4yMYqqbt4", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "int" - }, - "children": { - }, - "references": { - }, - "parent": "txjxNU9yRzEuyghtmgJK_l-nF93qWt7d1vErz5RbLow" - }, - { - "concept": "LIonCore_M3_Concept", - "id": "OcDK2GESljInG-ApIqtkXUoA2UeviB97u0UuiZzM0Hs", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "Book", - "LIonCore_M3_Concept_abstract": "false" - }, - "children": { - "LIonCore_M3_FeaturesContainer_features": [ - "Ei9m_HbdmEYg_EwMLLVZ71ERRBZyXH8GHVyOVia8Sqg", - "OJhF8vB_qRMrA8A9a-H0LsByONdYtHGmQ-lk9rUHUc4", - "9ATCb8nXEuQAL3NOY-EUZwuThpIQnQ2C_2n97IRGA_g" - ] - }, - "references": { - "LIonCore_M3_Concept_extends": [], - "LIonCore_M3_Concept_implements": [] - }, - "parent": "txjxNU9yRzEuyghtmgJK_l-nF93qWt7d1vErz5RbLow" + "id": "library-Book", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_abstract" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "Book" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "library.Book" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "library-Book" + } + ], + "children": [ + { + "containment": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_FeaturesContainer_features" + }, + "children": [ + "library-Book-title", + "library-Book-pages", + "library-Book-author" + ] + } + ], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_extends" + }, + "targets": [] + }, + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_implements" + }, + "targets": [] + } + ], + "parent": "library" }, { - "concept": "LIonCore_M3_Property", - "id": "Ei9m_HbdmEYg_EwMLLVZ71ERRBZyXH8GHVyOVia8Sqg", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "title", - "LIonCore_M3_Feature_optional": "false", - "LIonCore_M3_Feature_derived": "false" - }, - "children": { - }, - "references": { - "LIonCore_M3_Property_type": [ - { - "resolveInfo": null, - "reference": "INhBvWyXvxwNsePuX0rdNGB_J9hi85cTb1Q0APXCyJ0" - } - ] - }, - "parent": "OcDK2GESljInG-ApIqtkXUoA2UeviB97u0UuiZzM0Hs" + "id": "library-Book-title", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Property" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_optional" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_derived" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "title" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "library.Book.title" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "library-Book-title" + } + ], + "children": [], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Property_type" + }, + "targets": [ + { + "resolveInfo": "String", + "reference": "LIonCore_M3_String" + } + ] + } + ], + "parent": "library-Book" }, { - "concept": "LIonCore_M3_Property", - "id": "OJhF8vB_qRMrA8A9a-H0LsByONdYtHGmQ-lk9rUHUc4", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "pages", - "LIonCore_M3_Feature_optional": "false", - "LIonCore_M3_Feature_derived": "false" - }, - "children": { - }, - "references": { - "LIonCore_M3_Property_type": [ - { - "resolveInfo": null, - "reference": "gVp8_QSmXE2k4pd-sQZgjYMoW95SLLaVIH4yMYqqbt4" - } - ] - }, - "parent": "OcDK2GESljInG-ApIqtkXUoA2UeviB97u0UuiZzM0Hs" + "id": "library-Book-pages", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Property" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_optional" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_derived" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "pages" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "library.Book.pages" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "library-Book-pages" + } + ], + "children": [], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Property_type" + }, + "targets": [ + { + "resolveInfo": "Integer", + "reference": "LIonCore_M3_Integer" + } + ] + } + ], + "parent": "library-Book" }, { - "concept": "LIonCore_M3_Reference", - "id": "9ATCb8nXEuQAL3NOY-EUZwuThpIQnQ2C_2n97IRGA_g", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "author", - "LIonCore_M3_Feature_optional": "false", - "LIonCore_M3_Feature_derived": "false", - "LIonCore_M3_Link_multiple": "true" - }, - "references": { - "LIonCore_M3_Link_type": [ - { - "resolveInfo": null, - "reference": "DuBg-a_slgc_VOG0huySkSWi3rZQX1Q20EEd2f7lvLE" - } - ] - }, - "children": {}, - "parent": "OcDK2GESljInG-ApIqtkXUoA2UeviB97u0UuiZzM0Hs" + "id": "library-Book-author", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Reference" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Link_multiple" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_optional" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_derived" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "author" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "library.Book.author" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "library-Book-author" + } + ], + "children": [], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Link_type" + }, + "targets": [ + { + "resolveInfo": "Writer", + "reference": "library-Writer" + } + ] + } + ], + "parent": "library-Book" }, { - "concept": "LIonCore_M3_Concept", - "id": "Pk1NRJfHMt4eSja2kpXia7x8vj6Vzc6WQCUzT3aVeYY", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "Library", - "LIonCore_M3_Concept_abstract": "false" - }, - "children": { - "LIonCore_M3_FeaturesContainer_features": [ - "LdgCnVXNgZD7CLbBhBin2Rcdumx4qZUYz_jh2QnP5z8", - "TFS1ME6sEyRbkRchsr8zaZCcj_uF1LM0LXK24gbnxZM" - ] - }, - "references": { - "LIonCore_M3_Concept_extends": [], - "LIonCore_M3_Concept_implements": [] - }, - "parent": "txjxNU9yRzEuyghtmgJK_l-nF93qWt7d1vErz5RbLow" + "id": "library-Library", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_abstract" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "Library" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "library.Library" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "library-Library" + } + ], + "children": [ + { + "containment": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_FeaturesContainer_features" + }, + "children": [ + "library-Library-name", + "library-Library-books" + ] + } + ], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_extends" + }, + "targets": [] + }, + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_implements" + }, + "targets": [] + } + ], + "parent": "library" }, { - "concept": "LIonCore_M3_Property", - "id": "LdgCnVXNgZD7CLbBhBin2Rcdumx4qZUYz_jh2QnP5z8", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "name", - "LIonCore_M3_Feature_optional": "false", - "LIonCore_M3_Feature_derived": "false" - }, - "children": { - }, - "references": { - "LIonCore_M3_Property_type": [ - { - "reference": "INhBvWyXvxwNsePuX0rdNGB_J9hi85cTb1Q0APXCyJ0", - "resolveInfo": null - } - ] - }, - "parent": "Pk1NRJfHMt4eSja2kpXia7x8vj6Vzc6WQCUzT3aVeYY" + "id": "library-Library-name", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Property" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_optional" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_derived" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "name" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "library.Library.name" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "library-Library-name" + } + ], + "children": [], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Property_type" + }, + "targets": [ + { + "resolveInfo": "String", + "reference": "LIonCore_M3_String" + } + ] + } + ], + "parent": "library-Library" }, { - "concept": "LIonCore_M3_Containment", - "id": "TFS1ME6sEyRbkRchsr8zaZCcj_uF1LM0LXK24gbnxZM", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "books", - "LIonCore_M3_Feature_optional": "false", - "LIonCore_M3_Feature_derived": "false", - "LIonCore_M3_Link_multiple": "true" - }, - "children": { - }, - "references": { - "LIonCore_M3_Link_type": [ - { - "reference": "OcDK2GESljInG-ApIqtkXUoA2UeviB97u0UuiZzM0Hs", - "resolveInfo": null - } - ] - }, - "parent": "Pk1NRJfHMt4eSja2kpXia7x8vj6Vzc6WQCUzT3aVeYY" + "id": "library-Library-books", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Containment" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Link_multiple" + }, + "value": "true" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_optional" + }, + "value": "true" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_derived" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "books" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "library.Library.books" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "library-Library-books" + } + ], + "children": [], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Link_type" + }, + "targets": [ + { + "resolveInfo": "Book", + "reference": "library-Book" + } + ] + } + ], + "parent": "library-Library" }, { - "concept": "LIonCore_M3_Concept", - "id": "DuBg-a_slgc_VOG0huySkSWi3rZQX1Q20EEd2f7lvLE", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "Writer", - "LIonCore_M3_Concept_abstract": "false" - }, - "children": { - "LIonCore_M3_FeaturesContainer_features": [ - "onRRrZaasiOtDU2qFJgyW8OVz8p5-hqQu0Vlc_7Aq6s" - ] - }, - "references": { - "LIonCore_M3_Concept_extends": [], - "LIonCore_M3_Concept_implements": [] - }, - "parent": "txjxNU9yRzEuyghtmgJK_l-nF93qWt7d1vErz5RbLow" + "id": "library-Writer", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_abstract" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "Writer" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "library.Writer" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "library-Writer" + } + ], + "children": [ + { + "containment": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_FeaturesContainer_features" + }, + "children": [ + "library-Writer-name" + ] + } + ], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_extends" + }, + "targets": [] + }, + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_implements" + }, + "targets": [] + } + ], + "parent": "library" }, { - "concept": "LIonCore_M3_Property", - "id": "onRRrZaasiOtDU2qFJgyW8OVz8p5-hqQu0Vlc_7Aq6s", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "name", - "LIonCore_M3_Feature_optional": "false", - "LIonCore_M3_Feature_derived": "false" - }, - "children": { - }, - "references": { - "LIonCore_M3_Property_type": [ - { - "reference": "INhBvWyXvxwNsePuX0rdNGB_J9hi85cTb1Q0APXCyJ0", - "resolveInfo": null - } - ] - }, - "parent": "DuBg-a_slgc_VOG0huySkSWi3rZQX1Q20EEd2f7lvLE" + "id": "library-Writer-name", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Property" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_optional" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_derived" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "name" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "library.Writer.name" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "library-Writer-name" + } + ], + "children": [], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Property_type" + }, + "targets": [ + { + "resolveInfo": "String", + "reference": "LIonCore_M3_String" + } + ] + } + ], + "parent": "library-Writer" }, { - "concept": "LIonCore_M3_Concept", - "id": "nNUEzZ7it7d2HoHPAtk5rGO4SsqVA3hAlBwkK1KP8QU", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "GuideBookWriter", - "LIonCore_M3_Concept_abstract": "false" - }, - "children": { - "LIonCore_M3_FeaturesContainer_features": [ - "PoZyl6WXh-Cz5h2RspK1NL6zX9DdLwGpUUC-ygQmHMA" - ] - }, - "references": { - "LIonCore_M3_Concept_extends": [ - { - "reference": "DuBg-a_slgc_VOG0huySkSWi3rZQX1Q20EEd2f7lvLE", - "resolveInfo": null - } - ], - "LIonCore_M3_Concept_implements": [] - }, - "parent": "txjxNU9yRzEuyghtmgJK_l-nF93qWt7d1vErz5RbLow" + "id": "library-GuideBookWriter", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_abstract" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "GuideBookWriter" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "library.GuideBookWriter" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "library-GuideBookWriter" + } + ], + "children": [ + { + "containment": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_FeaturesContainer_features" + }, + "children": [ + "library-GuideBookWriter-countries" + ] + } + ], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_extends" + }, + "targets": [ + { + "resolveInfo": "Writer", + "reference": "library-Writer" + } + ] + }, + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_implements" + }, + "targets": [] + } + ], + "parent": "library" }, { - "concept": "LIonCore_M3_Property", - "id": "PoZyl6WXh-Cz5h2RspK1NL6zX9DdLwGpUUC-ygQmHMA", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "countries", - "LIonCore_M3_Feature_optional": "false", - "LIonCore_M3_Feature_derived": "false" - }, - "children": { - }, - "references": { - "LIonCore_M3_Property_type": [ - { - "reference": "INhBvWyXvxwNsePuX0rdNGB_J9hi85cTb1Q0APXCyJ0", - "resolveInfo": null - } - ] - }, - "parent": "nNUEzZ7it7d2HoHPAtk5rGO4SsqVA3hAlBwkK1KP8QU" + "id": "library-GuideBookWriter-countries", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Property" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_optional" + }, + "value": "true" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_derived" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "countries" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "library.GuideBookWriter.countries" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "library-GuideBookWriter-countries" + } + ], + "children": [], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Property_type" + }, + "targets": [ + { + "resolveInfo": "String", + "reference": "LIonCore_M3_String" + } + ] + } + ], + "parent": "library-GuideBookWriter" }, { - "concept": "LIonCore_M3_Concept", - "id": "RDa_L8gbU8XgW9z46oMysBi1Hb7vjcS8O8LUgXlFpeU", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "SpecialistBookWriter", - "LIonCore_M3_Concept_abstract": "false" - }, - "children": { - "LIonCore_M3_FeaturesContainer_features": [ - "DbVixG73dI8xIF9TAoq2GOZru4CRQfRD8gG7TkFCZuU" - ] - }, - "references": { - "LIonCore_M3_Concept_extends": [ - { - "reference": "DuBg-a_slgc_VOG0huySkSWi3rZQX1Q20EEd2f7lvLE", - "resolveInfo": null - } - ], - "LIonCore_M3_Concept_implements": [] - }, - "parent": "txjxNU9yRzEuyghtmgJK_l-nF93qWt7d1vErz5RbLow" + "id": "library-SpecialistBookWriter", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_abstract" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "SpecialistBookWriter" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "library.SpecialistBookWriter" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "library-SpecialistBookWriter" + } + ], + "children": [ + { + "containment": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_FeaturesContainer_features" + }, + "children": [ + "library-SpecialistBookWriter-subject" + ] + } + ], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_extends" + }, + "targets": [ + { + "resolveInfo": "Writer", + "reference": "library-Writer" + } + ] + }, + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_implements" + }, + "targets": [] + } + ], + "parent": "library" }, { - "concept": "LIonCore_M3_Property", - "id": "DbVixG73dI8xIF9TAoq2GOZru4CRQfRD8gG7TkFCZuU", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "subject", - "LIonCore_M3_Feature_optional": "false", - "LIonCore_M3_Feature_derived": "false" - }, - "children": { - }, - "references": { - "LIonCore_M3_Property_type": [ - { - "reference": "INhBvWyXvxwNsePuX0rdNGB_J9hi85cTb1Q0APXCyJ0", - "resolveInfo": null - } - ] - }, - "parent": "RDa_L8gbU8XgW9z46oMysBi1Hb7vjcS8O8LUgXlFpeU" + "id": "library-SpecialistBookWriter-subject", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Property" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_optional" + }, + "value": "true" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_derived" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "subject" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "library.SpecialistBookWriter.subject" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "library-SpecialistBookWriter-subject" + } + ], + "children": [], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Property_type" + }, + "targets": [ + { + "resolveInfo": "String", + "reference": "LIonCore_M3_String" + } + ] + } + ], + "parent": "library-SpecialistBookWriter" } ] -} \ No newline at end of file +} diff --git a/core/src/test/resources/serialization/lioncore.json b/core/src/test/resources/serialization/lioncore.json index ff72fa56..9aac806e 100644 --- a/core/src/test/resources/serialization/lioncore.json +++ b/core/src/test/resources/serialization/lioncore.json @@ -1,761 +1,2654 @@ { "serializationFormatVersion": "1", + "metamodels": [], "nodes": [ { - "concept": "LIonCore_M3_Metamodel", "id": "LIonCore_M3", - "properties": { - "LIonCore_M3_Metamodel_name": "LIonCore.M3" - }, - "children": { - "LIonCore_M3_Metamodel_elements": [ - "LIonCore_M3_NamespacedEntity", - "LIonCore_M3_NamespaceProvider", - "LIonCore_M3_Metamodel", - "LIonCore_M3_MetamodelElement", - "LIonCore_M3_FeaturesContainer", - "LIonCore_M3_Concept", - "LIonCore_M3_ConceptInterface", - "LIonCore_M3_Feature", - "LIonCore_M3_Link", - "LIonCore_M3_Reference", - "LIonCore_M3_Property", - "LIonCore_M3_DataType", - "LIonCore_M3_PrimitiveType", - "LIonCore_M3_Containment", - "LIonCore_M3_Enumeration", - "LIonCore_M3_EnumerationLiteral" - ] - }, - "references": {} - }, - { - "concept": "LIonCore_M3_Concept", - "id": "LIonCore_M3_NamespacedEntity", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "NamespacedEntity", - "LIonCore_M3_Concept_abstract": true - }, - "children": { - "LIonCore_M3_FeaturesContainer_features": [ - "LIonCore_M3_NamespacedEntity_simpleName", - "LIonCore_M3_NamespacedEntity_qualifiedName" - ] - }, - "references": { - "LIonCore_M3_Concept_extends": [], - "LIonCore_M3_Concept_implements": [] - }, - "parent": "LIonCore_M3" - }, - { - "concept": "LIonCore_M3_Property", - "id": "LIonCore_M3_NamespacedEntity_simpleName", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "simpleName", - "LIonCore_M3_Feature_optional": false, - "LIonCore_M3_Feature_derived": false - }, - "references": { - "LIonCore_M3_Property_type": [ - { - "resolveInfo": null, - "reference": "LIonCore_M3_String" - } - ] - }, - "parent": "LIonCore_M3_NamespacedEntity" + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Metamodel" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Metamodel_name" + }, + "value": "LIonCore.M3" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Metamodel_version" + }, + "value": "1" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "LIonCore_M3" + } + ], + "children": [ + { + "containment": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Metamodel_elements" + }, + "children": [ + "LIonCore_M3_Concept", + "LIonCore_M3_ConceptInterface", + "LIonCore_M3_Containment", + "LIonCore_M3_DataType", + "LIonCore_M3_Enumeration", + "LIonCore_M3_EnumerationLiteral", + "LIonCore_M3_Feature", + "LIonCore_M3_FeaturesContainer", + "LIonCore_M3_HasKey", + "LIonCore_M3_Link", + "LIonCore_M3_Metamodel", + "LIonCore_M3_MetamodelElement", + "LIonCore_M3_NamespacedEntity", + "LIonCore_M3_NamespaceProvider", + "LIonCore_M3_PrimitiveType", + "LIonCore_M3_Property", + "LIonCore_M3_Reference" + ] + } + ], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Metamodel_dependsOn" + }, + "targets": [] + } + ], + "parent": null }, { - "concept": "LIonCore_M3_Property", - "id": "LIonCore_M3_NamespacedEntity_qualifiedName", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "qualifiedName", - "LIonCore_M3_Feature_optional": false, - "LIonCore_M3_Feature_derived": true - }, - "references": { - "LIonCore_M3_Property_type": [ - { - "resolveInfo": null, - "reference": "LIonCore_M3_String" - } - ] - }, - "parent": "LIonCore_M3_NamespacedEntity" - }, - { - "concept": "LIonCore_M3_ConceptInterface", - "id": "LIonCore_M3_NamespaceProvider", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "NamespaceProvider" - }, - "children": { - "LIonCore_M3_FeaturesContainer_features": [ - "LIonCore_M3_NamespaceProvider_namespaceQualifier" - ] - }, - "references": { - "LIonCore_M3_ConceptInterface_extends": [] - }, + "id": "LIonCore_M3_Concept", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_abstract" + }, + "value": null + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "Concept" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "LIonCore.M3.Concept" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "LIonCore_M3_Concept" + } + ], + "children": [ + { + "containment": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_FeaturesContainer_features" + }, + "children": [ + "LIonCore_M3_Concept_abstract", + "LIonCore_M3_Concept_extends", + "LIonCore_M3_Concept_implements" + ] + } + ], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_extends" + }, + "targets": [ + { + "resolveInfo": "FeaturesContainer", + "reference": "LIonCore_M3_FeaturesContainer" + } + ] + }, + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_implements" + }, + "targets": [] + } + ], "parent": "LIonCore_M3" }, { - "concept": "LIonCore_M3_Property", - "id": "LIonCore_M3_NamespaceProvider_namespaceQualifier", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "namespaceQualifier", - "LIonCore_M3_Feature_optional": false, - "LIonCore_M3_Feature_derived": true - }, - "references": { - "LIonCore_M3_Property_type": [ - { - "resolveInfo": null, - "reference": "LIonCore_M3_String" - } - ] - }, - "parent": "LIonCore_M3_NamespaceProvider" + "id": "LIonCore_M3_Concept_abstract", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Property" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_optional" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_derived" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "abstract" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "LIonCore.M3.Concept.abstract" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "LIonCore_M3_Concept_abstract" + } + ], + "children": [], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Property_type" + }, + "targets": [ + { + "resolveInfo": "Boolean", + "reference": "LIonCore_M3_Boolean" + } + ] + } + ], + "parent": "LIonCore_M3_Concept" }, { - "concept": "LIonCore_M3_Concept", - "id": "LIonCore_M3_Metamodel", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "Metamodel", - "LIonCore_M3_Concept_abstract": false - }, - "children": { - "LIonCore_M3_FeaturesContainer_features": [ - "LIonCore_M3_Metamodel_name", - "LIonCore_M3_Metamodel_elements", - "LIonCore_M3_Metamodel_dependsOn" - ] - }, - "references": { - "LIonCore_M3_Concept_extends": [], - "LIonCore_M3_Concept_implements": [ - { - "resolveInfo": null, - "reference": "LIonCore_M3_NamespaceProvider" - } - ] - }, - "parent": "LIonCore_M3" + "id": "LIonCore_M3_Concept_extends", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Reference" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Link_multiple" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_optional" + }, + "value": "true" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_derived" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "extends" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "LIonCore.M3.Concept.extends" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "LIonCore_M3_Concept_extends" + } + ], + "children": [], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Link_type" + }, + "targets": [ + { + "resolveInfo": "Concept", + "reference": "LIonCore_M3_Concept" + } + ] + } + ], + "parent": "LIonCore_M3_Concept" }, { - "concept": "LIonCore_M3_Property", - "id": "LIonCore_M3_Metamodel_name", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "qualifiedName", - "LIonCore_M3_Feature_optional": false, - "LIonCore_M3_Feature_derived": false - }, - "references": { - "LIonCore_M3_Property_type": [ - { - "resolveInfo": null, - "reference": "LIonCore_M3_String" - } - ] - }, - "parent": "LIonCore_M3_Metamodel" + "id": "LIonCore_M3_Concept_implements", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Reference" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Link_multiple" + }, + "value": "true" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_optional" + }, + "value": "true" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_derived" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "implements" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "LIonCore.M3.Concept.implements" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "LIonCore_M3_Concept_implements" + } + ], + "children": [], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Link_type" + }, + "targets": [ + { + "resolveInfo": "ConceptInterface", + "reference": "LIonCore_M3_ConceptInterface" + } + ] + } + ], + "parent": "LIonCore_M3_Concept" }, { - "concept": "LIonCore_M3_Containment", - "id": "LIonCore_M3_Metamodel_elements", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "elements", - "LIonCore_M3_Feature_optional": true, - "LIonCore_M3_Feature_derived": false, - "LIonCore_M3_Link_multiple": true - }, - "references": { - "LIonCore_M3_Link_type": [ - { - "resolveInfo": null, - "reference": "LIonCore_M3_MetamodelElement" - } - ] - }, - "parent": "LIonCore_M3_Metamodel" + "id": "LIonCore_M3_ConceptInterface", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_abstract" + }, + "value": null + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "ConceptInterface" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "LIonCore.M3.ConceptInterface" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "LIonCore_M3_ConceptInterface" + } + ], + "children": [ + { + "containment": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_FeaturesContainer_features" + }, + "children": [ + "LIonCore_M3_ConceptInterface_extends" + ] + } + ], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_extends" + }, + "targets": [ + { + "resolveInfo": "FeaturesContainer", + "reference": "LIonCore_M3_FeaturesContainer" + } + ] + }, + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_implements" + }, + "targets": [] + } + ], + "parent": "LIonCore_M3" }, { - "concept": "LIonCore_M3_Reference", - "id": "LIonCore_M3_Metamodel_dependsOn", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "dependsOn", - "LIonCore_M3_Feature_optional": true, - "LIonCore_M3_Feature_derived": false, - "LIonCore_M3_Link_multiple": true - }, - "references": { - "LIonCore_M3_Link_type": [ - { - "resolveInfo": null, - "reference": "LIonCore_M3_Metamodel" - } - ] - }, - "parent": "LIonCore_M3_Metamodel" + "id": "LIonCore_M3_ConceptInterface_extends", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Reference" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Link_multiple" + }, + "value": "true" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_optional" + }, + "value": "true" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_derived" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "extends" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "LIonCore.M3.ConceptInterface.extends" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "LIonCore_M3_ConceptInterface_extends" + } + ], + "children": [], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Link_type" + }, + "targets": [ + { + "resolveInfo": "ConceptInterface", + "reference": "LIonCore_M3_ConceptInterface" + } + ] + } + ], + "parent": "LIonCore_M3_ConceptInterface" }, { - "concept": "LIonCore_M3_Concept", - "id": "LIonCore_M3_MetamodelElement", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "MetamodelElement", - "LIonCore_M3_Concept_abstract": true - }, - "children": { - "LIonCore_M3_FeaturesContainer_features": [] - }, - "references": { - "LIonCore_M3_Concept_extends": [ - { - "resolveInfo": null, - "reference": "LIonCore_M3_NamespacedEntity" - } - ], - "LIonCore_M3_Concept_implements": [] - }, + "id": "LIonCore_M3_Containment", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_abstract" + }, + "value": null + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "Containment" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "LIonCore.M3.Containment" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "LIonCore_M3_Containment" + } + ], + "children": [ + { + "containment": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_FeaturesContainer_features" + }, + "children": [] + } + ], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_extends" + }, + "targets": [ + { + "resolveInfo": "Link", + "reference": "LIonCore_M3_Link" + } + ] + }, + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_implements" + }, + "targets": [] + } + ], "parent": "LIonCore_M3" }, { - "concept": "LIonCore_M3_Concept", - "id": "LIonCore_M3_FeaturesContainer", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "FeaturesContainer", - "LIonCore_M3_Concept_abstract": true - }, - "children": { - "LIonCore_M3_FeaturesContainer_features": [ - "LIonCore_M3_FeaturesContainer_features", - "LIonCore_M3_FeaturesContainer_allFeatures" - ] - }, - "references": { - "LIonCore_M3_Concept_extends": [ - { - "resolveInfo": null, - "reference": "LIonCore_M3_MetamodelElement" - } - ], - "LIonCore_M3_Concept_implements": [ - { - "resolveInfo": null, - "reference": "LIonCore_M3_NamespaceProvider" - } - ] - }, + "id": "LIonCore_M3_DataType", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_abstract" + }, + "value": "true" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "DataType" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "LIonCore.M3.DataType" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "LIonCore_M3_DataType" + } + ], + "children": [ + { + "containment": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_FeaturesContainer_features" + }, + "children": [] + } + ], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_extends" + }, + "targets": [ + { + "resolveInfo": "MetamodelElement", + "reference": "LIonCore_M3_MetamodelElement" + } + ] + }, + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_implements" + }, + "targets": [] + } + ], "parent": "LIonCore_M3" }, { - "concept": "LIonCore_M3_Containment", - "id": "LIonCore_M3_FeaturesContainer_features", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "features", - "LIonCore_M3_Feature_optional": true, - "LIonCore_M3_Feature_derived": false, - "LIonCore_M3_Link_multiple": true - }, - "references": { - "LIonCore_M3_Link_type": [ - { - "resolveInfo": null, - "reference": "LIonCore_M3_Feature" - } - ] - }, - "parent": "LIonCore_M3_FeaturesContainer" + "id": "LIonCore_M3_Enumeration", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_abstract" + }, + "value": null + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "Enumeration" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "LIonCore.M3.Enumeration" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "LIonCore_M3_Enumeration" + } + ], + "children": [ + { + "containment": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_FeaturesContainer_features" + }, + "children": [ + "LIonCore_M3_Enumeration_literals" + ] + } + ], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_extends" + }, + "targets": [ + { + "resolveInfo": "DataType", + "reference": "LIonCore_M3_DataType" + } + ] + }, + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_implements" + }, + "targets": [ + { + "resolveInfo": "NamespaceProvider", + "reference": "LIonCore_M3_NamespaceProvider" + } + ] + } + ], + "parent": "LIonCore_M3" }, { - "concept": "LIonCore_M3_Reference", - "id": "LIonCore_M3_FeaturesContainer_allFeatures", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "allFeatures", - "LIonCore_M3_Feature_optional": true, - "LIonCore_M3_Feature_derived": true, - "LIonCore_M3_Link_multiple": true - }, - "references": { - "LIonCore_M3_Link_type": [ - { - "resolveInfo": null, - "reference": "LIonCore_M3_Feature" - } - ] - }, - "parent": "LIonCore_M3_FeaturesContainer" + "id": "LIonCore_M3_Enumeration_literals", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Containment" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Link_multiple" + }, + "value": "true" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_optional" + }, + "value": "true" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_derived" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "literals" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "LIonCore.M3.Enumeration.literals" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "LIonCore_M3_Enumeration_literals" + } + ], + "children": [], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Link_type" + }, + "targets": [ + { + "resolveInfo": "EnumerationLiteral", + "reference": "LIonCore_M3_EnumerationLiteral" + } + ] + } + ], + "parent": "LIonCore_M3_Enumeration" }, { - "concept": "LIonCore_M3_Concept", - "id": "LIonCore_M3_Concept", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "Concept", - "LIonCore_M3_Concept_abstract": false - }, - "children": { - "LIonCore_M3_FeaturesContainer_features": [ - "LIonCore_M3_Concept_abstract", - "LIonCore_M3_Concept_extends", - "LIonCore_M3_Concept_implements" - ] - }, - "references": { - "LIonCore_M3_Concept_extends": [ - { - "resolveInfo": null, - "reference": "LIonCore_M3_FeaturesContainer" - } - ], - "LIonCore_M3_Concept_implements": [] - }, + "id": "LIonCore_M3_EnumerationLiteral", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_abstract" + }, + "value": null + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "EnumerationLiteral" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "LIonCore.M3.EnumerationLiteral" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "LIonCore_M3_EnumerationLiteral" + } + ], + "children": [ + { + "containment": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_FeaturesContainer_features" + }, + "children": [] + } + ], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_extends" + }, + "targets": [ + { + "resolveInfo": "NamespacedEntity", + "reference": "LIonCore_M3_NamespacedEntity" + } + ] + }, + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_implements" + }, + "targets": [] + } + ], "parent": "LIonCore_M3" }, { - "concept": "LIonCore_M3_Property", - "id": "LIonCore_M3_Concept_abstract", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "abstract", - "LIonCore_M3_Feature_optional": false, - "LIonCore_M3_Feature_derived": false - }, - "references": { - "LIonCore_M3_Property_type": [ - { - "resolveInfo": null, - "reference": "LIonCore_M3_boolean" - } - ] - }, - "parent": "LIonCore_M3_Concept" + "id": "LIonCore_M3_Feature", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_abstract" + }, + "value": null + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "Feature" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "LIonCore.M3.Feature" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "LIonCore_M3_Feature" + } + ], + "children": [ + { + "containment": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_FeaturesContainer_features" + }, + "children": [ + "LIonCore_M3_Feature_optional", + "LIonCore_M3_Feature_derived" + ] + } + ], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_extends" + }, + "targets": [ + { + "resolveInfo": "NamespacedEntity", + "reference": "LIonCore_M3_NamespacedEntity" + } + ] + }, + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_implements" + }, + "targets": [ + { + "resolveInfo": "HasKey", + "reference": "LIonCore_M3_HasKey" + } + ] + } + ], + "parent": "LIonCore_M3" }, { - "concept": "LIonCore_M3_Reference", - "id": "LIonCore_M3_Concept_extends", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "extends", - "LIonCore_M3_Feature_optional": true, - "LIonCore_M3_Feature_derived": false, - "LIonCore_M3_Link_multiple": false - }, - "references": { - "LIonCore_M3_Link_type": [ - { - "resolveInfo": null, - "reference": "LIonCore_M3_Concept" - } - ] - }, - "parent": "LIonCore_M3_Concept" + "id": "LIonCore_M3_Feature_optional", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Property" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_optional" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_derived" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "optional" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "LIonCore.M3.Feature.optional" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "LIonCore_M3_Feature_optional" + } + ], + "children": [], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Property_type" + }, + "targets": [ + { + "resolveInfo": "Boolean", + "reference": "LIonCore_M3_Boolean" + } + ] + } + ], + "parent": "LIonCore_M3_Feature" }, { - "concept": "LIonCore_M3_Reference", - "id": "LIonCore_M3_Concept_implements", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "implements", - "LIonCore_M3_Feature_optional": true, - "LIonCore_M3_Feature_derived": false, - "LIonCore_M3_Link_multiple": true - }, - "references": { - "LIonCore_M3_Link_type": [ - { - "resolveInfo": null, - "reference": "LIonCore_M3_ConceptInterface" - } - ] - }, - "parent": "LIonCore_M3_Concept" + "id": "LIonCore_M3_Feature_derived", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Property" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_optional" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_derived" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "derived" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "LIonCore.M3.Feature.derived" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "LIonCore_M3_Feature_derived" + } + ], + "children": [], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Property_type" + }, + "targets": [ + { + "resolveInfo": "Boolean", + "reference": "LIonCore_M3_Boolean" + } + ] + } + ], + "parent": "LIonCore_M3_Feature" }, { - "concept": "LIonCore_M3_Concept", - "id": "LIonCore_M3_ConceptInterface", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "ConceptInterface", - "LIonCore_M3_Concept_abstract": false - }, - "children": { - "LIonCore_M3_FeaturesContainer_features": [ - "LIonCore_M3_ConceptInterface_extends" - ] - }, - "references": { - "LIonCore_M3_Concept_extends": [ - { - "resolveInfo": null, - "reference": "LIonCore_M3_FeaturesContainer" - } - ], - "LIonCore_M3_Concept_implements": [] - }, + "id": "LIonCore_M3_FeaturesContainer", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_abstract" + }, + "value": null + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "FeaturesContainer" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "LIonCore.M3.FeaturesContainer" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "LIonCore_M3_FeaturesContainer" + } + ], + "children": [ + { + "containment": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_FeaturesContainer_features" + }, + "children": [ + "LIonCore_M3_FeaturesContainer_features" + ] + } + ], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_extends" + }, + "targets": [ + { + "resolveInfo": "MetamodelElement", + "reference": "LIonCore_M3_MetamodelElement" + } + ] + }, + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_implements" + }, + "targets": [ + { + "resolveInfo": "NamespaceProvider", + "reference": "LIonCore_M3_NamespaceProvider" + } + ] + } + ], "parent": "LIonCore_M3" }, { - "concept": "LIonCore_M3_Reference", - "id": "LIonCore_M3_ConceptInterface_extends", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "extends", - "LIonCore_M3_Feature_optional": true, - "LIonCore_M3_Feature_derived": false, - "LIonCore_M3_Link_multiple": true - }, - "references": { - "LIonCore_M3_Link_type": [ - { - "resolveInfo": null, - "reference": "LIonCore_M3_ConceptInterface" - } - ] - }, - "parent": "LIonCore_M3_ConceptInterface" + "id": "LIonCore_M3_FeaturesContainer_features", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Containment" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Link_multiple" + }, + "value": "true" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_optional" + }, + "value": "true" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_derived" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "features" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "LIonCore.M3.FeaturesContainer.features" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "LIonCore_M3_FeaturesContainer_features" + } + ], + "children": [], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Link_type" + }, + "targets": [ + { + "resolveInfo": "Feature", + "reference": "LIonCore_M3_Feature" + } + ] + } + ], + "parent": "LIonCore_M3_FeaturesContainer" }, { - "concept": "LIonCore_M3_Concept", - "id": "LIonCore_M3_Feature", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "Feature", - "LIonCore_M3_Concept_abstract": true - }, - "children": { - "LIonCore_M3_FeaturesContainer_features": [ - "LIonCore_M3_Feature_optional", - "LIonCore_M3_Feature_derived" - ] - }, - "references": { - "LIonCore_M3_Concept_extends": [ - { - "resolveInfo": null, - "reference": "LIonCore_M3_NamespacedEntity" - } - ], - "LIonCore_M3_Concept_implements": [] - }, + "id": "LIonCore_M3_HasKey", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_ConceptInterface" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "HasKey" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "LIonCore.M3.HasKey" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "LIonCore_M3_HasKey" + } + ], + "children": [ + { + "containment": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_FeaturesContainer_features" + }, + "children": [ + "LIonCore_M3_HasKey_key" + ] + } + ], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_ConceptInterface_extends" + }, + "targets": [] + } + ], "parent": "LIonCore_M3" }, { - "concept": "LIonCore_M3_Property", - "id": "LIonCore_M3_Feature_optional", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "optional", - "LIonCore_M3_Feature_optional": false, - "LIonCore_M3_Feature_derived": false - }, - "references": { - "LIonCore_M3_Property_type": [ - { - "resolveInfo": null, - "reference": "LIonCore_M3_boolean" - } - ] - }, - "parent": "LIonCore_M3_Feature" + "id": "LIonCore_M3_HasKey_key", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Property" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_optional" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_derived" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "key" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "LIonCore.M3.HasKey.key" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "LIonCore_M3_HasKey_key" + } + ], + "children": [], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Property_type" + }, + "targets": [ + { + "resolveInfo": "String", + "reference": "LIonCore_M3_String" + } + ] + } + ], + "parent": "LIonCore_M3_HasKey" }, { - "concept": "LIonCore_M3_Property", - "id": "LIonCore_M3_Feature_derived", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "derived", - "LIonCore_M3_Feature_optional": false, - "LIonCore_M3_Feature_derived": false - }, - "references": { - "LIonCore_M3_Property_type": [ - { - "resolveInfo": null, - "reference": "LIonCore_M3_boolean" - } - ] - }, - "parent": "LIonCore_M3_Feature" - }, - { - "concept": "LIonCore_M3_Concept", "id": "LIonCore_M3_Link", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "Link", - "LIonCore_M3_Concept_abstract": true - }, - "children": { - "LIonCore_M3_FeaturesContainer_features": [ - "LIonCore_M3_Link_multiple", - "LIonCore_M3_Link_type" - ] - }, - "references": { - "LIonCore_M3_Concept_extends": [ - { - "resolveInfo": null, - "reference": "LIonCore_M3_Feature" - } - ], - "LIonCore_M3_Concept_implements": [] - }, + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_abstract" + }, + "value": null + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "Link" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "LIonCore.M3.Link" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "LIonCore_M3_Link" + } + ], + "children": [ + { + "containment": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_FeaturesContainer_features" + }, + "children": [ + "LIonCore_M3_Link_multiple", + "LIonCore_M3_Link_type" + ] + } + ], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_extends" + }, + "targets": [ + { + "resolveInfo": "Feature", + "reference": "LIonCore_M3_Feature" + } + ] + }, + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_implements" + }, + "targets": [] + } + ], "parent": "LIonCore_M3" }, { - "concept": "LIonCore_M3_Property", "id": "LIonCore_M3_Link_multiple", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "multiple", - "LIonCore_M3_Feature_optional": false, - "LIonCore_M3_Feature_derived": false - }, - "references": { - "LIonCore_M3_Property_type": [ - { - "resolveInfo": null, - "reference": "LIonCore_M3_boolean" - } - ] - }, + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Property" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_optional" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_derived" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "multiple" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "LIonCore.M3.Link.multiple" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "LIonCore_M3_Link_multiple" + } + ], + "children": [], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Property_type" + }, + "targets": [ + { + "resolveInfo": "Boolean", + "reference": "LIonCore_M3_Boolean" + } + ] + } + ], "parent": "LIonCore_M3_Link" }, { - "concept": "LIonCore_M3_Reference", "id": "LIonCore_M3_Link_type", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "concept", - "LIonCore_M3_Feature_optional": false, - "LIonCore_M3_Feature_derived": false, - "LIonCore_M3_Link_multiple": false - }, - "references": { - "LIonCore_M3_Link_type": [ - { - "resolveInfo": null, - "reference": "LIonCore_M3_FeaturesContainer" - } - ] - }, + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Reference" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Link_multiple" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_optional" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_derived" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "type" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "LIonCore.M3.Link.type" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "LIonCore_M3_Link_type" + } + ], + "children": [], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Link_type" + }, + "targets": [ + { + "resolveInfo": "FeaturesContainer", + "reference": "LIonCore_M3_FeaturesContainer" + } + ] + } + ], "parent": "LIonCore_M3_Link" }, { - "concept": "LIonCore_M3_Concept", - "id": "LIonCore_M3_Reference", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "Reference", - "LIonCore_M3_Concept_abstract": false - }, - "children": { - "LIonCore_M3_FeaturesContainer_features": [] - }, - "references": { - "LIonCore_M3_Concept_extends": [ - { - "resolveInfo": null, - "reference": "LIonCore_M3_Link" - } - ], - "LIonCore_M3_Concept_implements": [] - }, + "id": "LIonCore_M3_Metamodel", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_abstract" + }, + "value": "true" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "Metamodel" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "LIonCore.M3.Metamodel" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "LIonCore_M3_Metamodel" + } + ], + "children": [ + { + "containment": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_FeaturesContainer_features" + }, + "children": [ + "LIonCore_M3_Metamodel_name", + "LIonCore_M3_Metamodel_version", + "LIonCore_M3_Metamodel_dependsOn", + "LIonCore_M3_Metamodel_elements" + ] + } + ], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_extends" + }, + "targets": [] + }, + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_implements" + }, + "targets": [ + { + "resolveInfo": "NamespaceProvider", + "reference": "LIonCore_M3_NamespaceProvider" + }, + { + "resolveInfo": "HasKey", + "reference": "LIonCore_M3_HasKey" + } + ] + } + ], "parent": "LIonCore_M3" }, { - "concept": "LIonCore_M3_Concept", - "id": "LIonCore_M3_Property", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "Property", - "LIonCore_M3_Concept_abstract": false - }, - "children": { - "LIonCore_M3_FeaturesContainer_features": [ - "LIonCore_M3_Property_type" - ] - }, - "references": { - "LIonCore_M3_Concept_extends": [ - { - "resolveInfo": null, - "reference": "LIonCore_M3_Feature" - } - ], - "LIonCore_M3_Concept_implements": [] - }, - "parent": "LIonCore_M3" + "id": "LIonCore_M3_Metamodel_name", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Property" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_optional" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_derived" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "name" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "LIonCore.M3.Metamodel.name" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "LIonCore_M3_Metamodel_name" + } + ], + "children": [], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Property_type" + }, + "targets": [ + { + "resolveInfo": "String", + "reference": "LIonCore_M3_String" + } + ] + } + ], + "parent": "LIonCore_M3_Metamodel" }, { - "concept": "LIonCore_M3_Reference", - "id": "LIonCore_M3_Property_type", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "concept", - "LIonCore_M3_Feature_optional": false, - "LIonCore_M3_Feature_derived": false, - "LIonCore_M3_Link_multiple": false - }, - "references": { - "LIonCore_M3_Link_type": [ - { - "resolveInfo": null, - "reference": "LIonCore_M3_DataType" - } - ] - }, - "parent": "LIonCore_M3_Property" + "id": "LIonCore_M3_Metamodel_version", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Property" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_optional" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_derived" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "version" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "LIonCore.M3.Metamodel.version" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "LIonCore_M3_Metamodel_version" + } + ], + "children": [], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Property_type" + }, + "targets": [ + { + "resolveInfo": "String", + "reference": "LIonCore_M3_String" + } + ] + } + ], + "parent": "LIonCore_M3_Metamodel" }, { - "concept": "LIonCore_M3_Concept", - "id": "LIonCore_M3_DataType", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "DataType", - "LIonCore_M3_Concept_abstract": true - }, - "children": { - "LIonCore_M3_FeaturesContainer_features": [] - }, - "references": { - "LIonCore_M3_Concept_extends": [ - { - "resolveInfo": null, - "reference": "LIonCore_M3_MetamodelElement" - } - ], - "LIonCore_M3_Concept_implements": [] - }, - "parent": "LIonCore_M3" + "id": "LIonCore_M3_Metamodel_dependsOn", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Reference" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Link_multiple" + }, + "value": "true" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_optional" + }, + "value": "true" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_derived" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "dependsOn" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "LIonCore.M3.Metamodel.dependsOn" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "LIonCore_M3_Metamodel_dependsOn" + } + ], + "children": [], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Link_type" + }, + "targets": [ + { + "resolveInfo": "Metamodel", + "reference": "LIonCore_M3_Metamodel" + } + ] + } + ], + "parent": "LIonCore_M3_Metamodel" }, { - "concept": "LIonCore_M3_Concept", - "id": "LIonCore_M3_PrimitiveType", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "PrimitiveType", - "LIonCore_M3_Concept_abstract": false - }, - "children": { - "LIonCore_M3_FeaturesContainer_features": [] - }, - "references": { - "LIonCore_M3_Concept_extends": [ - { - "resolveInfo": null, - "reference": "LIonCore_M3_DataType" - } - ], - "LIonCore_M3_Concept_implements": [] - }, - "parent": "LIonCore_M3" + "id": "LIonCore_M3_Metamodel_elements", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Containment" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Link_multiple" + }, + "value": "true" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_optional" + }, + "value": "true" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_derived" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "elements" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "LIonCore.M3.Metamodel.elements" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "LIonCore_M3_Metamodel_elements" + } + ], + "children": [], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Link_type" + }, + "targets": [ + { + "resolveInfo": "MetamodelElement", + "reference": "LIonCore_M3_MetamodelElement" + } + ] + } + ], + "parent": "LIonCore_M3_Metamodel" }, { - "concept": "LIonCore_M3_Concept", - "id": "LIonCore_M3_Containment", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "Containment", - "LIonCore_M3_Concept_abstract": false - }, - "children": { - "LIonCore_M3_FeaturesContainer_features": [] - }, - "references": { - "LIonCore_M3_Concept_extends": [ - { - "resolveInfo": null, - "reference": "LIonCore_M3_Link" - } - ], - "LIonCore_M3_Concept_implements": [] - }, + "id": "LIonCore_M3_MetamodelElement", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_abstract" + }, + "value": null + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "MetamodelElement" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "LIonCore.M3.MetamodelElement" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "LIonCore_M3_MetamodelElement" + } + ], + "children": [ + { + "containment": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_FeaturesContainer_features" + }, + "children": [] + } + ], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_extends" + }, + "targets": [ + { + "resolveInfo": "NamespacedEntity", + "reference": "LIonCore_M3_NamespacedEntity" + } + ] + }, + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_implements" + }, + "targets": [ + { + "resolveInfo": "HasKey", + "reference": "LIonCore_M3_HasKey" + } + ] + } + ], "parent": "LIonCore_M3" }, { - "concept": "LIonCore_M3_Concept", - "id": "LIonCore_M3_Enumeration", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "Enumeration", - "LIonCore_M3_Concept_abstract": false - }, - "children": { - "LIonCore_M3_FeaturesContainer_features": [ - "LIonCore_M3_Enumeration_literals" - ] - }, - "references": { - "LIonCore_M3_Concept_extends": [ - { - "resolveInfo": null, - "reference": "LIonCore_M3_DataType" - } - ], - "LIonCore_M3_Concept_implements": [ - { - "resolveInfo": null, - "reference": "LIonCore_M3_NamespaceProvider" - } - ] - }, + "id": "LIonCore_M3_NamespacedEntity", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_abstract" + }, + "value": "true" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "NamespacedEntity" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "LIonCore.M3.NamespacedEntity" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "LIonCore_M3_NamespacedEntity" + } + ], + "children": [ + { + "containment": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_FeaturesContainer_features" + }, + "children": [ + "LIonCore_M3_NamespacedEntity_simpleName", + "LIonCore_M3_NamespacedEntity_qualifiedName" + ] + } + ], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_extends" + }, + "targets": [] + }, + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_implements" + }, + "targets": [] + } + ], "parent": "LIonCore_M3" }, { - "concept": "LIonCore_M3_Containment", - "id": "LIonCore_M3_Enumeration_literals", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "literals", - "LIonCore_M3_Feature_optional": false, - "LIonCore_M3_Feature_derived": false, - "LIonCore_M3_Link_multiple": true - }, - "references": { - "LIonCore_M3_Link_type": [ - { - "resolveInfo": null, - "reference": "LIonCore_M3_EnumerationLiteral" - } - ] - }, - "parent": "LIonCore_M3_Enumeration" + "id": "LIonCore_M3_NamespacedEntity_simpleName", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Property" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_optional" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_derived" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "simpleName" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "LIonCore.M3.NamespacedEntity.simpleName" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "LIonCore_M3_NamespacedEntity_simpleName" + } + ], + "children": [], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Property_type" + }, + "targets": [ + { + "resolveInfo": "String", + "reference": "LIonCore_M3_String" + } + ] + } + ], + "parent": "LIonCore_M3_NamespacedEntity" }, { - "concept": "LIonCore_M3_Concept", - "id": "LIonCore_M3_EnumerationLiteral", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "EnumerationLiteral", - "LIonCore_M3_Concept_abstract": false - }, - "children": { - "LIonCore_M3_FeaturesContainer_features": [] - }, - "references": { - "LIonCore_M3_Concept_extends": [ - { - "resolveInfo": null, - "reference": "LIonCore_M3_NamespacedEntity" - } - ], - "LIonCore_M3_Concept_implements": [] - }, - "parent": "LIonCore_M3" + "id": "LIonCore_M3_NamespacedEntity_qualifiedName", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Property" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_optional" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_derived" + }, + "value": "true" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "qualifiedName" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "LIonCore.M3.NamespacedEntity.qualifiedName" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "LIonCore_M3_NamespacedEntity_qualifiedName" + } + ], + "children": [], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Property_type" + }, + "targets": [ + { + "resolveInfo": "String", + "reference": "LIonCore_M3_String" + } + ] + } + ], + "parent": "LIonCore_M3_NamespacedEntity" }, { - "concept": "LIonCore_M3_PrimitiveType", - "id": "LIonCore_M3_String", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "String" - }, + "id": "LIonCore_M3_NamespaceProvider", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_ConceptInterface" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "NamespaceProvider" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "LIonCore.M3.NamespaceProvider" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "LIonCore_M3_NamespaceProvider" + } + ], + "children": [ + { + "containment": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_FeaturesContainer_features" + }, + "children": [] + } + ], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_ConceptInterface_extends" + }, + "targets": [] + } + ], "parent": "LIonCore_M3" }, { - "concept": "LIonCore_M3_PrimitiveType", - "id": "LIonCore_M3_boolean", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "boolean" - }, + "id": "LIonCore_M3_PrimitiveType", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_abstract" + }, + "value": null + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "PrimitiveType" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "LIonCore.M3.PrimitiveType" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "LIonCore_M3_PrimitiveType" + } + ], + "children": [ + { + "containment": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_FeaturesContainer_features" + }, + "children": [] + } + ], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_extends" + }, + "targets": [ + { + "resolveInfo": "DataType", + "reference": "LIonCore_M3_DataType" + } + ] + }, + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_implements" + }, + "targets": [] + } + ], "parent": "LIonCore_M3" }, { - "concept": "LIonCore_M3_PrimitiveType", - "id": "LIonCore_M3_int", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "int" - }, + "id": "LIonCore_M3_Property", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_abstract" + }, + "value": null + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "Property" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "LIonCore.M3.Property" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "LIonCore_M3_Property" + } + ], + "children": [ + { + "containment": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_FeaturesContainer_features" + }, + "children": [ + "LIonCore_M3_Property_type" + ] + } + ], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_extends" + }, + "targets": [ + { + "resolveInfo": "Feature", + "reference": "LIonCore_M3_Feature" + } + ] + }, + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_implements" + }, + "targets": [] + } + ], "parent": "LIonCore_M3" }, { - "concept": "LIonCore_M3_PrimitiveType", - "id": "LIonCore_M3_JSON", - "properties": { - "LIonCore_M3_NamespacedEntity_simpleName": "JSON" - }, + "id": "LIonCore_M3_Property_type", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Reference" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Link_multiple" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_optional" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Feature_derived" + }, + "value": "false" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "type" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "LIonCore.M3.Property.type" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "LIonCore_M3_Property_type" + } + ], + "children": [], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Link_type" + }, + "targets": [ + { + "resolveInfo": "DataType", + "reference": "LIonCore_M3_DataType" + } + ] + } + ], + "parent": "LIonCore_M3_Property" + }, + { + "id": "LIonCore_M3_Reference", + "concept": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept" + }, + "properties": [ + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_abstract" + }, + "value": null + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_simpleName" + }, + "value": "Reference" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_NamespacedEntity_qualifiedName" + }, + "value": "LIonCore.M3.Reference" + }, + { + "property": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_HasKey_key" + }, + "value": "LIonCore_M3_Reference" + } + ], + "children": [ + { + "containment": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_FeaturesContainer_features" + }, + "children": [] + } + ], + "references": [ + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_extends" + }, + "targets": [ + { + "resolveInfo": "Link", + "reference": "LIonCore_M3_Link" + } + ] + }, + { + "reference": { + "metamodel": "LIonCore_M3", + "version": "1", + "key": "LIonCore_M3_Concept_implements" + }, + "targets": [] + } + ], "parent": "LIonCore_M3" } ] -} \ No newline at end of file +}