#!/usr/bin/python
#
# SimpleRDF.py - Simple RDF API for Python
#

import RDF, Vocabulary
import os

debug = 0
def debug(on):
    global debug
    debug = on
    
extensions = { "n3" : "ntriples" ,
               "rdf" : "rdfxml" ,
               "ttl" : "turtle"
             }

class Resource:

    def __init__(self, model, node):
        self.model = model
        self.node = node

    def hasproperty(self, property, value = None):
        qs = RDF.Statement( subject = self.node,
                            predicate =  property,
                            object = value )
        return self.model.contain_statement(qs)

    def getproperty(self, property):
        qs = RDF.Statement( subject = self.node,
                            predicate =  property,
                            object = None )
        for statement in self.model.find_statements(qs):
            return statement.object

    def listproperties(self, property = None):
        qs = RDF.Statement( subject = self.node,
                            predicate =  property,
                            object = None )
        return self.model.find_statements(qs)

def from_rdf_list(model, node):
    list = []

    res = Resource(model, node)

    while res:
        first = res.getproperty(Vocabulary.RDF.first)
        rest = res.getproperty(Vocabulary.RDF.rest)
        
        if first: list.append(first)
        if rest:
            if rest == Vocabulary.RDF.nil:
                break
            else:
                res = Resource(model, rest)
    
    return list

def load_model(file):

  if debug:    
      print "load_model('%s')" % str(file)

  global extensions  

  ext = os.path.splitext(file)[1][1:]

  if not extensions.has_key(ext):
    raise "load_model(): invalid file extension (%s)" % str(ext)

  if file.find("file:") == 0:
    file = file[5:]
 
  uri = RDF.Uri(string="file:"+file)

  parser = RDF.Parser(name=extensions[ext])

  model = RDF.Model()
  
  parser.parse_into_model(model, uri) #, "file:" + file.replace("\\", "/"))

  return model

def load_model_from_string(contents):

    parser = RDF.Parser(name = "rdfxml")

    model = RDF.Model()

    parser.parse_string_into_model(model, contents, "file:")

    return model
