@@ -584,6 +584,115 @@ class AddDeviceContextAndTagsPipe(EventProcessorPipe):
584584 ),
585585 }
586586
587+ def __call__ (self , eventContext ):
588+ actor = eventContext .event .actor
589+
590+ # Set identifier and title based on resolved object
591+ element = self ._findTypeIdAndElement (
592+ actor ,
593+ EventField .Actor .ELEMENT_TYPE_ID ,
594+ EventField .Actor .ELEMENT_UUID ,
595+ )
596+ self ._applyElementToActor (actor , element .value )
597+
598+ sub_element = self ._findTypeIdAndElement (
599+ actor ,
600+ EventField .Actor .ELEMENT_SUB_TYPE_ID ,
601+ EventField .Actor .ELEMENT_SUB_UUID ,
602+ )
603+ self ._applySubElementToActor (actor , sub_element .value )
604+
605+ device = eventContext .deviceObject
606+ if device is None :
607+ device = self ._selectByTypeId (DEVICE , element , sub_element )
608+ if device is not None :
609+ self ._applyDeviceToEventContext (device , eventContext )
610+
611+ component = eventContext .componentObject
612+ if component is None :
613+ component = self ._selectByTypeId (COMPONENT , element , sub_element )
614+ if component is not None :
615+ self ._applyComponentToEventContext (component , eventContext )
616+
617+ return eventContext
618+
619+ def _findTypeIdAndElement (self , actor , type_id_field , uuid_field ):
620+ type_id = None
621+ element = None
622+ if actor .HasField (type_id_field ):
623+ type_id = getattr (actor , type_id_field )
624+ if actor .HasField (uuid_field ):
625+ element = self ._manager .getElementByUuid (
626+ getattr (actor , uuid_field )
627+ )
628+ return _Element (type_id , element )
629+
630+ def _applyElementToActor (self , actor , element ):
631+ if not element :
632+ return
633+ actor .element_identifier = element .id
634+ elementTitle = element .titleOrId ()
635+ if elementTitle != actor .element_identifier :
636+ try :
637+ actor .element_title = elementTitle
638+ except ValueError :
639+ actor .element_title = elementTitle .decode ("utf8" )
640+
641+ def _applySubElementToActor (self , actor , sub_element ):
642+ if not sub_element :
643+ return
644+ actor .element_sub_identifier = sub_element .id
645+ subElementTitle = sub_element .titleOrId ()
646+ if subElementTitle != actor .element_sub_identifier :
647+ try :
648+ actor .element_sub_title = subElementTitle
649+ except ValueError :
650+ actor .element_sub_title = subElementTitle .decode ("utf8" )
651+
652+ def _selectByTypeId (self , typeid , element , sub_element ):
653+ if element .typeid == typeid :
654+ return element .value
655+ elif sub_element .typeid == typeid :
656+ return sub_element .value
657+
658+ def _applyDeviceToEventContext (self , device , eventContext ):
659+ eventContext .setDeviceObject (device )
660+
661+ # find all organizers for this device, and add their uuids to
662+ # the appropriate event tags
663+ deviceOrgs = self ._getOrgs (
664+ device , eventContext , self .DEVICE_TAGGERS
665+ )
666+ self ._addDeviceContext (eventContext , device )
667+ self ._addDeviceOrganizers (eventContext , deviceOrgs )
668+
669+ def _applyComponentToEventContext (self , component , eventContext ):
670+ eventContext .setComponentObject (component )
671+
672+ componentOrgs = self ._getOrgs (
673+ component , eventContext , self .COMPONENT_TAGGERS
674+ )
675+ self ._addComponentOrganizers (eventContext , componentOrgs )
676+
677+ def _getOrgs (self , entity , eventContext , taggers ):
678+ orgs = {}
679+ for tagType , info in six .iteritems (taggers ):
680+ getOrgFunc , orgTypeName = info
681+ objList = getOrgFunc (entity )
682+ if objList :
683+ if not isinstance (objList , list ):
684+ objList = [objList ]
685+ uuids = set (
686+ sum (
687+ (self ._manager .getUuidsOfPath (obj ) for obj in objList ),
688+ [],
689+ )
690+ )
691+ if uuids :
692+ eventContext .eventProxy .tags .addAll (tagType , uuids )
693+ orgs [orgTypeName ] = [obj .getOrganizerName () for obj in objList ]
694+ return orgs
695+
587696 def _addDeviceOrganizerNames (
588697 self ,
589698 orgs ,
@@ -653,132 +762,13 @@ def _addComponentOrganizers(self, eventContext, orgs):
653762 EventProxy .COMPONENT_GROUP_DETAIL_KEY ,
654763 )
655764
656- def _findTypeIdAndElement (self , actor , type_id_field , uuid_field ):
657- type_id = None
658- element = None
659- if actor .HasField (type_id_field ):
660- type_id = getattr (actor , type_id_field )
661- if actor .HasField (uuid_field ):
662- element = self ._manager .getElementByUuid (
663- getattr (actor , uuid_field )
664- )
665- return type_id , element
666-
667- def __call__ (self , eventContext ):
668- actor = eventContext .event .actor
669-
670- # Set identifier and title based on resolved object
671- element_type_id , element = self ._findTypeIdAndElement (
672- eventContext .event .actor ,
673- EventField .Actor .ELEMENT_TYPE_ID ,
674- EventField .Actor .ELEMENT_UUID ,
675- )
676- if element :
677- actor .element_identifier = element .id
678- elementTitle = element .titleOrId ()
679- if elementTitle != actor .element_identifier :
680- try :
681- actor .element_title = elementTitle
682- except ValueError :
683- actor .element_title = elementTitle .decode ("utf8" )
684-
685- sub_element_type_id , sub_element = self ._findTypeIdAndElement (
686- eventContext .event .actor ,
687- EventField .Actor .ELEMENT_SUB_TYPE_ID ,
688- EventField .Actor .ELEMENT_SUB_UUID ,
689- )
690- if sub_element :
691- actor .element_sub_identifier = sub_element .id
692- subElementTitle = sub_element .titleOrId ()
693- if subElementTitle != actor .element_sub_identifier :
694- try :
695- actor .element_sub_title = subElementTitle
696- except ValueError :
697- actor .element_sub_title = subElementTitle .decode ("utf8" )
698-
699- self ._applyDeviceToContext (
700- eventContext ,
701- element_type_id ,
702- element ,
703- sub_element_type_id ,
704- sub_element ,
705- )
706-
707- self ._applyComponentToContext (
708- eventContext ,
709- element_type_id ,
710- element ,
711- sub_element_type_id ,
712- sub_element ,
713- )
714765
715- return eventContext
766+ class _Element (object ):
767+ __slots__ = ("typeid" , "value" )
716768
717- def _applyDeviceToContext (
718- self , ctx , element_type_id , element , sub_element_type_id , sub_element
719- ):
720- if ctx .deviceObject is not None :
721- return
722-
723- if element_type_id == DEVICE :
724- device = element
725- elif sub_element_type_id == DEVICE :
726- device = sub_element
727- else :
728- return
729-
730- ctx .setDeviceObject (device )
731-
732- orgs , tags = self ._getOrgsAndTags (
733- ctx , self .DEVICE_TAGGERS , device
734- )
735- self ._addDeviceContext (ctx , device )
736- self ._addDeviceOrganizers (ctx , orgs )
737- for tagType , uuids in six .iteritems (tags ):
738- ctx .eventProxy .tags .addAll (tagType , uuids )
739-
740- def _applyComponentToContext (
741- self , ctx , element_type_id , element , sub_element_type_id , sub_element
742- ):
743- if ctx .componentObject is not None :
744- return
745-
746- if element_type_id == COMPONENT :
747- component = element
748- elif sub_element_type_id == COMPONENT :
749- component = sub_element
750- else :
751- return
752-
753- ctx .setComponentObject (component )
754-
755- orgs , tags = self ._getOrgsAndTags (
756- ctx , self .COMPONENT_TAGGERS , component
757- )
758- self ._addComponentOrganizers (ctx , orgs )
759- for tagType , uuids in six .iteritems (tags ):
760- ctx .eventProxy .tags .addAll (tagType , uuids )
761-
762- def _getOrgsAndTags (self , ctx , taggers , entity ):
763- orgs = {}
764- tags = {}
765- for tagType , orgProcessValues in six .iteritems (taggers ):
766- getOrgFunc , orgTypeName = orgProcessValues
767- objList = getOrgFunc (entity )
768- if not objList :
769- continue
770- if not isinstance (objList , list ):
771- objList = [objList ]
772- orgs [orgTypeName ] = [obj .getOrganizerName () for obj in objList ]
773- uuids = set (
774- sum (
775- (self ._manager .getUuidsOfPath (obj ) for obj in objList ),
776- [],
777- )
778- )
779- if uuids :
780- tags [tagType ] = uuids
781- return orgs , tags
769+ def __init__ (self , typeid , value ):
770+ self .typeid = typeid
771+ self .value = value
782772
783773
784774class UpdateDeviceContextAndTagsPipe (AddDeviceContextAndTagsPipe ):
@@ -799,7 +789,7 @@ def __call__(self, eventContext):
799789 )
800790 # clear out device-specific tags and details
801791 deviceOrganizerTypeNames = [
802- typename for function , typename in self .DEVICE_TAGGERS .values ()
792+ typename for _ , typename in self .DEVICE_TAGGERS .values ()
803793 ]
804794 deviceDetailNames = set (
805795 deviceOrganizerTypeNames
0 commit comments