99Use MessageFactory to get a Message object (types Report and Event).
1010"""
1111import hashlib
12+ import importlib
13+ import inspect
1214import json
1315import re
1416import warnings
1517from collections import defaultdict
1618from typing import Any , Dict , Iterable , Optional , Sequence , Union
17- import msgpack
1819
1920import intelmq .lib .exceptions as exceptions
2021import intelmq .lib .harmonization
2122from intelmq import HARMONIZATION_CONF_FILE
2223from intelmq .lib import utils
24+ from intelmq .lib .packers .packer import Packer
2325
2426__all__ = ['Event' , 'Message' , 'MessageFactory' , 'Report' ]
2527VALID_MESSSAGE_TYPES = ('Event' , 'Message' , 'Report' )
2628
2729
2830class MessageFactory (object ):
2931 """
30- unserialize : JSON encoded message to object
32+ deserialize : JSON encoded message to object
3133 serialize: object to JSON encoded object
3234 """
3335
@@ -43,7 +45,7 @@ def from_dict(message: dict, harmonization=None,
4345 default_type: If '__type' is not present in message, the given type will be used
4446
4547 See also:
46- MessageFactory.unserialize
48+ MessageFactory.deserialize
4749 MessageFactory.serialize
4850 """
4951 if default_type and "__type" not in message :
@@ -59,8 +61,8 @@ def from_dict(message: dict, harmonization=None,
5961 return class_reference (message , auto = True , harmonization = harmonization )
6062
6163 @staticmethod
62- def unserialize (raw_message : bytes , harmonization : dict = None ,
63- default_type : Optional [str ] = None , use_packer : str = "msgpack " ) -> dict :
64+ def deserialize (raw_message : bytes , harmonization : dict = None ,
65+ default_type : Optional [str ] = None , use_packer : str = "MsgPack " ) -> dict :
6466 """
6567 Takes JSON-encoded Message object, returns instance of correct class.
6668
@@ -73,19 +75,18 @@ def unserialize(raw_message: bytes, harmonization: dict = None,
7375 MessageFactory.from_dict
7476 MessageFactory.serialize
7577 """
76- message = Message .unserialize (raw_message , use_packer = use_packer )
78+ message = Message .deserialize (raw_message , use_packer = use_packer )
7779 return MessageFactory .from_dict (message , harmonization = harmonization ,
7880 default_type = default_type )
7981
8082 @staticmethod
81- def serialize (message ) -> bytes :
83+ def serialize (message , use_packer : str = 'MsgPack' ) -> bytes :
8284 """
8385 Takes instance of message-derived class and makes JSON-encoded Message.
8486
8587 The class is saved in __type attribute.
8688 """
87- raw_message = Message .serialize (message )
88- return raw_message
89+ return Message .serialize (message , use_packer = use_packer )
8990
9091
9192class Message (dict ):
@@ -305,34 +306,33 @@ def copy(self):
305306 return retval
306307
307308 def deep_copy (self ):
308- return MessageFactory .unserialize (MessageFactory .serialize (self ),
309+ return MessageFactory .deserialize (MessageFactory .serialize (self ),
309310 harmonization = {self .__class__ .__name__ .lower (): self .harmonization_config })
310311
311312 def __str__ (self ):
312- return self .serialize (use_packer = "json " )
313+ return self .serialize (use_packer = "JSON " )
313314
314- def serialize (self , use_packer : str = "msgpack " ):
315+ def serialize (self , use_packer : str = "MsgPack " ):
315316 delete_type = False
316317 if '__type' not in self :
317318 delete_type = True
318319 self ['__type' ] = self .__class__ .__name__
319320
320- if use_packer == "json" :
321- packed = json .dumps (self )
322- else :
323- packed = msgpack .packb (self )
321+ try :
322+ packer : Packer = inspect .getmembers (importlib .import_module (f'intelmq.lib.packers.{ use_packer .lower ()} .packer' ), inspect .isclass )[0 ][1 ]()
323+ packed = packer .serialize (data = self )
324+ except Exception as exc :
325+ raise exceptions .SerializationError (exception = exc , object = self )
324326
325327 if delete_type :
326328 del self ['__type' ]
327329 return packed
328330
329331 @staticmethod
330- def unserialize (message : bytes , use_packer : str = "msgpack " ):
332+ def deserialize (message : bytes , use_packer : str = "MsgPack " ):
331333 try :
332- if use_packer == "json" :
333- return json .loads (message )
334- else :
335- return msgpack .unpackb (message , raw = False )
334+ packer : Packer = inspect .getmembers (importlib .import_module (f'intelmq.lib.packers.{ use_packer .lower ()} .packer' ))[0 ][1 ]()
335+ return packer .deserialize (data = message )
336336 except Exception as exc :
337337 raise exceptions .UnserializationError (exception = exc , object = message )
338338
@@ -485,13 +485,13 @@ def to_dict(self, hierarchical: bool = False, with_type: bool = False,
485485
486486 return new_dict
487487
488- def to_json (self , hierarchical = False , with_type = False , jsondict_as_string = False ):
489- json_dict = self . to_dict ( hierarchical = hierarchical , with_type = with_type )
490- return json . dumps ( json_dict , ensure_ascii = False , sort_keys = True )
491-
492- def to_msgpack ( self , hierarchical = False , with_type = False ):
493- msgpack_dict = self . to_dict ( hierarchical = hierarchical , with_type = with_type )
494- return msgpack . packb ( msgpack_dict )
488+ def to_pack (self , use_packer = "MsgPack" , hierarchical = False , with_type = False , ** kwargs ):
489+ try :
490+ packer : Packer = getattr ( intelmq . lib . message , f"Packer { use_packer } " )( )
491+ data = self . to_dict ( hierarchical = hierarchical , with_type = with_type )
492+ return packer . serialize ( data , ** kwargs )
493+ except Exception as exc :
494+ raise exceptions . SerializationError ( exception = exc , object = self )
495495
496496 def __eq__ (self , other : dict ) -> bool :
497497 """
0 commit comments