summaryrefslogtreecommitdiff
path: root/utils/ontology/data-validator.c
diff options
context:
space:
mode:
Diffstat (limited to 'utils/ontology/data-validator.c')
-rw-r--r--utils/ontology/data-validator.c212
1 files changed, 212 insertions, 0 deletions
diff --git a/utils/ontology/data-validator.c b/utils/ontology/data-validator.c
new file mode 100644
index 000000000..d80cdb583
--- /dev/null
+++ b/utils/ontology/data-validator.c
@@ -0,0 +1,212 @@
+/*
+ * 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 "config.h"
+
+#include <string.h>
+
+#include <glib.h>
+#include <glib/gstdio.h>
+#include <gio/gio.h>
+
+#include <libtracker-data/tracker-data.h>
+
+static gchar *ontology_dir = NULL;
+static gchar *ttl_file = NULL;
+
+static GOptionEntry entries[] = {
+ { "ttl-file", 't', 0, G_OPTION_ARG_FILENAME, &ttl_file,
+ "Turtle file to validate",
+ NULL
+ },
+ { "ontology-dir", 'o', 0, G_OPTION_ARG_FILENAME, &ontology_dir,
+ "Directory containing the ontology description files (TTL FORMAT)",
+ NULL
+ },
+ { NULL }
+};
+
+#define CLASS "http://www.w3.org/2000/01/rdf-schema#Class"
+#define PROPERTY "http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"
+#define IS "http://www.w3.org/1999/02/22-rdf-syntax-ns#type"
+
+static gboolean error_flag = FALSE;
+
+static GList *unknown_items = NULL;
+static GList *known_items = NULL;
+
+static gboolean
+exists_or_already_reported (const gchar *item)
+{
+ if (!g_list_find_custom (known_items,
+ item,
+ (GCompareFunc) g_strcmp0)){
+ if (!g_list_find_custom (unknown_items,
+ item,
+ (GCompareFunc) g_strcmp0)) {
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+static void
+turtle_load_ontology (const gchar *turtle_subject,
+ const gchar *turtle_predicate,
+ const gchar *turtle_object)
+{
+
+ if (!g_strcmp0 (turtle_predicate, IS)) {
+ known_items = g_list_prepend (known_items, g_strdup (turtle_subject));
+ }
+}
+
+static void
+turtle_statement_handler (const gchar *turtle_subject,
+ const gchar *turtle_predicate,
+ const gchar *turtle_object)
+{
+ /* Check that predicate exists in the ontology */
+ if (!exists_or_already_reported (turtle_predicate)){
+ g_print ("Unknown property %s\n", turtle_predicate);
+ unknown_items = g_list_prepend (unknown_items, g_strdup (turtle_predicate));
+ error_flag = TRUE;
+ }
+
+ /* And if it is a type... check the object is also there */
+ if (!g_strcmp0 (turtle_predicate, IS)) {
+ if (!exists_or_already_reported (turtle_object)){
+ g_print ("Unknown class %s\n", turtle_object);
+ error_flag = TRUE;
+ unknown_items = g_list_prepend (unknown_items, g_strdup (turtle_object));
+ }
+ }
+}
+
+static void
+load_ontology_files (const gchar *services_dir)
+{
+ GList *files = NULL;
+ GDir *services;
+ const gchar *conf_file;
+ GFile *f;
+ gchar *dir_uri, *fullpath;
+ gint counter = 0;
+
+ f = g_file_new_for_path (services_dir);
+ dir_uri = g_file_get_path (f);
+
+ services = g_dir_open (dir_uri, 0, NULL);
+
+ conf_file = g_dir_read_name (services);
+
+ while (conf_file) {
+ TrackerTurtleReader *reader;
+ GError *error = NULL;
+
+ if (!g_str_has_suffix (conf_file, "ontology")) {
+ conf_file = g_dir_read_name (services);
+ continue;
+ }
+
+ fullpath = g_build_filename (dir_uri, conf_file, NULL);
+
+ reader = tracker_turtle_reader_new (fullpath, NULL);
+
+ while (error == NULL && tracker_turtle_reader_next (reader, &error)) {
+ turtle_load_ontology (tracker_turtle_reader_get_subject (reader),
+ tracker_turtle_reader_get_predicate (reader),
+ tracker_turtle_reader_get_object (reader));
+ }
+
+ g_object_unref (reader);
+
+ if (error) {
+ g_message ("Turtle parse error: %s", error->message);
+ g_error_free (error);
+ }
+
+ g_free (fullpath);
+ counter += 1;
+ conf_file = g_dir_read_name (services);
+ }
+
+ g_dir_close (services);
+
+ g_list_foreach (files, (GFunc) g_free, NULL);
+ g_object_unref (f);
+ g_free (dir_uri);
+ g_debug ("Loaded %d ontologies\n", counter);
+}
+
+gint
+main (gint argc, gchar **argv)
+{
+ GOptionContext *context;
+ TrackerTurtleReader *reader;
+ GError *error = NULL;
+
+ /* Translators: this messagge will apper immediately after the */
+ /* usage string - Usage: COMMAND [OPTION]... <THIS_MESSAGE> */
+ context = g_option_context_new ("- Validate a turtle file against the ontology");
+
+ /* Translators: this message will appear after the usage string */
+ /* and before the list of options. */
+ g_option_context_add_main_entries (context, entries, NULL);
+ g_option_context_parse (context, &argc, &argv, NULL);
+
+ if (!ontology_dir || !ttl_file) {
+ gchar *help;
+
+ g_printerr ("%s\n\n",
+ "Ontology directory and turtle file are mandatory");
+
+ help = g_option_context_get_help (context, TRUE, NULL);
+ g_option_context_free (context);
+ g_printerr ("%s", help);
+ g_free (help);
+
+ return -1;
+ }
+
+ //"/home/ivan/devel/codethink/tracker-ssh/data/services"
+ load_ontology_files (ontology_dir);
+
+ reader = tracker_turtle_reader_new (ttl_file, NULL);
+
+ while (error == NULL && tracker_turtle_reader_next (reader, &error)) {
+ turtle_statement_handler (tracker_turtle_reader_get_subject (reader),
+ tracker_turtle_reader_get_predicate (reader),
+ tracker_turtle_reader_get_object (reader));
+ }
+
+ g_object_unref (reader);
+
+ if (error) {
+ g_message ("Turtle parse error: %s", error->message);
+ g_error_free (error);
+ }
+
+ if (!error_flag) {
+ g_debug ("%s seems OK.", ttl_file);
+ }
+
+ return 0;
+}