Python: remove unnecessary prefix map printout
[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
28 class NS(object):
29     customOntologyPrefix = "http://smart-api.io/ontology/"
30     
31     # initialize prefixes map only once
32     generatePrefixMapFromNSFields()
33                 
34     # namespaces
35     GEO = prefixes['geo']
36     OWL = prefixes['owl']
37     QUANTITY = prefixes['quantity']
38     QUDT = prefixes['qudt']
39     RDF = prefixes['rdf']
40     RDFS = prefixes['rdfs']
41     SMARTAPI = prefixes['smartapi']
42     UNIT = prefixes['unit']
43     VCARD = prefixes['vcard']
44     XSD = prefixes['xsd']
45     DC = prefixes['dc']    
46     GR = prefixes['gr']
47     
48     @classmethod
49     def toAbsoluteUri(cls, uri):
50         from SmartAPI.rdf.Variant import Variant
51         '''
52         If the uri uses a valid prefix, then this function can translate the prefix to URI string.
53         This is the main API
54         '''
55         
56         try:
57             if isinstance(uri, Variant):
58                 return uri
59             #  if already absolute uri, return it
60             if '://' in uri:
61                 return uri
62             # if uri is prefixed 
63             if ':' in uri:
64                 parts = uri.split(':')
65                 prefixUri = cls.prefixToUri(parts[0])
66                 if prefixUri is None:
67                     print 'Prefix: ', parts[0], ' not recognized. Will continue assuming it is a custom Smart API ontology.'
68                     # assume this is a custom smart api ontology prefix and use standard replace method and add to prefix mappings                    
69                     cls.addPrefixMapping(parts[0], cls.generateAbsoluteCustomOntologyUri(parts[0], ''))
70                     prefixUri = cls.prefixToUri(parts[0].lower())
71                     
72                 # prefix replaced successfully
73                 return prefixUri + parts[1]
74             else:
75                 # uri is not absolute but also not prefix, nothing can do 
76                 return uri
77         except:
78             print 'Error, illegal URI format: ', uri
79             traceback.print_exc()
80             return uri
81
82     @classmethod
83     def prefixToUri(cls, prefix):
84         '''
85         Return uri string that the given prefix represents. If not found, return None.
86         '''
87         prefix = prefix.lower()
88         if prefix in prefixes:
89             return prefixes[prefix]
90         return None
91     
92     
93     # http://smart-api.io/ontology/1.0/smartapi#Activity -> smartapi:Activity
94     @classmethod
95     def prefix(cls, uri):
96         if  uri is None:
97             return None
98         for p in prefixes:
99             if prefixes[p] in uri:
100                 return uri.replace(prefixes[p], p + ':')
101         return uri
102     
103     # smartapi:Activity -> Activity
104     # Method assumes that the given str is already prefixed, not absolute
105     @classmethod
106     def removePrefix(cls, uri):
107         if uri is None:
108             return None
109         elif ':' in uri and not 'http://' in uri:
110             return uri[uri.index(':') + 1:]
111
112     # http://smart-api.io/ontology/1.0/smartapi#Activity -> Activity
113     @classmethod
114     def localName(cls, uri):
115         return NS().removePrefix(NS().prefix(uri))
116     
117     @classmethod
118     def generateAbsoluteCustomOntologyUri(cls, prefix, suffix):
119         return cls.customOntologyPrefix + prefix + "#" + suffix
120     
121     @classmethod
122     def addPrefixMapping(cls, prefix, uri):
123         prefixes[prefix.lower()] = uri
124