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,36 +306,43 @@ 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' ))[0 ][1 ]()
323+ except :
324+ raise exceptions .MissingPackerError (packer = use_packer )
325+
326+ try :
327+ packed = packer .serialize (data = self )
328+ except Exception as exc :
329+ raise exceptions .SerializationError (exception = exc , object = self )
324330
325331 if delete_type :
326332 del self ['__type' ]
327333 return packed
328334
329335 @staticmethod
330- def unserialize (message : bytes , use_packer : str = "msgpack " ):
336+ def deserialize (message : bytes , use_packer : str = "MsgPack " ):
331337 try :
332- if use_packer == "json" :
333- return json .loads (message )
334- else :
335- return msgpack .unpackb (message , raw = False )
338+ packer : Packer = inspect .getmembers (importlib .import_module (f'intelmq.lib.packers.{ use_packer .lower ()} .packer' ))[0 ][1 ]()
339+ except :
340+ raise exceptions .MissingPackerError (packer = use_packer )
341+
342+ try :
343+ return packer .deserialize (data = message )
336344 except Exception as exc :
337- raise exceptions .UnserializationError (exception = exc , object = message )
345+ raise exceptions .DeserializationError (exception = exc , object = message )
338346
339347 def __is_valid_key (self , key : str ):
340348 try :
@@ -485,13 +493,17 @@ def to_dict(self, hierarchical: bool = False, with_type: bool = False,
485493
486494 return new_dict
487495
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 )
496+ def to_pack (self , use_packer = "MsgPack" , hierarchical = False , with_type = False , ** kwargs ):
497+ try :
498+ packer : Packer = inspect .getmembers (importlib .import_module (f'intelmq.lib.packers.{ use_packer .lower ()} .packer' ))[0 ][1 ]()
499+ except :
500+ raise exceptions .MissingPackerError (packer = use_packer )
491501
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 )
502+ try :
503+ data = self .to_dict (hierarchical = hierarchical , with_type = with_type )
504+ return packer .serialize (data , ** kwargs )
505+ except Exception as exc :
506+ raise exceptions .SerializationError (exception = exc , object = self )
495507
496508 def __eq__ (self , other : dict ) -> bool :
497509 """
0 commit comments