def __init__(self, systemConstructor):

        self._service_metadata = systemConstructor['service_metadata']
        self._services = systemConstructor['services']
        self._object_metadata = systemConstructor['object_metadata']
        self._objects = systemConstructor['objects']

        self._baseObject = None

        self._defaultResources = {
            'SmartObject': ['Description', 'Agent'],
            'ObservableProperty': ['Description', 'Observers']
        }

        self._observerTypes = [
            'subscribesTo', 'publishesTo', 'bridgesTo', 'handledBy'
        ]

        self._observerSchemes = ['http', 'coap', 'mqtt', 'handler']

        self._mqttObserverTemplate = {
            'resourceName': 'mqttObserver',
            'resourceClass': 'mqttObserver',
            'connection': 'localhost',
            'pubTopic': '',
            'subTopic': '',
            'keepAlive': 60,
            'QoS': 0
        }

        self._httpPublisherTemplate = {
            'resourceName': 'httpPublisher',
            'resourceClass': 'httpPublisher',
            'targetURI': 'http://localhost:8000/',
            'username': '******',
            'password': '******'
        }

        self._httpSubscriberTemplate = {
            'resourceName': 'httpSubscriber',
            'resourceClass': 'httpSubscriber',
            'ObserverURI': 'http://localhost:8000/',
        }

        self._coapPublisherTemplate = {
            'resourceName': 'coapPublisher',
            'resourceClass': 'coapPublisher',
            'targetURI': 'coap://localhost:5683/'
        }

        self._coapSubscriberTemplate = {
            'resourceName': 'coapSubscriber',
            'resourceClass': 'coapSubscriber',
            'ObserverURI': 'coap://localhost:5683/'
        }

        self._callbackNotifierTemplate = {
            'resourceName': 'callbackNotifier',
            'resourceClass': 'callbackNotifier',
            'handlerURI': 'handler://'
        }
        '''
        make objects from object models first
        make list sorted by path element count + length for import from graph, 
        could count a split list but this should be the same if we eat slashes somewhere
        having the root object called '/' and '/' as the separator is extra work 
        '''
        self._resourceList = sorted(self._objects.keys(),
                                    key=lambda s: s.count('/'))
        self._resourceList = sorted(self._resourceList, key=lambda s: len(s))
        for self._resourceLink in self._resourceList:
            self._resourceDescriptor = self._objects[self._resourceLink]
            # see if base object needs to be created.
            if self._resourceLink is '/' and self._resourceDescriptor[
                    'resourceClass'] is 'SmartObject' and self._baseObject is None:
                self._newResource = SmartObject()
                self._baseObject = self._newResource
            else:
                self._parentLink = '/'.join(self._resourceLink.split('/')[:-1])
                if self._parentLink == '': self._parentLink = '/'
                self._parentObject = self._objectFromPath(
                    self._parentLink, self._baseObject)
                self._newResource = self._parentObject.create(
                    self._resourceDescriptor)
            if self._resourceDescriptor[
                    'resourceClass'] in self._defaultResources:
                for self._defaultResource in self._defaultResources[
                        self._resourceDescriptor['resourceClass']]:
                    self._newChildResource = self._newResource.create({
                        'resourceName':
                        self._defaultResource,
                        'resourceClass':
                        self._defaultResource
                    })
                    if self._defaultResource is 'Description':
                        self._newChildResource.create(
                            self._graphFromModel(self._resourceLink,
                                                 self._resourceDescriptor))
                        self._newResource.create({'resourceName':'.well-known', 'resourceClass':'Agent'})\
                        .create({'resourceName':'core', 'resourceClass':'LinkFormatProxy'})
                        # FIXME need to aggregate graphs upstream
            # make observers from the list of URIs of each Observer type
            for self._resourceProperty in self._resourceDescriptor:
                if self._resourceProperty in self._observerTypes:
                    for self._observerURI in self._resourceDescriptor[
                            self._resourceProperty]:
                        self._observerFromURI(self._newResource,
                                              self._resourceProperty,
                                              self._observerURI)
        '''
        make services
        '''
        # make this a service Object (RESTfulResource) with dict as constructor
        self._serviceRegistry = self._objectFromPath('/services',
                                                     self._baseObject)
        self._serviceDescription = self._objectFromPath(
            '/services/Description', self._baseObject)

        for self._serviceName in self._services:
            self._newService = ServiceObject(self._serviceName,
                                             self._services[self._serviceName],
                                             self._baseObject)
            self._serviceRegistry.resources.update(
                {self._serviceName: self._newService})
            self._serviceDescription.set(
                self._graphFromModel(self._serviceName,
                                     self._services[self._serviceName]))
