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' )
2931
3032class MessageFactory :
3133 """
32- unserialize: JSON encoded message to object
33- serialize: object to JSON encoded object
34+ deserialize: packed message to object
35+ serialize: object to packed
3436 """
3537
3638 @staticmethod
@@ -45,7 +47,7 @@ def from_dict(message: dict, harmonization=None,
4547 default_type: If '__type' is not present in message, the given type will be used
4648
4749 See also:
48- MessageFactory.unserialize
50+ MessageFactory.deserialize
4951 MessageFactory.serialize
5052 """
5153 if default_type and "__type" not in message :
@@ -61,8 +63,8 @@ def from_dict(message: dict, harmonization=None,
6163 return class_reference (message , auto = True , harmonization = harmonization )
6264
6365 @staticmethod
64- def unserialize (raw_message : bytes , harmonization : dict = None ,
65- default_type : Optional [str ] = None , use_packer : str = "msgpack" ) -> dict :
66+ def deserialize (raw_message : bytes , harmonization : dict = None ,
67+ default_type : Optional [str ] = None , use_packer : str = "MsgPack" , ** kwargs ) -> dict :
6668 """
6769 Takes JSON-encoded Message object, returns instance of correct class.
6870
@@ -75,19 +77,18 @@ def unserialize(raw_message: bytes, harmonization: dict = None,
7577 MessageFactory.from_dict
7678 MessageFactory.serialize
7779 """
78- message = Message .unserialize (raw_message , use_packer = use_packer )
80+ message = Message .deserialize (raw_message , use_packer = use_packer , ** kwargs )
7981 return MessageFactory .from_dict (message , harmonization = harmonization ,
8082 default_type = default_type )
8183
8284 @staticmethod
83- def serialize (message ) -> bytes :
85+ def serialize (message , use_packer : str = 'MsgPack' , ** kwargs ) -> bytes :
8486 """
85- Takes instance of message-derived class and makes JSON-encoded Message.
87+ Takes instance of message-derived class and makes packed Message.
8688
8789 The class is saved in __type attribute.
8890 """
89- raw_message = Message .serialize (message )
90- return raw_message
91+ return Message .serialize (message , use_packer = use_packer , ** kwargs )
9192
9293
9394class Message (dict ):
@@ -307,36 +308,43 @@ def copy(self):
307308 return retval
308309
309310 def deep_copy (self ):
310- return MessageFactory .unserialize (MessageFactory .serialize (self ),
311+ return MessageFactory .deserialize (MessageFactory .serialize (self ),
311312 harmonization = {self .__class__ .__name__ .lower (): self .harmonization_config })
312313
313314 def __str__ (self ):
314- return self .serialize (use_packer = "json " )
315+ return self .serialize (use_packer = "JSON " )
315316
316- def serialize (self , use_packer : str = "msgpack" ):
317+ def serialize (self , use_packer : str = "MsgPack" , ** kwargs ):
317318 delete_type = False
318319 if '__type' not in self :
319320 delete_type = True
320321 self ['__type' ] = self .__class__ .__name__
321322
322- if use_packer == "json" :
323- packed = json .dumps (self )
324- else :
325- packed = msgpack .packb (self )
323+ try :
324+ packer : Packer = inspect .getmembers (importlib .import_module (f'intelmq.lib.packers.{ use_packer .lower ()} .packer' ))[0 ][1 ]()
325+ except :
326+ raise exceptions .MissingPackerError (packer = use_packer )
327+
328+ try :
329+ packed = packer .serialize (data = self , ** kwargs )
330+ except Exception as exc :
331+ raise exceptions .SerializationError (exception = exc , object = self )
326332
327333 if delete_type :
328334 del self ['__type' ]
329335 return packed
330336
331337 @staticmethod
332- def unserialize (message : bytes , use_packer : str = "msgpack" ):
338+ def deserialize (message : bytes , use_packer : str = "MsgPack" , ** kwargs ):
333339 try :
334- if use_packer == "json" :
335- return json .loads (message )
336- else :
337- return msgpack .unpackb (message , raw = False )
340+ packer : Packer = inspect .getmembers (importlib .import_module (f'intelmq.lib.packers.{ use_packer .lower ()} .packer' ))[0 ][1 ]()
341+ except :
342+ raise exceptions .MissingPackerError (packer = use_packer )
343+
344+ try :
345+ return packer .deserialize (data = message , ** kwargs )
338346 except Exception as exc :
339- raise exceptions .UnserializationError (exception = exc , object = message )
347+ raise exceptions .DeserializationError (exception = exc , object = message )
340348
341349 def __is_valid_key (self , key : str ):
342350 try :
@@ -489,13 +497,17 @@ def to_dict(self, hierarchical: bool = False, with_type: bool = False,
489497
490498 return new_dict
491499
492- def to_json (self , hierarchical = False , with_type = False , jsondict_as_string = False ):
493- json_dict = self .to_dict (hierarchical = hierarchical , with_type = with_type )
494- return json .dumps (json_dict , ensure_ascii = False , sort_keys = True )
500+ def to_pack (self , use_packer = "MsgPack" , hierarchical = False , with_type = False , ** kwargs ):
501+ try :
502+ packer : Packer = inspect .getmembers (importlib .import_module (f'intelmq.lib.packers.{ use_packer .lower ()} .packer' ))[0 ][1 ]()
503+ except :
504+ raise exceptions .MissingPackerError (packer = use_packer )
495505
496- def to_msgpack (self , hierarchical = False , with_type = False ):
497- msgpack_dict = self .to_dict (hierarchical = hierarchical , with_type = with_type )
498- return msgpack .packb (msgpack_dict )
506+ try :
507+ data = self .to_dict (hierarchical = hierarchical , with_type = with_type )
508+ return packer .serialize (data , ** kwargs )
509+ except Exception as exc :
510+ raise exceptions .SerializationError (exception = exc , object = self )
499511
500512 def __eq__ (self , other : dict ) -> bool :
501513 """
0 commit comments