5884b70d752a3fc202a3b3e2342269e11c8381fb
[smartapi.git] / Common / Python / SmartAPI / common / NS.py
1 from SmartAPI.common.HttpClient import HttpClient
2 import urllib2, json
3 import traceback
4 import os
5
6
7 # prefix and URI pairs
8 prefixes = {}
9
10 def generatePrefixMapFromNSFields():
11     '''
12     copy hard-coded prefix-uri map provided in NS class.
13     '''                
14     prefixes['geo'] = "http://www.w3.org/2003/01/geo/wgs84_pos#"
15     prefixes['owl'] = "http://www.w3.org/2002/07/owl#"
16     prefixes['quantity'] = "http://data.nasa.gov/qudt/owl/quantity#"
17     prefixes['qudt'] = "http://data.nasa.gov/qudt/owl/qudt#"
18     prefixes['rdf'] = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
19     prefixes['rdfs'] = "http://www.w3.org/2000/01/rdf-schema#"
20     prefixes['smartapi'] = "http://smart-api.io/ontology/1.0/smartapi#"
21     prefixes['unit'] = "http://data.nasa.gov/qudt/owl/unit#"
22     prefixes['vcard'] = "http://www.w3.org/2006/vcard/ns#"
23     prefixes['xsd'] = "http://www.w3.org/2001/XMLSchema#"
24     prefixes['dc'] = "http://purl.org/dc/terms/"
25     prefixes['gr'] = "http://purl.org/goodrelations/v1#"
26     
27     print 'prefix map has been initialized. \n'
28
29 class NS(object):       
30     customOntologyPrefix = "http://smart-api.io/ontology/"
31     
32     # initialize prefixes map only once
33     generatePrefixMapFromNSFields()
34                 
35     # namespaces
36     GEO = prefixes['geo']
37     OWL = prefixes['owl']
38     QUANTITY = prefixes['quantity']
39     QUDT = prefixes['qudt']
40     RDF = prefixes['rdf']
41     RDFS = prefixes['rdfs']
42     SMARTAPI = prefixes['smartapi']
43     UNIT = prefixes['unit']
44     VCARD = prefixes['vcard']
45     XSD = prefixes['xsd']
46     DC = prefixes['dc']    
47     GR = prefixes['gr']
48               
49     @classmethod
50     def toAbsoluteUri(cls, uri):
51         from SmartAPI.rdf.Variant import Variant
52         '''
53         If the uri uses a valid prefix, then this function can translate the prefix to URI string.
54         This is the main API
55         '''
56         
57         try:
58             if isinstance(uri, Variant):
59                 return uri
60             #  if already absolute uri, return it
61             if '://' in uri:
62                 return uri
63             # if uri is prefixed 
64             if ':' in uri:
65                 parts = uri.split(':')
66                 prefixUri = cls.prefixToUri(parts[0])
67                 if prefixUri is None:
68                     print 'Prefix: ', parts[0], ' not recognized. Will continue assuming it is a custom Smart API ontology.'
69                     # assume this is a custom smart api ontology prefix and use standard replace method and add to prefix mappings                    
70                     cls.addPrefixMapping(parts[0], cls.generateAbsoluteCustomOntologyUri(parts[0], ''))
71                     prefixUri = cls.prefixToUri(parts[0].lower())
72                     
73                 # prefix replaced successfully
74                 return prefixUri + parts[1]
75             else:
76                 # uri is not absolute but also not prefix, nothing can do 
77                 return uri
78         except:
79             print 'Error, illegal URI format: ', uri
80             traceback.print_exc()
81             return uri
82
83     @classmethod
84     def prefixToUri(cls, prefix):
85         '''
86         Return uri string that the given prefix represents. If not found, return None.
87         '''             
88         prefix = prefix.lower()
89         if prefix in prefixes:
90             return prefixes[prefix]
91         return None
92     
93     
94     # http://smart-api.io/ontology/1.0/smartapi#Activity -> smartapi:Activity
95     @classmethod
96     def prefix(cls, uri):
97         if  uri is None:
98             return None
99         for p in prefixes:
100             if prefixes[p] in uri:
101                 return uri.replace(prefixes[p], p + ':')
102         return uri
103     
104     # smartapi:Activity -> Activity
105     # Method assumes that the given str is already prefixed, not absolute
106     @classmethod
107     def removePrefix(cls, uri):
108         if uri is None:
109             return None
110         elif ':' in uri and not 'http://' in uri:
111             return uri[uri.index(':') + 1:]
112
113     # http://smart-api.io/ontology/1.0/smartapi#Activity -> Activity
114     @classmethod
115     def localName(cls, uri):
116         return NS().removePrefix(NS().prefix(uri))
117     
118     @classmethod
119     def generateAbsoluteCustomOntologyUri(cls, prefix, suffix):
120         return cls.customOntologyPrefix + prefix + "#" + suffix
121     
122     @classmethod
123     def addPrefixMapping(cls, prefix, uri):
124         prefixes[prefix.lower()] = uri
125