Пример #2
0
    def __init__(self, systemConstructor):
        
        self._service_metadata = systemConstructor['service_metadata']
        self._services = systemConstructor['services']
        self._object_metadata = systemConstructor['object_metadata']
        self._objects = systemConstructor['objects']
        
        self._baseObject = None
        
        self._defaultResources = {
                                  'SmartObject': ['Description', 'Agent'],
                                  'ObservableProperty': ['Description', 'Observers']
                                  }

        self._observerTypes = ['subscribesTo', 'publishesTo', 'bridgesTo', 'handledBy']
        
        self._observerSchemes = ['http', 'coap', 'mqtt', 'handler']

        self._mqttObserverTemplate = {
                                      'resourceName': 'mqttObserver',
                                      'resourceClass': 'mqttObserver',
                                      'connection': 'localhost',
                                      'pubTopic': '',
                                      'subTopic': '',
                                      'keepAlive': 60,
                                      'QoS': 0
                                      }
        
        self._httpPublisherTemplate = {
                                       'resourceName': 'httpPublisher',
                                       'resourceClass': 'httpPublisher',
                                       'targetURI': 'http://localhost:8000/',
                                       'username': '******',
                                       'password': '******'
                                       }
        
        self._httpSubscriberTemplate = {
                                        'resourceName': 'httpSubscriber',
                                        'resourceClass': 'httpSubscriber',
                                        'ObserverURI': 'http://localhost:8000/',
                                        }
        
        self._coapPublisherTemplate = {
                                       'resourceName': 'coapPublisher',
                                       'resourceClass': 'coapPublisher',
                                       'targetURI': 'coap://localhost:5683/'
                                       }
        
        self._coapSubscriberTemplate = {
                                        'resourceName': 'coapSubscriber',
                                        'resourceClass': 'coapSubscriber',
                                        'ObserverURI': 'coap://localhost:5683/'
                                        }

        self._callbackNotifierTemplate = {
                                          'resourceName': 'callbackNotifier',
                                          'resourceClass': 'callbackNotifier',
                                          'handlerURI': 'handler://'
                                          }

        '''
        make objects from object models first
        make list sorted by path element count + length for import from graph, 
        could count a split list but this should be the same if we eat slashes somewhere
        having the root object called '/' and '/' as the separator is extra work 
        '''
        self._resourceList = sorted( self._objects.keys(), key=lambda s:s.count('/') )
        self._resourceList = sorted( self._resourceList, key=lambda s:len(s))
        for self._resourceLink in self._resourceList:
            self._resourceDescriptor = self._objects[self._resourceLink]
            # see if base object needs to be created. 
            if self._resourceLink is '/' and self._resourceDescriptor['resourceClass'] is 'SmartObject' and self._baseObject is None:
                self._newResource = SmartObject()
                self._baseObject = self._newResource
            else:
                self._parentLink = '/'.join(self._resourceLink.split('/')[:-1])
                if self._parentLink == '': self._parentLink = '/'
                self._parentObject = self._objectFromPath(self._parentLink, self._baseObject)
                self._newResource = self._parentObject.create( self._resourceDescriptor)
            if self._resourceDescriptor['resourceClass'] in self._defaultResources:
                for self._defaultResource in self._defaultResources[self._resourceDescriptor['resourceClass']]:
                    self._newChildResource = self._newResource.create({
                                        'resourceName': self._defaultResource,
                                        'resourceClass': self._defaultResource
                                        })
                    if self._defaultResource is 'Description': 
                        self._newChildResource.create(self._graphFromModel(self._resourceLink, self._resourceDescriptor))
                        self._newResource.create({'resourceName':'.well-known', 'resourceClass':'Agent'})\
                        .create({'resourceName':'core', 'resourceClass':'LinkFormatProxy'})
                        # FIXME need to aggregate graphs upstream
            # make observers from the list of URIs of each Observer type
            for self._resourceProperty in self._resourceDescriptor:
                if self._resourceProperty in self._observerTypes:
                    for self._observerURI in self._resourceDescriptor[self._resourceProperty]:
                        self._observerFromURI(self._newResource, self._resourceProperty, self._observerURI )
        '''
        make services
        '''
        # make this a service Object (RESTfulResource) with dict as constructor
        self._serviceRegistry = self._objectFromPath('/services', self._baseObject)
        self._serviceDescription = self._objectFromPath('/services/Description', self._baseObject)        
    
        for self._serviceName in self._services:
            self._newService = ServiceObject(self._serviceName, self._services[self._serviceName], self._baseObject)
            self._serviceRegistry.resources.update({self._serviceName:self._newService})
            self._serviceDescription.set(self._graphFromModel(self._serviceName, self._services[self._serviceName]))
