diff options
author | Benjamin Paassen <bpaassen@techfak.uni-bielefeld.de> | 2015-04-09 16:02:21 +0200 |
---|---|---|
committer | Andreas Stöckel <astoecke@techfak.uni-bielefeld.de> | 2016-04-25 22:19:35 +0200 |
commit | f236e4d7401d55d18707ac3374f913ada41e5b7b (patch) | |
tree | 7770f397b4ce2487ae19ed11143583f7d44e3af2 | |
parent | f98526eb42909efbc8b2b4f85dfbfd588e25f515 (diff) |
added serialization support for attributes descriptors.
-rw-r--r-- | src/core/model/Typesystem.cpp | 8 | ||||
-rw-r--r-- | src/core/model/Typesystem.hpp | 26 | ||||
-rw-r--r-- | src/core/parser/stack/OntologyHandler.cpp | 2 | ||||
-rw-r--r-- | src/plugins/xml/XmlOutput.cpp | 45 | ||||
-rw-r--r-- | testdata/integration/ontology_serialization/attributes_descriptor.in.osml | 10 | ||||
-rw-r--r-- | testdata/integration/ontology_serialization/attributes_descriptor.out.osxml | 18 |
6 files changed, 89 insertions, 20 deletions
diff --git a/src/core/model/Typesystem.cpp b/src/core/model/Typesystem.cpp index df2b9fb..688cb60 100644 --- a/src/core/model/Typesystem.cpp +++ b/src/core/model/Typesystem.cpp @@ -618,6 +618,14 @@ bool StructType::cast(Variant &data, Logger &logger) const return buildFromArrayOrMap(data, logger, NullMagicCallback, true); } +NodeVector<Attribute> StructType::getOwnAttributes() const +{ + NodeVector<Attribute> res; + res.insert(res.end(), attributes.begin() + attributeStart, + attributes.end()); + return res; +} + ssize_t StructType::indexOf(const std::string &name) const { size_t res; diff --git a/src/core/model/Typesystem.hpp b/src/core/model/Typesystem.hpp index 559a74c..193726d 100644 --- a/src/core/model/Typesystem.hpp +++ b/src/core/model/Typesystem.hpp @@ -64,20 +64,20 @@ public: */ enum class MagicCallbackResult { /** - * A magic value with the given name could not be resolved. - */ + * A magic value with the given name could not be resolved. + */ NOT_FOUND, /** - * A magic value with the given name could be resolved, but is of the - * wrong type. - */ + * A magic value with the given name could be resolved, but is of the + * wrong type. + */ FOUND_INVALID, /** - * A magic value with the given name could be resolved and is of the - * correct type. - */ + * A magic value with the given name could be resolved and is of the + * correct type. + */ FOUND_VALID }; @@ -953,7 +953,15 @@ public: * * @return a const reference pointing at the attribute list. */ - const NodeVector<Attribute> &getAttributes() const { return attributes; }; + const NodeVector<Attribute> &getAttributes() const { return attributes; } + + /** + * Returns a vector of all attributes that belong to this StructType itself, + * excluding the attributes of the parent structure. + * + * @return a vector of all attributes that belong to this StructType itself. + */ + NodeVector<Attribute> getOwnAttributes() const; /** * Returns the index of the given attribute in a data array representing diff --git a/src/core/parser/stack/OntologyHandler.cpp b/src/core/parser/stack/OntologyHandler.cpp index 0a33c97..0cd8140 100644 --- a/src/core/parser/stack/OntologyHandler.cpp +++ b/src/core/parser/stack/OntologyHandler.cpp @@ -108,7 +108,7 @@ void OntologyAnnotationHandler::end() { scope().pop(logger()); } bool OntologyAttributesHandler::startCommand(Variant::mapType &args) { - // Fetch the current typesystem and create the struct node + // Fetch the current descriptor and add the attributes descriptor Rooted<Descriptor> parent = scope().selectOrThrow<Descriptor>(); Rooted<StructType> attrDesc = parent->getAttributesDescriptor(); diff --git a/src/plugins/xml/XmlOutput.cpp b/src/plugins/xml/XmlOutput.cpp index 8c45a52..cdca730 100644 --- a/src/plugins/xml/XmlOutput.cpp +++ b/src/plugins/xml/XmlOutput.cpp @@ -51,7 +51,8 @@ struct TransformParams { }; /* - * These are method declarations to allow for cross-references of methods. + * These are forward method declarations to allow for cross-references of + * methods. */ /* @@ -69,6 +70,18 @@ static Rooted<Element> transformOntology(Handle<Element> parent, static std::string getTypeRef(Handle<Typesystem> referencing, Handle<Type> referenced); +static Rooted<Element> transformStructTypeEntry(Handle<Element> parent, + const std::string &tagName, + Handle<StructType> t, + Handle<Attribute> a, + TransformParams &P); + +static Rooted<Element> transformStructType(Handle<Element> parent, + const std::string &structTagName, + const std::string &fieldTagName, + Handle<StructType> t, + TransformParams &P); + static Rooted<Element> transformTypesystem(Handle<Element> parent, Handle<Typesystem> t, TransformParams &P); @@ -301,7 +314,12 @@ static void transformDescriptor(Handle<Element> elem, Handle<Element> syntax, { // add name. addNameAttribute(d, elem->getAttributes()); - // TODO: transform the attributes descriptor. + // transform the attributes descriptor. + Rooted<Element> attributes = transformStructType( + elem, "attributes", "attribute", d->getAttributesDescriptor(), P); + // remove the parent entry if it is there. + attributes->getAttributes().erase("parent"); + elem->addChild(attributes); // transform the syntactic sugar description. { Rooted<Element> open = @@ -434,12 +452,13 @@ std::string getTypeRef(Handle<Typesystem> referencing, Handle<Type> referenced) } Rooted<Element> transformStructTypeEntry(Handle<Element> parent, + const std::string &tagName, Handle<StructType> t, Handle<Attribute> a, TransformParams &P) { // create an xml element for the attribute. - Rooted<Element> attribute{new Element(P.mgr, parent, "field")}; + Rooted<Element> attribute{new Element(P.mgr, parent, tagName)}; addNameAttribute(a, attribute->getAttributes()); // add the type reference { @@ -451,22 +470,27 @@ Rooted<Element> transformStructTypeEntry(Handle<Element> parent, attribute->getAttributes().emplace("default", toString(a->getDefaultValue(), P)); } - // set the optional flag. - attribute->getAttributes().emplace("optional", - getStringForBool(a->isOptional())); return attribute; } Rooted<Element> transformStructType(Handle<Element> parent, + const std::string &structTagName, + const std::string &fieldTagName, Handle<StructType> t, TransformParams &P) { // create an xml element for the struct type itself. - Rooted<Element> structType{new Element(P.mgr, parent, "struct")}; + Rooted<Element> structType{new Element(P.mgr, parent, structTagName)}; addNameAttribute(t, structType->getAttributes()); + // transformt the parent reference. + if (t->getParentStructure() != nullptr) { + std::string typeRef = + getTypeRef(t->getTypesystem(), t->getParentStructure()); + structType->getAttributes().emplace("parent", typeRef); + } // transform all attributes. - for (auto &a : t->getAttributes()) { + for (auto &a : t->getOwnAttributes()) { Rooted<Element> attribute = - transformStructTypeEntry(structType, t, a, P); + transformStructTypeEntry(structType, fieldTagName, t, a, P); structType->addChild(attribute); } return structType; @@ -504,7 +528,8 @@ Rooted<Element> transformTypesystem(Handle<Element> parent, for (auto tp : t->getTypes()) { Rooted<Element> type; if (tp->isa(&RttiTypes::StructType)) { - type = transformStructType(typesystem, tp.cast<StructType>(), P); + type = transformStructType(typesystem, "struct", "field", + tp.cast<StructType>(), P); } else { P.logger.warning(std::string("Type ") + tp->getName() + " can not be serialized, because it is neither a " diff --git a/testdata/integration/ontology_serialization/attributes_descriptor.in.osml b/testdata/integration/ontology_serialization/attributes_descriptor.in.osml new file mode 100644 index 0000000..8c1957a --- /dev/null +++ b/testdata/integration/ontology_serialization/attributes_descriptor.in.osml @@ -0,0 +1,10 @@ +\document + \ontology#test + \struct#a[root=true] + \attributes + \attribute[name="myAttr", type=int, default=4] + \struct#b[isa=a] + \attributes + \attribute[name="myOtherAttr", type=string, default="bla"] + +\a[myAttr=4] diff --git a/testdata/integration/ontology_serialization/attributes_descriptor.out.osxml b/testdata/integration/ontology_serialization/attributes_descriptor.out.osxml new file mode 100644 index 0000000..00f21f5 --- /dev/null +++ b/testdata/integration/ontology_serialization/attributes_descriptor.out.osxml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<document> + <ontology name="test"> + <struct cardinality="{*}" name="a" root="true" transparent="false"> + <syntax/> + <attributes> + <attribute default="4" name="myAttr" type="int"/> + </attributes> + </struct> + <struct cardinality="{*}" isa="a" name="b" root="false" transparent="false"> + <syntax/> + <attributes> + <attribute default="bla" name="myOtherAttr" type="string"/> + </attributes> + </struct> + </ontology> + <test:a myAttr="4"/> +</document> |