Example #1
0
class AEntitySource(Greenlet, IASyncProducer):
    """
        Simple asynchronous entity producer
    """
    
    def __init__(self, name, types, maxQueueSize=None):
        Greenlet.__init__(self)
        
        self._name = name
        self._id = EntitySources.getSourceID(name)
        
        self._output = Queue(maxQueueSize)
        self._started = False
        self._maxQueueSize = maxQueueSize
        
        self.subcategories = types
        self.categories = set()
        
        # validate the types
        for t in types:
            if not t in Constants.subcategories:
                raise AttributeError("Source subcategory '%s' not supported" % t)
            
            self.categories.add(Entity.mapSubcategoryToCategory(t))
    
    def get(self, block=True, timeout=None):
        return self._output.get(block, timeout)
    
    def get_nowait(self):
        return self._output.get_nowait()
    
    def empty(self):
        return self._output.empty()
    
    def next(self):
        return self._output.next()
    
    def startProducing(self):
        if not self._started:
            self._started = True
            self.start()
    
    @abstract
    def _run(self):
        """Subclasses should override to process the pull-based loop in the 
        context of this sink's Greenlet."""
        pass
        #utils.log("")
        #utils.log("Importing entities from source '%s'" % self.name)
        #utils.log("")
    
    @property
    def name(self): return self._name
    
    @property
    def maxQueueSize(self): return self._maxQueueSize
    
    @abstract
    def getMaxNumEntities(self):
        raise NotImplementedError
    
    def __str__(self):
        return self.name