class SystemInstance(object):
    '''
    creates service instances and object instances from dictionary constructors
    {
    'service_metadata': {},
    'services': {},
    'object_metadata': {},
    'objects': {}
    }
    '''
    def __init__(self, systemConstructor):

        self._service_metadata = systemConstructor['service_metadata']
        self._services = systemConstructor['services']
        self._object_metadata = systemConstructor['object_metadata']
        self._objects = systemConstructor['objects']

        self._baseObject = None

        self._defaultResources = {
            'SmartObject': ['Description', 'Agent'],
            'ObservableProperty': ['Description', 'Observers']
        }

        self._observerTypes = [
            'subscribesTo', 'publishesTo', 'bridgesTo', 'handledBy'
        ]

        self._observerSchemes = ['http', 'coap', 'mqtt', 'handler']

        self._mqttObserverTemplate = {
            'resourceName': 'mqttObserver',
            'resourceClass': 'mqttObserver',
            'connection': 'localhost',
            'pubTopic': '',
            'subTopic': '',
            'keepAlive': 60,
            'QoS': 0
        }

        self._httpPublisherTemplate = {
            'resourceName': 'httpPublisher',
            'resourceClass': 'httpPublisher',
            'targetURI': 'http://localhost:8000/',
            'username': '******',
            'password': '******'
        }

        self._httpSubscriberTemplate = {
            'resourceName': 'httpSubscriber',
            'resourceClass': 'httpSubscriber',
            'ObserverURI': 'http://localhost:8000/',
        }

        self._coapPublisherTemplate = {
            'resourceName': 'coapPublisher',
            'resourceClass': 'coapPublisher',
            'targetURI': 'coap://localhost:5683/'
        }

        self._coapSubscriberTemplate = {
            'resourceName': 'coapSubscriber',
            'resourceClass': 'coapSubscriber',
            'ObserverURI': 'coap://localhost:5683/'
        }

        self._callbackNotifierTemplate = {
            'resourceName': 'callbackNotifier',
            'resourceClass': 'callbackNotifier',
            'handlerURI': 'handler://'
        }
        '''
        make objects from object models first
        make list sorted by path element count + length for import from graph, 
        could count a split list but this should be the same if we eat slashes somewhere
        having the root object called '/' and '/' as the separator is extra work 
        '''
        self._resourceList = sorted(self._objects.keys(),
                                    key=lambda s: s.count('/'))
        self._resourceList = sorted(self._resourceList, key=lambda s: len(s))
        for self._resourceLink in self._resourceList:
            self._resourceDescriptor = self._objects[self._resourceLink]
            # see if base object needs to be created.
            if self._resourceLink is '/' and self._resourceDescriptor[
                    'resourceClass'] is 'SmartObject' and self._baseObject is None:
                self._newResource = SmartObject()
                self._baseObject = self._newResource
            else:
                self._parentLink = '/'.join(self._resourceLink.split('/')[:-1])
                if self._parentLink == '': self._parentLink = '/'
                self._parentObject = self._objectFromPath(
                    self._parentLink, self._baseObject)
                self._newResource = self._parentObject.create(
                    self._resourceDescriptor)
            if self._resourceDescriptor[
                    'resourceClass'] in self._defaultResources:
                for self._defaultResource in self._defaultResources[
                        self._resourceDescriptor['resourceClass']]:
                    self._newChildResource = self._newResource.create({
                        'resourceName':
                        self._defaultResource,
                        'resourceClass':
                        self._defaultResource
                    })
                    if self._defaultResource is 'Description':
                        self._newChildResource.create(
                            self._graphFromModel(self._resourceLink,
                                                 self._resourceDescriptor))
                        self._newResource.create({'resourceName':'.well-known', 'resourceClass':'Agent'})\
                        .create({'resourceName':'core', 'resourceClass':'LinkFormatProxy'})
                        # FIXME need to aggregate graphs upstream
            # make observers from the list of URIs of each Observer type
            for self._resourceProperty in self._resourceDescriptor:
                if self._resourceProperty in self._observerTypes:
                    for self._observerURI in self._resourceDescriptor[
                            self._resourceProperty]:
                        self._observerFromURI(self._newResource,
                                              self._resourceProperty,
                                              self._observerURI)
        '''
        make services
        '''
        # make this a service Object (RESTfulResource) with dict as constructor
        self._serviceRegistry = self._objectFromPath('/services',
                                                     self._baseObject)
        self._serviceDescription = self._objectFromPath(
            '/services/Description', self._baseObject)

        for self._serviceName in self._services:
            self._newService = ServiceObject(self._serviceName,
                                             self._services[self._serviceName],
                                             self._baseObject)
            self._serviceRegistry.resources.update(
                {self._serviceName: self._newService})
            self._serviceDescription.set(
                self._graphFromModel(self._serviceName,
                                     self._services[self._serviceName]))

    def _graphFromModel(self, link, meta):
        # make rdf-json from the model and return RDF graph for loading into Description
        g = rdflib.Graph()
        subject = URIRef(link)
        for relation in meta:
            value = meta[relation]
            g.add((subject, Literal(relation), Literal(value)))
        return g

    def _observerFromURI(self, currentResource, observerType, observerURI):
        # split by scheme
        URIObject = urlparse(observerURI)
        # fill in constructor template
        if URIObject.scheme == 'http':
            if observerType is 'publishesTo':
                resourceConstructor = self._httpPublisherTemplate.copy()
                resourceConstructor['targetURI'] = observerURI
            if observerType is 'subscribesTo':
                resourceConstructor = self._httpSubscriberTemplate.copy()
                resourceConstructor['observerURI'] = observerURI

        elif URIObject.scheme == 'coap':
            if observerType is 'publishesTo':
                resourceConstructor = self._coapPublisherTemplate.copy()
                resourceConstructor['targetURI'] = observerURI
            if observerType is 'subscribesTo':
                resourceConstructor = self._coapSubscriberTemplate.copy()
                resourceConstructor['observerURI'] = observerURI

        elif URIObject.scheme == 'mqtt':
            resourceConstructor = self._mqttObserverTemplate.copy()
            resourceConstructor['connection'] = URIObject.netloc
            if observerType is 'publishesTo':
                resourceConstructor['pubTopic'] = URIObject.path
            if observerType is 'subscribesTo':
                resourceConstructor['subTopic'] = URIObject.path
            if observerType is 'bridgesTo':
                resourceConstructor['pubTopic'] = URIObject.path
                resourceConstructor['subTopic'] = URIObject.path

        elif URIObject.scheme == 'handler':
            resourceConstructor = self._callbackNotifierTemplate.copy()
            resourceConstructor['handlerURI'] = observerURI

        else:
            print 'no scheme', URIObject.scheme
            return

        #create resource in currentResource.resources['Observers'] container
        newObserver = currentResource.resources['Observers'].create(
            resourceConstructor)

    def _objectFromPath(self, path, baseObject):
        # fails if resource doesn't exist
        currentObject = baseObject
        pathList = path.split('/')[1:]
        for pathElement in pathList:
            if len(pathElement) > 0:
                currentObject = currentObject.resources[pathElement]
        return currentObject
