[tracker/wip/carlosg/hotdoc: 26/53] docs: Rewrite data model of documentation tool
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker/wip/carlosg/hotdoc: 26/53] docs: Rewrite data model of documentation tool
- Date: Fri, 20 Aug 2021 12:38:41 +0000 (UTC)
commit fabebbba0afeceb11563acb009d6e7bf70152a7c
Author: Carlos Garnacho <carlosg gnome org>
Date: Sat May 29 21:24:28 2021 +0200
docs: Rewrite data model of documentation tool
Instead of parsing ontology TTL by itself, use 2 in-memory
TrackerSparqlConnections for the task, one to load .description
files, and another with an empty database.
With these in place, the ontology is fully introspectable, we
can then query these to fill in our information about the defined
classes and properties.
One advantage here is that we avoid purpose-specific Turtle
file parsers and unify this on the sparql library.
docs/tools/dsc-ontology.gresource.xml | 5 +
docs/tools/meson.build | 14 +-
docs/tools/ontology/10-dsc.ontology | 65 +++
docs/tools/tracker-ontology-model.c | 590 +++++++++++++++++++++
.../{ttl_model.h => tracker-ontology-model.h} | 50 +-
docs/tools/ttl2xml.c | 110 +---
docs/tools/ttl_loader.c | 460 ----------------
docs/tools/ttl_loader.h | 45 --
docs/tools/ttl_model.c | 206 -------
docs/tools/ttl_xml.c | 121 +++--
docs/tools/ttl_xml.h | 12 +-
docs/tools/ttlresource2xml.c | 181 +++----
docs/tools/ttlresource2xml.h | 18 +-
13 files changed, 881 insertions(+), 996 deletions(-)
---
diff --git a/docs/tools/dsc-ontology.gresource.xml b/docs/tools/dsc-ontology.gresource.xml
new file mode 100644
index 000000000..c5f9b176f
--- /dev/null
+++ b/docs/tools/dsc-ontology.gresource.xml
@@ -0,0 +1,5 @@
+<gresources>
+ <gresource prefix="/org/freedesktop/tracker/doctool">
+ <file>ontology/10-dsc.ontology</file>
+ </gresource>
+</gresources>
diff --git a/docs/tools/meson.build b/docs/tools/meson.build
index e3672fe2c..6e7ad958e 100644
--- a/docs/tools/meson.build
+++ b/docs/tools/meson.build
@@ -1,11 +1,15 @@
# These tools are used for generating the ontologies documentation.
-ttl_loader_files = [
- 'ttl_loader.c',
- 'ttl_model.c',
+doctool_gresources = gnome.compile_resources('tracker_doctool_gresources', 'dsc-ontology.gresource.xml')
+
+doctool_files = [
+ 'tracker-ontology-model.c',
'ttl_xml.c',
+ 'ttlresource2xml.c',
+ 'ttl2xml.c',
]
ttl2xml = executable('ttl2xml',
- ttl_loader_files, 'ttl2xml.c', 'ttlresource2xml.c',
- dependencies: [tracker_data_dep, tracker_sparql_dep])
+ doctool_files,
+ doctool_gresources,
+ dependencies: [tracker_sparql_dep])
diff --git a/docs/tools/ontology/10-dsc.ontology b/docs/tools/ontology/10-dsc.ontology
new file mode 100644
index 000000000..5ff624ad1
--- /dev/null
+++ b/docs/tools/ontology/10-dsc.ontology
@@ -0,0 +1,65 @@
+# Ontology to load ontology descriptions, coming
+# as .description files alongside ontologies.
+@prefix dsc: <http://tracker.api.gnome.org/ontology/v3/dsc#> .
+@prefix nrl: <http://tracker.api.gnome.org/ontology/v3/nrl#> .
+@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
+
+dsc: a nrl:Namespace, nrl:Ontology ;
+ nrl:prefix "dsc" ;
+ nrl:lastModified "2021-05-28T14:00:00Z" .
+
+dsc:Ontology a rdfs:Class ;
+ rdfs:subClassOf rdfs:Resource .
+
+dsc:title a rdf:Property ;
+ nrl:maxCardinality 1 ;
+ rdfs:domain dsc:Ontology ;
+ rdfs:range xsd:string .
+
+dsc:description a rdf:Property ;
+ nrl:maxCardinality 1 ;
+ rdfs:domain dsc:Ontology ;
+ rdfs:range xsd:string .
+
+dsc:author a rdf:Property ;
+ rdfs:domain dsc:Ontology ;
+ rdfs:range xsd:string .
+
+dsc:editor a rdf:Property ;
+ rdfs:domain dsc:Ontology ;
+ rdfs:range xsd:string .
+
+dsc:contributor a rdf:Property ;
+ rdfs:domain dsc:Ontology ;
+ rdfs:range xsd:string .
+
+dsc:upstream a rdf:Property ;
+ nrl:maxCardinality 1 ;
+ rdfs:domain dsc:Ontology ;
+ rdfs:range xsd:string .
+
+dsc:gitlog a rdf:Property ;
+ nrl:maxCardinality 1 ;
+ rdfs:domain dsc:Ontology ;
+ rdfs:range xsd:string .
+
+dsc:localPrefix a rdf:Property ;
+ nrl:maxCardinality 1 ;
+ rdfs:domain dsc:Ontology ;
+ rdfs:range xsd:string .
+
+dsc:baseUrl a rdf:Property ;
+ nrl:maxCardinality 1 ;
+ rdfs:domain dsc:Ontology ;
+ rdfs:range xsd:string .
+
+dsc:relativePath a rdf:Property ;
+ nrl:maxCardinality 1 ;
+ rdfs:domain dsc:Ontology ;
+ rdfs:range xsd:string .
+
+dsc:copyright a rdf:Property ;
+ rdfs:domain dsc:Ontology ;
+ rdfs:range xsd:string .
diff --git a/docs/tools/tracker-ontology-model.c b/docs/tools/tracker-ontology-model.c
new file mode 100644
index 000000000..c584e47ac
--- /dev/null
+++ b/docs/tools/tracker-ontology-model.c
@@ -0,0 +1,590 @@
+/*
+ * Copyright (C) 2009, Nokia <ivan frade nokia com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+#include <libtracker-sparql/tracker-sparql.h>
+
+#include "tracker-ontology-model.h"
+
+struct _TrackerOntologyModel
+{
+ TrackerSparqlConnection *ontology_conn;
+ TrackerSparqlConnection *desc_conn;
+
+ TrackerSparqlStatement *classes_stmt;
+ TrackerSparqlStatement *props_stmt;
+ GHashTable *stmts;
+
+ GHashTable *classes;
+ GHashTable *properties;
+ GHashTable *descriptions;
+};
+
+TrackerOntologyClass *
+ttl_model_class_new (const gchar *classname)
+{
+ TrackerOntologyClass *def = NULL;
+
+ def = g_new0 (TrackerOntologyClass, 1);
+ def->classname = g_strdup (classname);
+
+ return def;
+}
+
+void
+ttl_model_class_free (TrackerOntologyClass *def)
+{
+ g_free (def->classname);
+ g_free (def->shortname);
+ g_free (def->basename);
+
+ g_list_free_full (def->superclasses, (GDestroyNotify) g_free);
+ g_list_free_full (def->subclasses, (GDestroyNotify) g_free);
+ g_list_free_full (def->in_domain_of, (GDestroyNotify) g_free);
+ g_list_free_full (def->in_range_of, (GDestroyNotify) g_free);
+
+ g_free (def->description);
+ g_free (def->specification);
+
+ g_list_free_full (def->instances, (GDestroyNotify) g_free);
+
+ g_free (def);
+}
+
+TrackerOntologyProperty *
+ttl_model_property_new (const gchar *propname)
+{
+ TrackerOntologyProperty *prop;
+
+ prop = g_new0 (TrackerOntologyProperty, 1);
+ prop->propertyname = g_strdup (propname);
+
+ return prop;
+}
+
+void
+ttl_model_property_free (TrackerOntologyProperty *def)
+{
+ g_free (def->propertyname);
+ g_free (def->shortname);
+ g_free (def->basename);
+
+ g_list_free_full (def->domain, (GDestroyNotify) g_free);
+ g_list_free_full (def->range, (GDestroyNotify) g_free);
+ g_list_free_full (def->superproperties, (GDestroyNotify) g_free);
+ g_list_free_full (def->subproperties, (GDestroyNotify) g_free);
+
+ g_free (def->max_cardinality);
+ g_free (def->description);
+ g_free (def->weight);
+ g_free (def->specification);
+ g_free (def);
+}
+
+TrackerOntologyDescription *
+ttl_model_description_new (void)
+{
+ TrackerOntologyDescription *desc;
+
+ desc = g_new0 (TrackerOntologyDescription, 1);
+
+ return desc;
+}
+
+void
+ttl_model_description_free (TrackerOntologyDescription *desc)
+{
+ g_free (desc->title);
+ g_free (desc->description);
+
+ g_list_free_full (desc->authors, (GDestroyNotify) g_free);
+ g_list_free_full (desc->editors, (GDestroyNotify) g_free);
+ g_list_free_full (desc->contributors, (GDestroyNotify) g_free);
+
+ g_free (desc->gitlog);
+ g_free (desc->upstream);
+ g_free (desc->copyright);
+
+ g_free (desc->baseUrl);
+ g_free (desc->relativePath);
+ g_free (desc->localPrefix);
+
+ g_free (desc);
+}
+
+static void
+fill_in_list (TrackerSparqlConnection *conn,
+ TrackerOntologyModel *model,
+ GList **list,
+ const gchar *value,
+ const gchar *query)
+{
+ TrackerSparqlStatement *stmt;
+ TrackerSparqlCursor *cursor;
+ GError *error = NULL;
+
+ stmt = g_hash_table_lookup (model->stmts, query);
+ if (!stmt) {
+ stmt = tracker_sparql_connection_query_statement (conn, query, NULL, &error);
+ g_assert_no_error (error);
+ g_hash_table_insert (model->stmts, g_strdup (query), stmt);
+ }
+
+ tracker_sparql_statement_bind_string (stmt, "var", value);
+ cursor = tracker_sparql_statement_execute (stmt, NULL, &error);
+ g_assert_no_error (error);
+
+ while (tracker_sparql_cursor_next (cursor, NULL, &error)) {
+ const gchar *editor = tracker_sparql_cursor_get_string (cursor, 0, NULL);
+ *list = g_list_prepend (*list, g_strdup (editor));
+ }
+
+ g_assert_no_error (error);
+ g_object_unref (cursor);
+}
+
+static void
+tracker_ontology_model_init_classes (TrackerOntologyModel *model)
+{
+ TrackerOntologyClass *klass;
+ TrackerSparqlCursor *cursor;
+ GError *error = NULL;
+
+ cursor = tracker_sparql_connection_query (model->ontology_conn,
+ "SELECT "
+ " ?c"
+ " nrl:classSpecification(?c)"
+ " rdfs:comment(?c)"
+ " nrl:notify(?c)"
+ " nrl:deprecated(?c)"
+ " (SUBSTR(str(?c), strlen(?o) + 1) AS ?basename)"
+ " (CONCAT(?prefix, ':', SUBSTR(str(?c), strlen(?o) + 1))
AS ?shortname)"
+ "{"
+ " ?c a rdfs:Class ."
+ " ?o a nrl:Namespace ;"
+ " nrl:prefix ?prefix ."
+ " FILTER (STRSTARTS(?c, ?o))"
+ "}",
+ NULL,
+ &error);
+ g_assert_no_error (error);
+
+ while (tracker_sparql_cursor_next (cursor, NULL, &error)) {
+ const gchar *class_name;
+
+ class_name = tracker_sparql_cursor_get_string (cursor, 0, NULL);
+
+ klass = ttl_model_class_new (class_name);
+ klass->specification = g_strdup (tracker_sparql_cursor_get_string (cursor, 1, NULL));
+ klass->description = g_strdup (tracker_sparql_cursor_get_string (cursor, 2, NULL));
+ klass->notify = tracker_sparql_cursor_get_boolean (cursor, 3);
+ klass->deprecated = tracker_sparql_cursor_get_boolean (cursor, 4);
+ klass->basename = g_strdup (tracker_sparql_cursor_get_string (cursor, 5, NULL));
+ klass->shortname = g_strdup (tracker_sparql_cursor_get_string (cursor, 6, NULL));
+
+ fill_in_list (model->ontology_conn, model, &klass->superclasses, class_name,
+ "SELECT ?super {"
+ " ~var rdfs:subClassOf ?super"
+ "} ORDER BY DESC ?super");
+ fill_in_list (model->ontology_conn, model, &klass->subclasses, class_name,
+ "SELECT ?sub {"
+ " ?sub rdfs:subClassOf ~var"
+ "} ORDER BY DESC ?sub");
+ fill_in_list (model->ontology_conn, model, &klass->in_domain_of, class_name,
+ "SELECT ?prop {"
+ " ?prop rdfs:domain ~var"
+ "} ORDER BY DESC ?prop");
+ fill_in_list (model->ontology_conn, model, &klass->in_range_of, class_name,
+ "SELECT ?prop {"
+ " ?prop rdfs:range ~var"
+ "} ORDER BY DESC ?prop");
+ fill_in_list (model->ontology_conn, model, &klass->instances, class_name,
+ "SELECT (CONCAT(?prefix, ':', SUBSTR(str(?c), strlen(?o) + 1)) AS ?shortname) {"
+ " ?c a ~var ."
+ " ?o a nrl:Namespace ;"
+ " nrl:prefix ?prefix ."
+ " FILTER (STRSTARTS(?c, ?o))"
+ "} ORDER BY DESC ?shortname");
+
+ g_hash_table_insert (model->classes, klass->classname, klass);
+ }
+
+ g_assert_no_error (error);
+ g_object_unref (cursor);
+}
+
+TrackerOntologyProperty *
+tracker_ontology_model_init_properties (TrackerOntologyModel *model)
+{
+ TrackerOntologyProperty *prop;
+ TrackerSparqlCursor *cursor;
+ GError *error = NULL;
+
+ cursor = tracker_sparql_connection_query (model->ontology_conn,
+ "SELECT "
+ " ?p"
+ " nrl:propertySpecification(?p)"
+ " rdfs:comment(?p)"
+ " nrl:maxCardinality(?p)"
+ " nrl:deprecated(?p)"
+ " nrl:fulltextIndexed(?p)"
+ " nrl:weight(?p)"
+ " (SUBSTR(str(?p), strlen(?o) + 1) AS ?basename)"
+ " (CONCAT(?prefix, ':', SUBSTR(str(?p), strlen(?o) + 1))
AS ?shortname)"
+ "{"
+ " ?p a rdf:Property ."
+ " ?o a nrl:Namespace ;"
+ " nrl:prefix ?prefix ."
+ " FILTER (STRSTARTS(?p, ?o))"
+ "}",
+ NULL,
+ &error);
+ g_assert_no_error (error);
+
+ while (tracker_sparql_cursor_next (cursor, NULL, &error)) {
+ const gchar *prop_name;
+
+ prop_name = tracker_sparql_cursor_get_string (cursor, 0, NULL);
+
+ prop = ttl_model_property_new (prop_name);
+ prop->specification = g_strdup (tracker_sparql_cursor_get_string (cursor, 1, NULL));
+ prop->description = g_strdup (tracker_sparql_cursor_get_string (cursor, 2, NULL));
+ prop->max_cardinality = g_strdup (tracker_sparql_cursor_get_string (cursor, 3, NULL));
+ prop->deprecated = tracker_sparql_cursor_get_boolean (cursor, 4);
+ prop->fulltextIndexed = tracker_sparql_cursor_get_boolean (cursor, 5);
+ prop->weight = g_strdup (tracker_sparql_cursor_get_string (cursor, 6, NULL));
+ prop->basename = g_strdup (tracker_sparql_cursor_get_string (cursor, 7, NULL));
+ prop->shortname = g_strdup (tracker_sparql_cursor_get_string (cursor, 8, NULL));
+
+ fill_in_list (model->ontology_conn, model, &prop->domain, prop_name,
+ "SELECT ?class {"
+ " ~var rdfs:domain ?class"
+ "} ORDER BY DESC ?class");
+ fill_in_list (model->ontology_conn, model, &prop->range, prop_name,
+ "SELECT ?class {"
+ " ~var rdfs:range ?class"
+ "} ORDER BY DESC ?class");
+ fill_in_list (model->ontology_conn, model, &prop->superproperties, prop_name,
+ "SELECT ?prop {"
+ " ~var rdfs:subPropertyOf ?prop"
+ "} ORDER BY DESC ?prop");
+ fill_in_list (model->ontology_conn, model, &prop->subproperties, prop_name,
+ "SELECT ?prop {"
+ " ?prop rdfs:subPropertyOf ~var"
+ "} ORDER BY DESC ?prop");
+
+ g_hash_table_insert (model->properties, prop->propertyname, prop);
+ }
+
+ g_assert_no_error (error);
+ g_object_unref (cursor);
+
+ return prop;
+}
+
+TrackerOntologyModel *
+tracker_ontology_model_new (GFile *ontology_location,
+ GError **error)
+{
+ TrackerOntologyModel *model;
+ TrackerSparqlConnection *ontology_conn, *desc_conn;
+ GFileEnumerator *enumerator;
+ GFileInfo *info;
+ GFile *dsc_ontology;
+
+ ontology_conn = tracker_sparql_connection_new (TRACKER_SPARQL_CONNECTION_FLAGS_NONE,
+ NULL, ontology_location, NULL,
+ error);
+ if (!ontology_conn)
+ goto error;
+
+ dsc_ontology = g_file_new_for_uri ("resource:///org/freedesktop/tracker/doctool/ontology");
+ desc_conn = tracker_sparql_connection_new (TRACKER_SPARQL_CONNECTION_FLAGS_NONE,
+ NULL,
+ dsc_ontology,
+ NULL,
+ error);
+ g_clear_object (&dsc_ontology);
+
+ if (!desc_conn)
+ goto error;
+
+ /* Load all .description files into desc_conn */
+ enumerator = g_file_enumerate_children (ontology_location,
+ G_FILE_ATTRIBUTE_STANDARD_NAME,
+ G_FILE_QUERY_INFO_NONE,
+ NULL, error);
+ if (!enumerator)
+ goto error;
+
+ while (g_file_enumerator_iterate (enumerator, &info, NULL, NULL, error)) {
+ GError *inner_error = NULL;
+ gchar *uri, *query;
+ GFile *child;
+
+ if (!info)
+ break;
+ if (!g_str_has_suffix (g_file_info_get_name (info), ".description"))
+ continue;
+
+ child = g_file_enumerator_get_child (enumerator, info);
+ uri = g_file_get_uri (child);
+ query = g_strdup_printf ("LOAD <%s>", uri);
+ tracker_sparql_connection_update (desc_conn,
+ query,
+ NULL,
+ &inner_error);
+ g_assert_no_error (inner_error);
+ g_object_unref (child);
+ g_free (uri);
+ g_free (query);
+ }
+
+ model = g_new0 (TrackerOntologyModel, 1);
+ model->ontology_conn = ontology_conn;
+ model->desc_conn = desc_conn;
+ model->stmts = g_hash_table_new_full (g_str_hash, g_str_equal, NULL,
+ (GDestroyNotify) g_object_unref);
+ model->classes = g_hash_table_new_full (g_str_hash, g_str_equal, NULL,
+ (GDestroyNotify) ttl_model_class_free);
+ model->properties = g_hash_table_new_full (g_str_hash, g_str_equal, NULL,
+ (GDestroyNotify) ttl_model_property_free);
+ model->descriptions = g_hash_table_new_full (g_str_hash, g_str_equal, NULL,
+ (GDestroyNotify) ttl_model_description_free);
+
+ tracker_ontology_model_init_classes (model);
+ tracker_ontology_model_init_properties (model);
+
+ return model;
+
+error:
+ g_clear_object (&ontology_conn);
+ g_clear_object (&desc_conn);
+ g_clear_object (&enumerator);
+
+ return NULL;
+}
+
+void
+tracker_ontology_model_free (TrackerOntologyModel *model)
+{
+ g_object_unref (model->ontology_conn);
+ g_object_unref (model->desc_conn);
+ g_object_unref (model->classes_stmt);
+ g_object_unref (model->props_stmt);
+ g_hash_table_unref (model->stmts);
+ g_hash_table_unref (model->classes);
+ g_hash_table_unref (model->properties);
+ g_hash_table_unref (model->descriptions);
+ g_free (model);
+}
+
+GStrv
+tracker_ontology_model_get_prefixes (TrackerOntologyModel *model)
+{
+ TrackerSparqlCursor *cursor;
+ GError *error = NULL;
+ GPtrArray *prefixes;
+
+ cursor = tracker_sparql_connection_query (model->ontology_conn,
+ "SELECT ?p { ?u a nrl:Namespace ; nrl:prefix ?p }",
+ NULL,
+ &error);
+ g_assert_no_error (error);
+
+ prefixes = g_ptr_array_new ();
+
+ while (tracker_sparql_cursor_next (cursor, NULL, &error)) {
+ const gchar *prefix;
+
+ prefix = tracker_sparql_cursor_get_string (cursor, 0, NULL);
+ g_ptr_array_add (prefixes, g_strdup (prefix));
+ }
+
+ g_object_unref (cursor);
+ g_ptr_array_add (prefixes, NULL);
+ g_assert_no_error (error);
+
+ return (GStrv) g_ptr_array_free (prefixes, FALSE);
+}
+
+TrackerOntologyDescription *
+tracker_ontology_model_get_description (TrackerOntologyModel *model,
+ const gchar *prefix)
+{
+ TrackerSparqlStatement *stmt;
+ TrackerSparqlCursor *cursor;
+ TrackerOntologyDescription *desc;
+ GError *error = NULL;
+
+ desc = g_hash_table_lookup (model->descriptions, prefix);
+
+ if (!desc) {
+ stmt = tracker_sparql_connection_query_statement (model->desc_conn,
+ "SELECT "
+ " dsc:title(?d) "
+ " dsc:description(?d) "
+ " dsc:gitlog(?d) "
+ " dsc:localPrefix(?d) "
+ " dsc:baseUrl(?d) "
+ " dsc:relativePath(?d) "
+ " dsc:copyright(?d) "
+ " dsc:upstream(?d) "
+ "{"
+ " ?d a dsc:Ontology ;"
+ " dsc:localPrefix ~prefix"
+ "}",
+ NULL,
+ &error);
+ g_assert_no_error (error);
+
+ tracker_sparql_statement_bind_string (stmt, "prefix", prefix);
+ cursor = tracker_sparql_statement_execute (stmt, NULL, &error);
+ g_object_unref (stmt);
+ g_assert_no_error (error);
+
+ if (!tracker_sparql_cursor_next (cursor, NULL, &error))
+ return NULL;
+
+ desc = ttl_model_description_new ();
+ desc->title = g_strdup (tracker_sparql_cursor_get_string (cursor, 0, NULL));
+ desc->description = g_strdup (tracker_sparql_cursor_get_string (cursor, 1, NULL));
+ desc->gitlog = g_strdup (tracker_sparql_cursor_get_string (cursor, 2, NULL));
+ desc->localPrefix = g_strdup (tracker_sparql_cursor_get_string (cursor, 3, NULL));
+ desc->baseUrl = g_strdup (tracker_sparql_cursor_get_string (cursor, 4, NULL));
+ desc->relativePath = g_strdup (tracker_sparql_cursor_get_string (cursor, 5, NULL));
+ desc->copyright = g_strdup (tracker_sparql_cursor_get_string (cursor, 6, NULL));
+ desc->upstream = g_strdup (tracker_sparql_cursor_get_string (cursor, 7, NULL));
+
+ g_object_unref (cursor);
+
+ fill_in_list (model->desc_conn, model, &desc->authors, prefix,
+ "SELECT ?author {"
+ " ?d a dsc:Ontology ;"
+ " dsc:localPrefix ~var ;"
+ " dsc:author ?author ."
+ "}"
+ "ORDER BY DESC ?author");
+
+ fill_in_list (model->desc_conn, model, &desc->editors, prefix,
+ "SELECT ?editor {"
+ " ?d a dsc:Ontology ;"
+ " dsc:localPrefix ~var ;"
+ " dsc:editor ?editor ."
+ "}"
+ "ORDER BY DESC ?editor");
+
+ fill_in_list (model->desc_conn, model, &desc->contributors, prefix,
+ "SELECT ?contributor {"
+ " ?d a dsc:Ontology ;"
+ " dsc:localPrefix ~var ;"
+ " dsc:contributor ?contributor ."
+ "}"
+ "ORDER BY DESC ?contributor");
+
+ g_hash_table_insert (model->descriptions, desc->localPrefix, desc);
+ }
+
+ return desc;
+}
+
+GList *
+tracker_ontology_model_list_classes (TrackerOntologyModel *model,
+ const gchar *prefix)
+{
+ TrackerSparqlCursor *cursor;
+ GError *error = NULL;
+ GList *classes = NULL;
+
+ if (!model->classes_stmt) {
+ model->classes_stmt =
+ tracker_sparql_connection_query_statement (model->ontology_conn,
+ "SELECT ?u {"
+ " ?u a rdfs:Class ."
+ " ?o a nrl:Namespace ;"
+ " nrl:prefix ~prefix ."
+ " FILTER (STRSTARTS(?u, ?o))"
+ "} ORDER BY DESC ?u",
+ NULL,
+ &error);
+ g_assert_no_error (error);
+ }
+
+ tracker_sparql_statement_bind_string (model->classes_stmt, "prefix", prefix);
+ cursor = tracker_sparql_statement_execute (model->classes_stmt, NULL, &error);
+ g_assert_no_error (error);
+
+ while (tracker_sparql_cursor_next (cursor, NULL, &error)) {
+ classes = g_list_prepend (classes, g_strdup (tracker_sparql_cursor_get_string (cursor, 0,
NULL)));
+ }
+
+ g_assert_no_error (error);
+ g_object_unref (cursor);
+
+ return classes;
+}
+
+GList *
+tracker_ontology_model_list_properties (TrackerOntologyModel *model,
+ const gchar *prefix)
+{
+ TrackerSparqlCursor *cursor;
+ GError *error = NULL;
+ GList *props = NULL;
+
+ if (!model->props_stmt) {
+ model->props_stmt =
+ tracker_sparql_connection_query_statement (model->ontology_conn,
+ "SELECT ?u {"
+ " ?u a rdf:Property ."
+ " ?o a nrl:Namespace ;"
+ " nrl:prefix ~prefix ."
+ " FILTER (STRSTARTS(?u, ?o))"
+ "} ORDER BY DESC ?u",
+ NULL,
+ &error);
+ g_assert_no_error (error);
+ }
+
+ tracker_sparql_statement_bind_string (model->props_stmt, "prefix", prefix);
+ cursor = tracker_sparql_statement_execute (model->props_stmt, NULL, &error);
+ g_assert_no_error (error);
+
+ while (tracker_sparql_cursor_next (cursor, NULL, &error)) {
+ props = g_list_prepend (props, g_strdup (tracker_sparql_cursor_get_string (cursor, 0, NULL)));
+ }
+
+ g_assert_no_error (error);
+ g_object_unref (cursor);
+
+ return props;
+}
+
+TrackerOntologyClass *
+tracker_ontology_model_get_class (TrackerOntologyModel *model,
+ const gchar *class_name)
+{
+ return g_hash_table_lookup (model->classes, class_name);
+}
+
+TrackerOntologyProperty *
+tracker_ontology_model_get_property (TrackerOntologyModel *model,
+ const gchar *prop_name)
+{
+ return g_hash_table_lookup (model->properties, prop_name);
+}
diff --git a/docs/tools/ttl_model.h b/docs/tools/tracker-ontology-model.h
similarity index 51%
rename from docs/tools/ttl_model.h
rename to docs/tools/tracker-ontology-model.h
index a3758b0a2..60339fe46 100644
--- a/docs/tools/ttl_model.h
+++ b/docs/tools/tracker-ontology-model.h
@@ -17,15 +17,19 @@
* 02110-1301, USA.
*/
-#ifndef __TTL_MODEL_H__
-#define __TTL_MODEL_H__
+#ifndef TRACKER_ONTOLOGY_MODEL_H
+#define TRACKER_ONTOLOGY_MODEL_H
#include <glib.h>
G_BEGIN_DECLS
+typedef struct _TrackerOntologyModel TrackerOntologyModel;
+
typedef struct {
gchar *classname;
+ gchar *shortname;
+ gchar *basename;
gchar *specification;
GList *superclasses;
GList *subclasses;
@@ -35,12 +39,13 @@ typedef struct {
GList *instances;
gboolean notify;
gboolean deprecated;
-} OntologyClass;
+} TrackerOntologyClass;
typedef struct {
gchar *propertyname;
+ gchar *shortname;
+ gchar *basename;
gchar *specification;
- GList *type;
GList *domain;
GList *range;
GList *superproperties;
@@ -50,7 +55,7 @@ typedef struct {
gboolean deprecated;
gboolean fulltextIndexed;
gchar *weight;
-} OntologyProperty;
+} TrackerOntologyProperty;
typedef struct {
gchar *title;
@@ -64,30 +69,27 @@ typedef struct {
gchar *baseUrl;
gchar *localPrefix;
gchar *relativePath;
-} OntologyDescription;
-
-typedef struct {
- GHashTable *classes;
- GHashTable *properties;
- GHashTable *prefixes;
-} Ontology;
+} TrackerOntologyDescription;
+TrackerOntologyModel * tracker_ontology_model_new (GFile *ontology_location,
+ GError **error);
+void tracker_ontology_model_free (TrackerOntologyModel *model);
-OntologyClass * ttl_model_class_new (const gchar *classname);
-void ttl_model_class_free (OntologyClass *klass);
+GStrv tracker_ontology_model_get_prefixes (TrackerOntologyModel *model);
-OntologyDescription * ttl_model_description_new (void);
-void ttl_model_description_free (OntologyDescription *desc);
+TrackerOntologyDescription * tracker_ontology_model_get_description (TrackerOntologyModel *model,
+ const gchar *prefix);
-OntologyProperty * ttl_model_property_new (const gchar *propname);
-void ttl_model_property_free (OntologyProperty *property);
+GList * tracker_ontology_model_list_classes (TrackerOntologyModel *model,
+ const gchar *prefix);
+GList * tracker_ontology_model_list_properties (TrackerOntologyModel *model,
+ const gchar *prefix);
-gchar * ttl_model_name_to_shortname (Ontology *ontology,
- const gchar *name,
- const gchar *separator);
+TrackerOntologyClass * tracker_ontology_model_get_class (TrackerOntologyModel *model,
+ const gchar *class_name);
+TrackerOntologyProperty * tracker_ontology_model_get_property (TrackerOntologyModel *model,
+ const gchar *prop_name);
-gchar * ttl_model_name_to_basename (Ontology *ontology,
- const gchar *name);
G_END_DECLS
-#endif /* __TRACKER_TTL_MODEL_H__ */
+#endif /* TRACKER_ONTOLOGY_MODEL_H */
diff --git a/docs/tools/ttl2xml.c b/docs/tools/ttl2xml.c
index 7129c1770..655e1ef10 100644
--- a/docs/tools/ttl2xml.c
+++ b/docs/tools/ttl2xml.c
@@ -21,10 +21,9 @@
#include <gio/gio.h>
#include <string.h>
#include <stdio.h>
-#include "ttl_loader.h"
-#include "ttl_model.h"
+
+#include "tracker-ontology-model.h"
#include "ttl_xml.h"
-#include "ttlresource2xml.h"
static gchar *ontology_dir = NULL;
static gchar *output_dir = NULL;
@@ -46,69 +45,16 @@ static GOptionEntry entries[] = {
{ NULL }
};
-static gint
-compare_files (gconstpointer a,
- gconstpointer b)
-{
- const GFile *file_a = a, *file_b = b;
- gchar *basename_a, *basename_b;
- gint res;
-
- basename_a = g_file_get_basename ((GFile*) file_a);
- basename_b = g_file_get_basename ((GFile*) file_b);
- res = strcmp (basename_a, basename_b);
-
- g_free (basename_a);
- g_free (basename_b);
-
- return res;
-}
-
-static GList *
-get_description_files (GFile *dir)
-{
- GFileEnumerator *enumerator;
- GFileInfo *info;
- GFile *desc_file;
- GList *files;
- const gchar *name;
-
- enumerator = g_file_enumerate_children (dir,
- G_FILE_ATTRIBUTE_STANDARD_NAME,
- G_FILE_QUERY_INFO_NONE,
- NULL, NULL);
-
- if (!enumerator) {
- return NULL;
- }
-
- files = NULL;
-
- while ((info = g_file_enumerator_next_file (enumerator, NULL, NULL)) != NULL) {
- name = g_file_info_get_name (info);
-
- if (g_str_has_suffix (name, ".description")) {
- desc_file = g_file_enumerator_get_child (enumerator, info);
- files = g_list_insert_sorted (files, desc_file, compare_files);
- }
-
- g_object_unref (info);
- }
-
- g_object_unref (enumerator);
-
- return files;
-}
-
gint
main (gint argc, gchar **argv)
{
GOptionContext *context;
- OntologyDescription *description = NULL;
- GList *description_files, *l;
+ TrackerOntologyDescription *description = NULL;
+ TrackerOntologyModel *model = NULL;
g_autoptr(GFile) ontology_file = NULL, output_file = NULL;
gchar *path;
- gboolean success;
+ GStrv prefixes = NULL;
+ gint i;
g_autoptr(GError) error = NULL;
/* Translators: this messagge will apper immediately after the */
@@ -136,47 +82,31 @@ main (gint argc, gchar **argv)
ontology_file = g_file_new_for_commandline_arg (ontology_dir);
output_file = g_file_new_for_commandline_arg (output_dir);
- description_files = get_description_files (ontology_file);
- if (!description_files) {
- g_printerr ("Ontology description files not found in dir\n");
+ model = tracker_ontology_model_new (ontology_file, &error);
+ if (error) {
+ g_printerr ("Error loading ontology: %s\n", error->message);
+ g_error_free (error);
return -1;
}
+ prefixes = tracker_ontology_model_get_prefixes (model);
+
path = g_file_get_path (output_file);
g_mkdir_with_parents (path, 0755);
g_free (path);
- success = TRUE;
- for (l = description_files; l; l = l->next) {
- Ontology *ontology = NULL;
- g_autoptr(GFile) ttl_file = NULL, ttl_output_file = NULL;
- gchar *filename;
-
- description = ttl_loader_load_description (l->data);
- ttl_file = g_file_get_child (ontology_file, description->relativePath);
-
- filename = g_strdup_printf ("%s-ontology.xml", description->localPrefix);
- ttl_output_file = g_file_get_child (output_file, filename);
- g_free (filename);
-
- ontology = ttl_loader_new_ontology ();
-
- success &= ttl_loader_load_ontology (ontology, ttl_file, &error);
-
- if (error) {
- g_printerr ("%s: Turtle parse error: %s\n", g_file_peek_path (ttl_file),
error->message);
- g_clear_error (&error);
- }
-
- ttl_xml_print (description, ontology, ttl_output_file, description_dir);
+ for (i = 0; prefixes[i]; i++) {
+ description = tracker_ontology_model_get_description (model, prefixes[i]);
+ if (!description)
+ continue;
- ttl_loader_free_ontology (ontology);
- ttl_loader_free_description (description);
+ ttl_xml_print (description, model, prefixes[i], output_file, description_dir);
}
- g_list_free_full (description_files, (GDestroyNotify) g_object_unref);
+ g_strfreev (prefixes);
+ tracker_ontology_model_free (model);
g_option_context_free (context);
- return !(success);
+ return 0;
}
diff --git a/docs/tools/ttl_xml.c b/docs/tools/ttl_xml.c
index a5a0af308..375a8f7bb 100644
--- a/docs/tools/ttl_xml.c
+++ b/docs/tools/ttl_xml.c
@@ -23,8 +23,8 @@
#include "ttlresource2xml.h"
typedef struct {
- Ontology *ontology;
- OntologyDescription *description;
+ TrackerOntologyModel *model;
+ TrackerOntologyDescription *description;
FILE *output;
} CallbackInfo;
@@ -88,7 +88,7 @@ print_deprecated_message (FILE *f)
#endif
static void
-print_xml_header (FILE *f, OntologyDescription *desc)
+print_xml_header (FILE *f, TrackerOntologyDescription *desc)
{
g_fprintf (f, "<?xml version='1.0' encoding='UTF-8'?>\n");
g_fprintf (f, "<!DOCTYPE book PUBLIC \"-//OASIS//DTD DocBook XML V4.5//EN\"\n"
@@ -107,7 +107,7 @@ print_xml_header (FILE *f, OntologyDescription *desc)
}
static void
-print_xml_footer (FILE *f, OntologyDescription *desc)
+print_xml_footer (FILE *f, TrackerOntologyDescription *desc)
{
g_fprintf (f, "<refsect1>\n");
g_fprintf (f, "<title>Credits and Copyright</title>\n");
@@ -131,12 +131,6 @@ print_xml_footer (FILE *f, OntologyDescription *desc)
g_fprintf (f, "</refentry>\n");
}
-static gint compare_class (gconstpointer a,
- gconstpointer b)
-{
- return strcmp (((OntologyClass *)a)->classname, ((OntologyClass *)b)->classname);
-}
-
/* By default we list properties under their respective class.
*
* Ontologies can contain properties whose class is in a different
@@ -146,8 +140,9 @@ static gint compare_class (gconstpointer a,
* extra properties provided for that class.
*/
static GHashTable *
-get_extra_properties (GList *classes,
- GList *properties)
+get_extra_properties (TrackerOntologyModel *model,
+ GList *classes,
+ GList *properties)
{
GList *l, *c;
GHashTable *extra_properties;
@@ -158,17 +153,27 @@ get_extra_properties (GList *classes,
extra_properties = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
for (l = properties; l; l = l->next) {
- OntologyProperty *prop = l->data;
+ TrackerOntologyProperty *prop;
gboolean has_domain_in_this_ontology = FALSE;
- for (c = classes; c; c = c->next) {
- OntologyClass *klass;
+ prop = tracker_ontology_model_get_property (model, l->data);
+
+ for (c = prop->domain; c; c = c->next) {
+ TrackerOntologyDescription *desc = NULL;
+ TrackerOntologyClass *klass;
+ gchar *prefix;
+ const gchar *sep;
+
+ klass = tracker_ontology_model_get_class (model, c->data);
+ sep = strstr (klass->shortname, ":");
- klass = c->data;
- if (g_list_find_custom (prop->domain, klass->classname, (GCompareFunc)strcmp)) {
- has_domain_in_this_ontology = TRUE;
- break;
+ if (sep) {
+ prefix = g_strndup (klass->shortname, sep - klass->shortname);
+ desc = tracker_ontology_model_get_description (model, prefix);
+ g_free (prefix);
}
+
+ has_domain_in_this_ontology = desc != NULL;
}
if (!has_domain_in_this_ontology) {
@@ -194,8 +199,8 @@ get_extra_properties (GList *classes,
}
static void
-print_synopsis (FILE *f,
- OntologyDescription *desc)
+print_synopsis (FILE *f,
+ TrackerOntologyDescription *desc)
{
g_fprintf (f, "<refsynopsisdiv>\n");
g_fprintf (f, "<synopsis>\n");
@@ -205,10 +210,10 @@ print_synopsis (FILE *f,
}
static void
-print_toc_classes (FILE *f,
- Ontology *ontology,
- const char *id,
- GList *classes)
+print_toc_classes (FILE *f,
+ TrackerOntologyModel *model,
+ const char *id,
+ GList *classes)
{
GList *l;
@@ -219,12 +224,12 @@ print_toc_classes (FILE *f,
g_fprintf (f, "<title>Classes</title>");
for (l = classes; l; l = l->next) {
- OntologyClass *klass;
- g_autofree char *basename = NULL, *id = NULL;
+ TrackerOntologyClass *klass;
+ const char *basename = NULL, *id = NULL;
- klass = l->data;
- basename = ttl_model_name_to_basename (ontology, klass->classname);
- id = ttl_model_name_to_shortname (ontology, klass->classname, "-");
+ klass = tracker_ontology_model_get_class (model, l->data);
+ basename = klass->basename;
+ id = klass->shortname;
if (l != classes) {
g_fprintf (f, ", ");
@@ -236,10 +241,10 @@ print_toc_classes (FILE *f,
}
static void
-print_toc_extra_properties (FILE *f,
- Ontology *ontology,
- const char *id,
- GHashTable *extra_properties)
+print_toc_extra_properties (FILE *f,
+ TrackerOntologyModel *model,
+ const char *id,
+ GHashTable *extra_properties)
{
GList *props_for_class, *c, *l;
g_autoptr(GList) classes = NULL;
@@ -259,13 +264,12 @@ print_toc_extra_properties (FILE *f,
classname = c->data;
props_for_class = g_hash_table_lookup (extra_properties, classname);
for (l = props_for_class; l; l = l->next) {
- OntologyProperty *prop;
- g_autofree char *basename = NULL, *prop_id = NULL;
-
- prop = g_hash_table_lookup (ontology->properties, l->data);
+ TrackerOntologyProperty *prop;
+ const char *basename = NULL, *prop_id = NULL;
- basename = ttl_model_name_to_basename (ontology, prop->propertyname);
- prop_id = ttl_model_name_to_shortname (ontology, prop->propertyname, "-");
+ prop = tracker_ontology_model_get_property (model, l->data);
+ basename = prop->basename;
+ prop_id = prop->shortname;
if (print_comma) {
g_fprintf (f, ", ");
@@ -282,33 +286,38 @@ print_toc_extra_properties (FILE *f,
/* Generate docbook XML document for one ontology. */
void
-ttl_xml_print (OntologyDescription *description,
- Ontology *ontology,
- GFile *file,
- const gchar *description_dir)
+ttl_xml_print (TrackerOntologyDescription *description,
+ TrackerOntologyModel *model,
+ const gchar *prefix,
+ GFile *output_location,
+ const gchar *description_dir)
{
- gchar *upper_name, *path, *introduction, *basename;
+ gchar *upper_name, *path, *introduction, *basename, *filename;
g_autoptr(GList) classes = NULL, properties = NULL, extra_classes = NULL;
g_autoptr(GHashTable) extra_properties = NULL;
+ GFile *file;
GList *l;
FILE *f;
+ filename = g_strdup_printf ("%s-ontology.xml", description->localPrefix);
+ file = g_file_get_child (output_location, filename);
+ g_free (filename);
+
path = g_file_get_path (file);
f = fopen (path, "w");
g_assert (f != NULL);
g_free (path);
upper_name = g_ascii_strup (description->localPrefix, -1);
- classes = g_list_sort (g_hash_table_get_values (ontology->classes), compare_class);
- properties = g_hash_table_get_values (ontology->properties);
-
- extra_properties = get_extra_properties (classes, properties);
+ classes = tracker_ontology_model_list_classes (model, prefix);
+ properties = tracker_ontology_model_list_properties (model, prefix);
+ extra_properties = get_extra_properties (model, classes, properties);
print_xml_header (f, description);
print_synopsis (f, description);
- print_toc_classes (f, ontology, description->localPrefix, classes);
- print_toc_extra_properties (f, ontology, description->localPrefix, extra_properties);
+ print_toc_classes (f, model, description->localPrefix, classes);
+ print_toc_extra_properties (f, model, description->localPrefix, extra_properties);
basename = g_strdup_printf ("%s-introduction.xml", description->localPrefix);
introduction = g_build_filename (description_dir, basename, NULL);
@@ -320,11 +329,14 @@ ttl_xml_print (OntologyDescription *description,
}
if (classes != NULL) {
- g_fprintf (f, "<refsect1 id='%s-classes'>\n", description->localPrefix);
+ g_fprintf (f, "<refsect1 id='%s-classes'>\n", description->localPrefix);
g_fprintf (f, "<title>Class Details</title>\n");
for (l = classes; l; l = l->next) {
- print_ontology_class (ontology, l->data, f);
+ TrackerOntologyClass *klass;
+
+ klass = tracker_ontology_model_get_class (model, l->data);
+ print_ontology_class (model, klass, f);
}
g_fprintf (f, "</refsect1>\n");
@@ -344,7 +356,7 @@ ttl_xml_print (OntologyDescription *description,
properties_for_class = g_hash_table_lookup (extra_properties, classname);
if (properties_for_class) {
- print_ontology_extra_properties (ontology, description->localPrefix,
classname, properties_for_class, f);
+ print_ontology_extra_properties (model, description->localPrefix, classname,
properties_for_class, f);
}
}
@@ -355,5 +367,6 @@ ttl_xml_print (OntologyDescription *description,
g_free (upper_name);
g_free (introduction);
+ g_object_unref (file);
fclose (f);
}
diff --git a/docs/tools/ttl_xml.h b/docs/tools/ttl_xml.h
index f22745621..840182bb8 100644
--- a/docs/tools/ttl_xml.h
+++ b/docs/tools/ttl_xml.h
@@ -21,15 +21,15 @@
#define __TTL_XML_H__
#include <gio/gio.h>
-#include "ttl_model.h"
-#include <stdio.h>
+#include "tracker-ontology-model.h"
G_BEGIN_DECLS
-void ttl_xml_print (OntologyDescription *description,
- Ontology *ontology,
- GFile *file,
- const gchar *description_dir);
+void ttl_xml_print (TrackerOntologyDescription *description,
+ TrackerOntologyModel *model,
+ const gchar *prefix,
+ GFile *output_location,
+ const gchar *description_dir);
G_END_DECLS
diff --git a/docs/tools/ttlresource2xml.c b/docs/tools/ttlresource2xml.c
index 784680446..446a8f8b2 100644
--- a/docs/tools/ttlresource2xml.c
+++ b/docs/tools/ttlresource2xml.c
@@ -23,39 +23,34 @@
#include <glib/gprintf.h>
#include <gio/gio.h>
#include <stdlib.h>
-#include "ttl_loader.h"
-#include "ttl_model.h"
+#include "tracker-ontology-model.h"
#include "ttl_xml.h"
#include "ttlresource2xml.h"
static void
-class_get_parent_hierarchy (Ontology *ontology,
- const gchar *class_name,
- GList **list)
+class_get_parent_hierarchy (TrackerOntologyModel *model,
+ const gchar *class_name,
+ GList **list)
{
- OntologyClass *klass;
+ TrackerOntologyClass *klass;
GList *l;
/* Ensure we only got the same class there once */
*list = g_list_remove (*list, (gpointer) class_name);
*list = g_list_prepend (*list, (gpointer) class_name);
- klass = g_hash_table_lookup (ontology->classes, class_name);
-
- if (!klass) {
- klass = ttl_model_class_new (class_name);
- g_hash_table_insert (ontology->classes, g_strdup (klass->classname), klass);
+ klass = tracker_ontology_model_get_class (model, class_name);
+ if (!klass)
return;
- }
for (l = klass->superclasses; l; l = l->next) {
- class_get_parent_hierarchy (ontology, l->data, list);
+ class_get_parent_hierarchy (model, l->data, list);
}
}
static GList *
-class_get_hierarchy (Ontology *ontology,
- OntologyClass *klass)
+class_get_hierarchy (TrackerOntologyModel *model,
+ TrackerOntologyClass *klass)
{
GList *hierarchy = NULL, *l;
@@ -68,40 +63,33 @@ class_get_hierarchy (Ontology *ontology,
hierarchy = g_list_prepend (hierarchy, l->data);
}
- class_get_parent_hierarchy (ontology, klass->classname, &hierarchy);
+ class_get_parent_hierarchy (model, klass->classname, &hierarchy);
return hierarchy;
}
static void
-print_predefined_instances (FILE *f,
- OntologyClass *klass,
- Ontology *ontology)
+print_predefined_instances (FILE *f,
+ TrackerOntologyClass *klass,
+ TrackerOntologyModel *model)
{
- gchar *shortname, *id;
+ const gchar *id;
GList *l;
if (!klass->instances)
return;
- shortname = ttl_model_name_to_shortname (ontology, klass->classname, NULL);
- id = ttl_model_name_to_shortname (ontology, klass->classname, "-");
+ id = klass->shortname;
g_fprintf (f, "<refsect3 id='%s.predefined-instances'>", id);
g_fprintf (f, "<title>Predefined instances</title><para>");
- g_fprintf (f, "%s has the following predefined instances: ", shortname);
+ g_fprintf (f, "%s has the following predefined instances: ", klass->shortname);
g_fprintf (f, "<itemizedlist>\n");
- g_free (shortname);
- g_free (id);
-
for (l = klass->instances; l; l = l->next) {
- shortname = ttl_model_name_to_shortname (ontology, l->data, NULL);
-
g_fprintf (f, "<listitem><para>");
- g_fprintf (f, "<literal>%s</literal>", shortname);
+ g_fprintf (f, "<literal>%s</literal>", (gchar*) l->data);
g_fprintf (f, "</para></listitem>\n");
- g_free (shortname);
}
g_fprintf (f, "</itemizedlist></para></refsect3>\n");
@@ -113,7 +101,7 @@ typedef struct {
} HierarchyString;
typedef struct {
- OntologyClass *class;
+ TrackerOntologyClass *class;
GList *hierarchy;
GHashTable *resolved_children;
GHashTable *resolved_parents;
@@ -180,15 +168,15 @@ list_filter (GList *original,
}
static HierarchyContext *
-hierarchy_context_new (OntologyClass *klass,
- Ontology *ontology)
+hierarchy_context_new (TrackerOntologyClass *klass,
+ TrackerOntologyModel *model)
{
HierarchyContext *context;
GList *l;
context = g_new0 (HierarchyContext, 1);
context->class = klass;
- context->hierarchy = class_get_hierarchy (ontology, klass);
+ context->hierarchy = class_get_hierarchy (model, klass);
context->placed = g_hash_table_new (g_str_hash, g_str_equal);
context->resolved_parents = g_hash_table_new_full (g_str_hash,
g_str_equal,
@@ -201,7 +189,7 @@ hierarchy_context_new (OntologyClass *klass,
context->strings = g_ptr_array_new_with_free_func ((GDestroyNotify) hierarchy_string_free);
for (l = context->hierarchy; l; l = l->next) {
- OntologyClass *cl = g_hash_table_lookup (ontology->classes, l->data);
+ TrackerOntologyClass *cl = tracker_ontology_model_get_class (model, l->data);
g_hash_table_insert (context->resolved_parents,
cl->classname,
@@ -230,9 +218,9 @@ hierarchy_context_free (HierarchyContext *context)
}
static GList *
-hierarchy_context_get_single_parented_children (HierarchyContext *context,
- OntologyClass *klass,
- Ontology *ontology)
+hierarchy_context_get_single_parented_children (HierarchyContext *context,
+ TrackerOntologyClass *klass,
+ TrackerOntologyModel *model)
{
GList *filtered = NULL, *children, *l;
@@ -282,23 +270,22 @@ check_parents_placed (GList *parents,
}
static void
-hierarchy_context_resolve_class (HierarchyContext *context,
- OntologyClass *klass,
- Ontology *ontology)
+hierarchy_context_resolve_class (HierarchyContext *context,
+ TrackerOntologyClass *klass,
+ TrackerOntologyModel *model)
{
GList *l = g_list_find_custom (context->hierarchy, klass->classname,
(GCompareFunc) g_strcmp0);
gint pos = g_list_position (context->hierarchy, l);
GList *children, *parents;
- gchar *shortname, *link;
+ const gchar *shortname, *link;
HierarchyString *str;
gboolean is_child;
if (pos < 0)
return;
- shortname = ttl_model_name_to_shortname (ontology, klass->classname, NULL);
- link = ttl_model_name_to_shortname (ontology, klass->classname, "-");
+ shortname = link = klass->shortname;
parents = g_hash_table_lookup (context->resolved_parents,
klass->classname);
@@ -367,7 +354,7 @@ hierarchy_context_resolve_class (HierarchyContext *context,
/* Step 2: Modify all strings downwards, adding the lineart
* necessary for all children of this class.
*/
- children = hierarchy_context_get_single_parented_children (context, klass, ontology);
+ children = hierarchy_context_get_single_parented_children (context, klass, model);
l = l->next;
pos++;
@@ -406,27 +393,24 @@ hierarchy_context_resolve_class (HierarchyContext *context,
}
}
}
-
- g_free (shortname);
- g_free (link);
}
static GPtrArray *
-class_get_parent_hierarchy_strings (OntologyClass *klass,
- Ontology *ontology)
+class_get_parent_hierarchy_strings (TrackerOntologyClass *klass,
+ TrackerOntologyModel *model)
{
HierarchyContext *context;
GList *c;
GPtrArray *strings = NULL;
- context = hierarchy_context_new (klass, ontology);
+ context = hierarchy_context_new (klass, model);
/* Proceed from parent to child classes, populating the
* context->strings array.
*/
for (c = context->hierarchy; c; c = c->next) {
- OntologyClass *cl = g_hash_table_lookup (ontology->classes, c->data);
- hierarchy_context_resolve_class (context, cl, ontology);
+ TrackerOntologyClass *cl = tracker_ontology_model_get_class (model, c->data);
+ hierarchy_context_resolve_class (context, cl, model);
}
strings = g_ptr_array_ref (context->strings);
@@ -436,27 +420,25 @@ class_get_parent_hierarchy_strings (OntologyClass *klass,
}
static void
-print_class_hierarchy (FILE *f,
- OntologyClass *klass,
- Ontology *ontology)
+print_class_hierarchy (FILE *f,
+ TrackerOntologyClass *klass,
+ TrackerOntologyModel *model)
{
GPtrArray *strings;
- gchar *id;
+ const gchar *id;
gsize i;
- strings = class_get_parent_hierarchy_strings (klass, ontology);
+ strings = class_get_parent_hierarchy_strings (klass, model);
if (!strings)
return;
- id = ttl_model_name_to_shortname (ontology, klass->classname, "-");
+ id = klass->shortname;
g_fprintf (f, "<refsect3 id='%s.hierarchy'>", id);
g_fprintf (f, "<title>Class hierarchy</title>");
g_fprintf (f, "<screen>");
- g_free (id);
-
for (i = 0; i < strings->len; i++) {
HierarchyString *str = g_ptr_array_index (strings, i);
g_fprintf (f, " %s\n", str->str->str);
@@ -467,7 +449,7 @@ print_class_hierarchy (FILE *f,
}
static void
-print_flag (FILE *f,
+print_flag (FILE *f,
const gchar *flag_property_link,
const gchar *icon_name,
const gchar *flag_description)
@@ -484,10 +466,10 @@ print_flag (FILE *f,
}
static void
-print_property_table (FILE *f,
- Ontology *ontology,
- const char *id,
- GList *properties)
+print_property_table (FILE *f,
+ TrackerOntologyModel *model,
+ const char *id,
+ GList *properties)
{
GList *l, *m;
g_autoptr(GList) properties_sorted = NULL;
@@ -509,16 +491,17 @@ print_property_table (FILE *f,
g_fprintf (f, "<tbody>");
for (l = properties_sorted; l; l = l->next) {
- OntologyProperty *prop;
- g_autofree gchar *shortname = NULL, *basename = NULL, *type_name = NULL, *type_class_id =
NULL, *prop_id = NULL;
+ TrackerOntologyProperty *prop;
+ TrackerOntologyClass *range;
+ const gchar *shortname = NULL, *basename = NULL, *type_name = NULL, *type_class_id = NULL,
*prop_id = NULL;
- prop = g_hash_table_lookup (ontology->properties, l->data);
+ prop = tracker_ontology_model_get_property (model, l->data);
+ range = tracker_ontology_model_get_class (model, prop->range->data);
- prop_id = ttl_model_name_to_shortname (ontology, prop->propertyname, "-");
- shortname = ttl_model_name_to_shortname (ontology, prop->propertyname, NULL);
- basename = ttl_model_name_to_basename (ontology, prop->propertyname);
- type_name = ttl_model_name_to_basename (ontology, prop->range->data);
- type_class_id = ttl_model_name_to_shortname (ontology, prop->range->data, "-");
+ prop_id = shortname = prop->shortname;
+ basename = prop->basename;
+ type_name = range->basename;
+ type_class_id = range->shortname;
g_fprintf (f, "<row role=\"member\">");
@@ -548,11 +531,12 @@ print_property_table (FILE *f,
if (prop->superproperties) {
for (m = prop->superproperties; m; m = m->next) {
- g_autofree gchar *shortname = NULL, *superprop_id = NULL;
+ const gchar *shortname = NULL, *superprop_id = NULL;
g_autofree gchar *message = NULL;
+ TrackerOntologyProperty *superprop;
- shortname = ttl_model_name_to_shortname (ontology, m->data, NULL);
- superprop_id = ttl_model_name_to_shortname (ontology, m->data, "-");
+ superprop = tracker_ontology_model_get_property (model, m->data);
+ shortname = superprop_id = superprop->shortname;
message = g_strdup_printf ("This property extends %s", shortname);
@@ -596,16 +580,16 @@ print_property_table (FILE *f,
}
void
-print_ontology_class (Ontology *ontology,
- OntologyClass *klass,
- FILE *f)
+print_ontology_class (TrackerOntologyModel *model,
+ TrackerOntologyClass *klass,
+ FILE *f)
{
- g_autofree gchar *name = NULL, *id = NULL;
+ const gchar *name = NULL, *id = NULL;
g_return_if_fail (f != NULL);
- name = ttl_model_name_to_basename (ontology, klass->classname);
- id = ttl_model_name_to_shortname (ontology, klass->classname, "-");
+ name = klass->basename;
+ id = klass->shortname;
/* Anchor for external links. */
g_fprintf (f, "<anchor id='%s' />\n", name);
@@ -645,29 +629,29 @@ print_ontology_class (Ontology *ontology,
g_fprintf (f, "</refsect3>\n");
}
- print_class_hierarchy (f, klass, ontology);
- print_predefined_instances (f, klass, ontology);
+ print_class_hierarchy (f, klass, model);
+ print_predefined_instances (f, klass, model);
- print_property_table (f, ontology, id, klass->in_domain_of);
+ print_property_table (f, model, id, klass->in_domain_of);
g_fprintf (f, "</refsect2>\n");
}
void
-print_ontology_extra_properties (Ontology *ontology,
- const char *ontology_prefix,
- const char *classname,
- GList *properties_for_class,
- FILE *f)
+print_ontology_extra_properties (TrackerOntologyModel *model,
+ const char *ontology_prefix,
+ const char *classname,
+ GList *properties_for_class,
+ FILE *f)
{
- g_autofree gchar *short_classname = NULL;
- g_autofree gchar *section_id = NULL, *class_id = NULL;
+ TrackerOntologyClass *klass;
+ const gchar *short_classname = NULL, *class_id = NULL;
+ gchar *section_id = NULL;
g_return_if_fail (f != NULL);
- short_classname = ttl_model_name_to_shortname (ontology, classname, ":");
-
- class_id = ttl_model_name_to_shortname (ontology, classname, "-");
+ klass = tracker_ontology_model_get_class (model, classname);
+ short_classname = class_id = klass->shortname;
section_id = g_strconcat (ontology_prefix, ".", class_id, NULL);
g_fprintf (f, "<refsect2 role='rdf-property-list' id='%s'>\n", section_id);
@@ -679,6 +663,9 @@ print_ontology_extra_properties (Ontology *ontology,
short_classname);
g_fprintf (f, "</refsect3>\n");
- print_property_table (f, ontology, section_id, properties_for_class);
+ print_property_table (f, model, section_id, properties_for_class);
g_fprintf (f, "</refsect2>\n");
+
+ g_free (section_id);
}
+
diff --git a/docs/tools/ttlresource2xml.h b/docs/tools/ttlresource2xml.h
index 748e5bff0..80ba0bb4b 100644
--- a/docs/tools/ttlresource2xml.h
+++ b/docs/tools/ttlresource2xml.h
@@ -23,18 +23,18 @@
#define __TTLRESOURCE2XML_H__
#include <glib.h>
-#include "ttl_model.h"
+#include "tracker-ontology-model.h"
G_BEGIN_DECLS
-void print_ontology_class (Ontology *ontology,
- OntologyClass *klass,
- FILE *f);
-void print_ontology_extra_properties (Ontology *ontology,
- const char *ontology_prefix,
- const char *classname,
- GList *properties_for_class,
- FILE *f);
+void print_ontology_class (TrackerOntologyModel *model,
+ TrackerOntologyClass *klass,
+ FILE *f);
+void print_ontology_extra_properties (TrackerOntologyModel *model,
+ const char *ontology_prefix,
+ const char *classname,
+ GList *properties_for_class,
+ FILE *f);
G_END_DECLS
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]