
Xc           @   s6   d  Z  d e f d     YZ d e f d     YZ d S(   sG   

$Author: murco $
$Id: jroproc_base.py 1 2012-11-12 18:56:07Z murco $
t   ProcessingUnitc           B   s   e  Z d  Z d Z g  Z d Z d Z e Z	 d   Z
 d   Z d   Z d   Z d   Z d   Z d d d  Z d   Z d	   Z d
   Z d   Z d   Z d   Z RS(   sU  
    Esta es la clase base para el procesamiento de datos.
    
    Contiene el metodo "call" para llamar operaciones. Las operaciones pueden ser:
        - Metodos internos (callMethod)
        - Objetos del tipo Operation (callObject). Antes de ser llamados, estos objetos
          tienen que ser agreagados con el metodo "add".
    
    c         C   s1   d  |  _ g  |  _ d  |  _ i  |  _ t |  _ d  S(   N(   t   Nonet   dataInt
   dataInListt   dataOutt   operations2RunDictt   Falset   isConfig(   t   self(    (    sK   /home/erick/workspace/schain_ebocanegra/schainpy/model/proc/jroproc_base.pyt   __init__   s
    				c         C   s   | |  j  | <| S(   s}  
        Agrega un objeto del tipo "Operation" (opObj) a la lista de objetos "self.objectList" y retorna el
        identificador asociado a este objeto. 
        
        Input:
        
            object    :    objeto de la clase "Operation"
        
        Return:
            
            objId    :    identificador del objeto, necesario para ejecutar la operacion
        (   R   (   R   t   opObjt   objId(    (    sK   /home/erick/workspace/schain_ebocanegra/schainpy/model/proc/jroproc_base.pyt   addOperation)   s    c         C   s$   | |  j  j   k r d  S|  j  | S(   N(   R   t   keysR   (   R   R   (    (    sK   /home/erick/workspace/schain_ebocanegra/schainpy/model/proc/jroproc_base.pyt   getOperationObj<   s    c         K   s
   t   d S(   s  
        Operacion directa sobre la data (dataOut.data). Es necesario actualizar los valores de los
        atributos del objeto dataOut
        
        Input:
        
            **kwargs    :    Diccionario de argumentos de la funcion a ejecutar
        N(   t   NotImplementedError(   R   t   kwargs(    (    sK   /home/erick/workspace/schain_ebocanegra/schainpy/model/proc/jroproc_base.pyt	   operationC   s    c         K   s   | d k r+ |  j    s> t |  j _ t Sn |  j j   r> t St |  |  } | |   |  j d k rj t S|  j j   r} t St S(   s,  
        Ejecuta el metodo con el nombre "name" y con argumentos **kwargs de la propia clase.
        
        Input:
            name        :    nombre del metodo a ejecutar
            
            **kwargs     :    diccionario con los nombres y valores de la funcion a ejecutar.
        
        t   runN(   t   checkInputst   TrueR   t
   flagNoDataR   t   isEmptyt   getattrR   (   R   t   nameR   t   methodToCall(    (    sK   /home/erick/workspace/schain_ebocanegra/schainpy/model/proc/jroproc_base.pyt
   callMethodP   s    
c         K   s7   |  j  j   r t S|  j | } | j |  j  |  t S(   s_  
        Ejecuta la operacion asociada al identificador del objeto "objId"
        
        Input:
            
            objId        :    identificador del objeto a ejecutar
            
            **kwargs    :    diccionario con los nombres y valores de la funcion a ejecutar.
        
        Return:
            
            None    
        (   R   R   R   R   R   R   (   R   R   R   t   externalProcObj(    (    sK   /home/erick/workspace/schain_ebocanegra/schainpy/model/proc/jroproc_base.pyt
   callObject   s
    c         K   s   | d k r3 | s t  d  n  |  j | |  } n | d k sW | d k sW | d k r | si t  d  n  | |  j j   k r t  d t |   n  |  j | |  } n t  d |  | S(	   s  
        Return True si ejecuta la operacion interna nombrada "opName" o la operacion externa
        identificada con el id "opId"; con los argumentos "**kwargs".
        
        False si la operacion no se ha ejecutado.
        
        Input:
        
            opType    :    Puede ser "self" o "external"
            
                Depende del tipo de operacion para llamar a:callMethod or callObject:
            
                1. If opType = "self": Llama a un metodo propio de esta clase:
                    
                        name_method = getattr(self, name)
                        name_method(**kwargs)
                    
                
                2. If opType = "other" o"external": Llama al metodo "run()" de una instancia de la
                   clase "Operation" o de un derivado de ella:
                
                        instanceName = self.operationList[opId]
                        instanceName.run(**kwargs)
            
            opName    : Si la operacion es interna (opType = 'self'), entonces el "opName" sera
                        usada para llamar a un metodo interno de la clase Processing
            
            opId    :    Si la operacion es externa (opType = 'other' o 'external), entonces el
                        "opId" sera usada para llamar al metodo "run" de la clase Operation
                        registrada anteriormente con ese Id
        
        Exception:
               Este objeto de tipo Operation debe de haber sido agregado antes con el metodo:
               "addOperation" e identificado con el valor "opId"  = el id de la operacion.
               De lo contrario retornara un error del tipo ValueError
            
        R   s"   opName parameter should be definedt   othert   externalt   plotters    opId parameter should be defineds'   Any operation with id=%s has been addeds>   opType should be 'self', 'external' or 'plotter'; and not '%s'(   t
   ValueErrorR   R   R   t   strR   (   R   t   opTypet   opNamet   opIdR   t   sts(    (    sK   /home/erick/workspace/schain_ebocanegra/schainpy/model/proc/jroproc_base.pyt   call   s    ($c         C   s   | |  _  |  j j |  d  S(   N(   R   R   t   append(   R   R   (    (    sK   /home/erick/workspace/schain_ebocanegra/schainpy/model/proc/jroproc_base.pyt   setInput   s    	c         C   s   |  j  S(   N(   R   (   R   (    (    sK   /home/erick/workspace/schain_ebocanegra/schainpy/model/proc/jroproc_base.pyt   getOutputObj   s    c         C   s(   x! |  j  D] } | j   r
 t Sq
 Wt S(   N(   R   R   R   R   (   R   t
   thisDataIn(    (    sK   /home/erick/workspace/schain_ebocanegra/schainpy/model/proc/jroproc_base.pyR      s    c         C   s
   t   d  S(   N(   R   (   R   (    (    sK   /home/erick/workspace/schain_ebocanegra/schainpy/model/proc/jroproc_base.pyt   setup   s    c         C   s
   t   d  S(   N(   R   (   R   (    (    sK   /home/erick/workspace/schain_ebocanegra/schainpy/model/proc/jroproc_base.pyR      s    c         C   s   d  S(   N(    (   R   (    (    sK   /home/erick/workspace/schain_ebocanegra/schainpy/model/proc/jroproc_base.pyt   close   s    N(   t   __name__t
   __module__t   __doc__R   R   R   R   R   R   R   R	   R   R   R   R   R   R&   R(   R)   R   R+   R   R,   (    (    (    sK   /home/erick/workspace/schain_ebocanegra/schainpy/model/proc/jroproc_base.pyR       s&   
					/	>						t	   Operationc           B   s>   e  Z d  Z d Z e Z d   Z d   Z d   Z	 d   Z
 RS(   so  
    Clase base para definir las operaciones adicionales que se pueden agregar a la clase ProcessingUnit
    y necesiten acumular informacion previa de los datos a procesar. De preferencia usar un buffer de
    acumulacion dentro de esta clase
    
    Ejemplo: Integraciones coherentes, necesita la informacion previa de los n perfiles anteriores (bufffer)
    
    c         C   s   d  |  _ t |  _ d  S(   N(   R   t   _Operation__bufferR   R   (   R   (    (    sK   /home/erick/workspace/schain_ebocanegra/schainpy/model/proc/jroproc_base.pyR	     s    	c         C   s   t  |  _ t  d  S(   N(   R   R   R   (   R   (    (    sK   /home/erick/workspace/schain_ebocanegra/schainpy/model/proc/jroproc_base.pyR+     s    	c         K   s#   |  j  s |  j |   n  t  d S(   sl  
        Realiza las operaciones necesarias sobre la dataIn.data y actualiza los
        atributos del objeto dataIn.
        
        Input:
        
            dataIn    :    objeto del tipo JROData
        
        Return:
            
            None
        
        Affected:
            __buffer    :    buffer de recepcion de datos.
            
        N(   R   R+   R   (   R   R   R   (    (    sK   /home/erick/workspace/schain_ebocanegra/schainpy/model/proc/jroproc_base.pyR     s    	c         C   s   d  S(   N(    (   R   (    (    sK   /home/erick/workspace/schain_ebocanegra/schainpy/model/proc/jroproc_base.pyR,   $  s    N(   R-   R.   R/   R   R1   R   R   R	   R+   R   R,   (    (    (    sK   /home/erick/workspace/schain_ebocanegra/schainpy/model/proc/jroproc_base.pyR0      s   				N(   R/   t   objectR    R0   (    (    (    sK   /home/erick/workspace/schain_ebocanegra/schainpy/model/proc/jroproc_base.pyt   <module>   s   