Пример #4
0
class SystemInstance(object):
    '''
    creates service instances and object instances from dictionary constructors
    {
    'service_metadata': {},
    'services': {},
    'object_metadata': {},
    'objects': {}
    }
    '''
    def __init__(self, systemConstructor):
        
        self._service_metadata = systemConstructor['service_metadata']
        self._services = systemConstructor['services']
        self._object_metadata = systemConstructor['object_metadata']
        self._objects = systemConstructor['objects']
        
        self._baseObject = None
        
        self._defaultResources = {
                                  'SmartObject': ['Description', 'Agent'],
                                  'ObservableProperty': ['Description', 'Observers']
                                  }

        self._observerTypes = ['subscribesTo', 'publishesTo', 'bridgesTo', 'handledBy']
        
        self._observerSchemes = ['http', 'coap', 'mqtt', 'handler']

        self._mqttObserverTemplate = {
                                      'resourceName': 'mqttObserver',
                                      'resourceClass': 'mqttObserver',
                                      'connection': 'localhost',
                                      'pubTopic': '',
                                      'subTopic': '',
                                      'keepAlive': 60,
                                      'QoS': 0
                                      }
        
        self._httpPublisherTemplate = {
                                       'resourceName': 'httpPublisher',
                                       'resourceClass': 'httpPublisher',
                                       'targetURI': 'http://localhost:8000/',
                                       'username': '******',
                                       'password': '******'
                                       }
        
        self._httpSubscriberTemplate = {
                                        'resourceName': 'httpSubscriber',
                                        'resourceClass': 'httpSubscriber',
                                        'ObserverURI': 'http://localhost:8000/',
                                        }
        
        self._coapPublisherTemplate = {
                                       'resourceName': 'coapPublisher',
                                       'resourceClass': 'coapPublisher',
                                       'targetURI': 'coap://localhost:5683/'
                                       }
        
        self._coapSubscriberTemplate = {
                                        'resourceName': 'coapSubscriber',
                                        'resourceClass': 'coapSubscriber',
                                        'ObserverURI': 'coap://localhost:5683/'
                                        }

        self._callbackNotifierTemplate = {
                                          'resourceName': 'callbackNotifier',
                                          'resourceClass': 'callbackNotifier',
                                          'handlerURI': 'handler://'
                                          }

        '''
        make objects from object models first
        make list sorted by path element count + length for import from graph, 
        could count a split list but this should be the same if we eat slashes somewhere
        having the root object called '/' and '/' as the separator is extra work 
        '''
        self._resourceList = sorted( self._objects.keys(), key=lambda s:s.count('/') )
        self._resourceList = sorted( self._resourceList, key=lambda s:len(s))
        for self._resourceLink in self._resourceList:
            self._resourceDescriptor = self._objects[self._resourceLink]
            # see if base object needs to be created. 
            if self._resourceLink is '/' and self._resourceDescriptor['resourceClass'] is 'SmartObject' and self._baseObject is None:
                self._newResource = SmartObject()
                self._baseObject = self._newResource
            else:
                self._parentLink = '/'.join(self._resourceLink.split('/')[:-1])
                if self._parentLink == '': self._parentLink = '/'
                self._parentObject = self._objectFromPath(self._parentLink, self._baseObject)
                self._newResource = self._parentObject.create( self._resourceDescriptor)
            if self._resourceDescriptor['resourceClass'] in self._defaultResources:
                for self._defaultResource in self._defaultResources[self._resourceDescriptor['resourceClass']]:
                    self._newChildResource = self._newResource.create({
                                        'resourceName': self._defaultResource,
                                        'resourceClass': self._defaultResource
                                        })
                    if self._defaultResource is 'Description': 
                        self._newChildResource.create(self._graphFromModel(self._resourceLink, self._resourceDescriptor))
                        self._newResource.create({'resourceName':'.well-known', 'resourceClass':'Agent'})\
                        .create({'resourceName':'core', 'resourceClass':'LinkFormatProxy'})
                        # FIXME need to aggregate graphs upstream
            # make observers from the list of URIs of each Observer type
            for self._resourceProperty in self._resourceDescriptor:
                if self._resourceProperty in self._observerTypes:
                    for self._observerURI in self._resourceDescriptor[self._resourceProperty]:
                        self._observerFromURI(self._newResource, self._resourceProperty, self._observerURI )
        '''
        make services
        '''
        # make this a service Object (RESTfulResource) with dict as constructor
        self._serviceRegistry = self._objectFromPath('/services', self._baseObject)
        self._serviceDescription = self._objectFromPath('/services/Description', self._baseObject)        
    
        for self._serviceName in self._services:
            self._newService = ServiceObject(self._serviceName, self._services[self._serviceName], self._baseObject)
            self._serviceRegistry.resources.update({self._serviceName:self._newService})
            self._serviceDescription.set(self._graphFromModel(self._serviceName, self._services[self._serviceName]))

                
    def _graphFromModel(self, link, meta):
        # make rdf-json from the model and return RDF graph for loading into Description
        g=rdflib.Graph()
        subject=URIRef(link)
        for relation in meta:
            value = meta[relation]
            g.add((subject, Literal(relation), Literal(value)))
        return g

    def _observerFromURI(self, currentResource, observerType, observerURI):
        # split by scheme
        URIObject=urlparse(observerURI)
        # fill in constructor template
        if URIObject.scheme == 'http':
            if observerType is 'publishesTo':
                resourceConstructor = self._httpPublisherTemplate.copy()
                resourceConstructor['targetURI'] = observerURI
            if observerType is 'subscribesTo':
                resourceConstructor = self._httpSubscriberTemplate.copy()
                resourceConstructor['observerURI'] = observerURI
    
        elif URIObject.scheme == 'coap':
            if observerType is 'publishesTo':
                resourceConstructor = self._coapPublisherTemplate.copy()
                resourceConstructor['targetURI'] = observerURI
            if observerType is 'subscribesTo':
                resourceConstructor = self._coapSubscriberTemplate.copy()
                resourceConstructor['observerURI'] = observerURI
    
        elif URIObject.scheme == 'mqtt':
            resourceConstructor = self._mqttObserverTemplate.copy() 
            resourceConstructor['connection'] = URIObject.netloc
            if observerType is 'publishesTo':
                resourceConstructor['pubTopic'] = URIObject.path
            if observerType is 'subscribesTo':
                resourceConstructor['subTopic'] = URIObject.path
            if observerType is 'bridgesTo':
                resourceConstructor['pubTopic'] = URIObject.path
                resourceConstructor['subTopic'] = URIObject.path

        elif URIObject.scheme == 'handler':
            resourceConstructor = self._callbackNotifierTemplate.copy()   
            resourceConstructor['handlerURI'] = observerURI
            
        else:
            print 'no scheme', URIObject.scheme
            return
            
        #create resource in currentResource.resources['Observers'] container  
        newObserver = currentResource.resources['Observers'].create(resourceConstructor) 

    def _objectFromPath(self, path, baseObject):
    # fails if resource doesn't exist
        currentObject=baseObject
        pathList = path.split('/')[1:]
        for pathElement in pathList:
            if len(pathElement) > 0:
                currentObject=currentObject.resources[pathElement]
        return currentObject