diff options
Diffstat (limited to 'src/serialisation/Parser.cpp')
-rw-r--r-- | src/serialisation/Parser.cpp | 73 |
1 files changed, 27 insertions, 46 deletions
diff --git a/src/serialisation/Parser.cpp b/src/serialisation/Parser.cpp index f59c7263..67651e6b 100644 --- a/src/serialisation/Parser.cpp +++ b/src/serialisation/Parser.cpp @@ -18,6 +18,7 @@ #include <set> #include <locale.h> #include <glibmm/ustring.h> +#include <glibmm/miscutils.h> #include "raul/log.hpp" #include "redlandmm/Model.hpp" #include "redlandmm/Node.hpp" @@ -43,33 +44,16 @@ namespace Serialisation { static Glib::ustring relative_uri(Glib::ustring base, const Glib::ustring uri, bool leading_slash) { - Glib::ustring ret; - if (uri.substr(0, base.length()) == base) { - ret = (leading_slash ? "/" : "") + uri.substr(base.length()); - while (ret[0] == '#' || ret[0] == '/') - ret = ret.substr(1); - if (leading_slash && ret[0] != '/') - ret = string("/") + ret; - return ret; - } - - size_t last_slash = base.find_last_of("/"); - if (last_slash != string::npos) - base = base.substr(0, last_slash + 1); + raptor_uri* base_uri = raptor_new_uri((const unsigned char*)base.c_str()); + raptor_uri* full_uri = raptor_new_uri((const unsigned char*)uri.c_str()); - size_t last_hash = base.find_last_of("#"); - if (last_hash != string::npos) - base = base.substr(0, last_hash + 1); + Glib::ustring ret((const char*)raptor_uri_to_relative_uri_string(base_uri, full_uri)); - if (uri.length() >= base.length() && uri.substr(0, base.length()) == base) - ret = uri.substr(base.length()); - else - ret = uri; + raptor_free_uri(base_uri); + raptor_free_uri(full_uri); - if (leading_slash && (ret.empty() || ret[0] != '/')) - ret = "/" + ret; - else if (!leading_slash && !ret.empty() && ret[0] == '/') - ret = ret.substr(1); + if (leading_slash && ret[0] != '/') + ret = Glib::ustring("/") + ret; return ret; } @@ -371,17 +355,18 @@ Parser::parse_patch( const Glib::ustring base_uri = model.base_uri().to_string(); - string symbol; + Raul::Symbol symbol = "_"; if (a_symbol) { - symbol = a_symbol->c_str(); - } else { // Guess symbol from base URI (filename) if we need to - symbol = base_uri.substr(base_uri.find_last_of("/") + 1); - symbol = symbol.substr(0, symbol.find(".")); - if (!symbol.empty()) - symbol = Path::nameify(symbol); + symbol = *a_symbol; + } else { + const std::string basename = Glib::path_get_basename(base_uri); + symbol = Raul::Symbol::symbolify(basename.substr(0, basename.find('.'))); } string patch_path_str = relative_uri(base_uri, subject_node.to_string(), true); + if (parent && a_symbol) + patch_path_str = parent->child(*a_symbol).str(); + if (!Path::is_valid(patch_path_str)) { LOG(error) << "Patch has invalid path: " << patch_path_str << endl; return boost::optional<Raul::Path>(); @@ -472,7 +457,7 @@ Parser::parse_patch( /* Create patch nodes */ for (Objects::iterator i = patch_nodes.begin(); i != patch_nodes.end(); ++i) { - const Path node_path = Path(relative_uri(base_uri, i->first, true)); + const Path node_path = patch_path.child(relative_uri(base_uri, i->first, false)); Types::iterator type_i = types.find(i->first); if (type_i == types.end()) continue; @@ -489,7 +474,7 @@ Parser::parse_patch( Types::iterator type_i = types.find(i->first); if (type_i == types.end()) continue; - const Path node_path(relative_uri(base_uri, i->first, true)); + const Path node_path = patch_path.child(relative_uri(base_uri, i->first, false)); Resource::Properties props; props.insert(make_pair(uris.rdf_type, Raul::URI(uris.ingen_Node))); props.insert(make_pair(uris.rdf_instanceOf, Raul::URI(type_i->second))); @@ -520,7 +505,7 @@ Parser::parse_patch( if (p == node_ports.end()) p = node_ports.insert(make_pair(port_uri, Properties())).first; - const Path node_path(relative_uri(base_uri, node_uri, true)); + const Path node_path = patch_path.child(relative_uri(base_uri, node_uri, false)); const Symbol port_sym = port_uri.substr(node_uri.length() + 1); const Path port_path = node_path.child(port_sym); const string key = (*i)["key"].to_string(); @@ -528,7 +513,7 @@ Parser::parse_patch( } for (Objects::iterator i = node_ports.begin(); i != node_ports.end(); ++i) { - target->put(Raul::Path(relative_uri(base_uri, i->first, true)), i->second); + target->put(patch_path.child(relative_uri(base_uri, i->first, false)), i->second); } @@ -561,7 +546,7 @@ Parser::parse_patch( for (Results::iterator i = results.begin(); i != results.end(); ++i) { Glib::Mutex::Lock lock(world->rdf_world->mutex()); const string port_uri = (*i)["port"].to_string(); - const Path port_path(Path(relative_uri(base_uri, port_uri, true))); + const Path port_path = patch_path.child(relative_uri(base_uri, port_uri, false)); const string key = (*i)["key"].to_string(); Objects::iterator ports_i = patch_ports.find(port_uri); if (ports_i == patch_ports.end()) @@ -606,7 +591,7 @@ Parser::parse_patch( for (uint32_t index = 0; index < patch_ports.size(); ++index) { Objects::iterator i = ports_by_index[index]; Glib::Mutex::Lock lock(world->rdf_world->mutex()); - const Path port_path(relative_uri(base_uri, i->first, true)); + const Path port_path = patch_path.child(relative_uri(base_uri, i->first, false)); std::pair<Properties::iterator,Properties::iterator> types_range = i->second.equal_range(uris.rdf_type); if (types_range.first == i->second.end()) { @@ -639,7 +624,7 @@ Parser::parse_patch( } parse_properties(world, target, model, subject_node, patch_path, data); - parse_connections(world, target, model, subject_node, "/"); + parse_connections(world, target, model, subject_node, patch_path); /* Enable */ @@ -722,17 +707,13 @@ Parser::parse_connections( const Glib::ustring& base_uri = model.base_uri().to_string(); + std::cout << "PARSE CONNECTIONS " << subject << " : " << parent << endl; Redland::Query::Results results = query.run(*world->rdf_world, model); for (Redland::Query::Results::iterator i = results.begin(); i != results.end(); ++i) { Glib::Mutex::Lock lock(world->rdf_world->mutex()); - string src_path = parent.base() + relative_uri(base_uri, (*i)["src"].to_string(), false); - string dst_path = parent.base() + relative_uri(base_uri, (*i)["dst"].to_string(), false); - if (Path::is_valid(src_path) && Path::is_valid(dst_path)) { - target->connect(src_path, dst_path); - } else { - LOG(error) << "Invalid path in connection " - << src_path << " => " << dst_path << endl; - } + const Path src_path(parent.child(relative_uri(base_uri, (*i)["src"].to_string(), false))); + const Path dst_path(parent.child(relative_uri(base_uri, (*i)["dst"].to_string(), false))); + target->connect(src_path, dst_path); } return true; |