9
9
Use MessageFactory to get a Message object (types Report and Event).
10
10
"""
11
11
import hashlib
12
+ import importlib
13
+ import inspect
12
14
import json
13
15
import re
14
16
import warnings
15
17
from collections import defaultdict
16
18
from typing import Any , Dict , Iterable , Optional , Sequence , Union
17
- import msgpack
18
19
19
20
import intelmq .lib .exceptions as exceptions
20
21
import intelmq .lib .harmonization
21
22
from intelmq import HARMONIZATION_CONF_FILE
22
23
from intelmq .lib import utils
24
+ from intelmq .lib .packers .packer import Packer
23
25
24
26
__all__ = ['Event' , 'Message' , 'MessageFactory' , 'Report' ]
25
27
VALID_MESSSAGE_TYPES = ('Event' , 'Message' , 'Report' )
26
28
27
29
28
30
class MessageFactory (object ):
29
31
"""
30
- unserialize : JSON encoded message to object
32
+ deserialize : JSON encoded message to object
31
33
serialize: object to JSON encoded object
32
34
"""
33
35
@@ -43,7 +45,7 @@ def from_dict(message: dict, harmonization=None,
43
45
default_type: If '__type' is not present in message, the given type will be used
44
46
45
47
See also:
46
- MessageFactory.unserialize
48
+ MessageFactory.deserialize
47
49
MessageFactory.serialize
48
50
"""
49
51
if default_type and "__type" not in message :
@@ -59,8 +61,8 @@ def from_dict(message: dict, harmonization=None,
59
61
return class_reference (message , auto = True , harmonization = harmonization )
60
62
61
63
@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 :
64
66
"""
65
67
Takes JSON-encoded Message object, returns instance of correct class.
66
68
@@ -73,19 +75,18 @@ def unserialize(raw_message: bytes, harmonization: dict = None,
73
75
MessageFactory.from_dict
74
76
MessageFactory.serialize
75
77
"""
76
- message = Message .unserialize (raw_message , use_packer = use_packer )
78
+ message = Message .deserialize (raw_message , use_packer = use_packer )
77
79
return MessageFactory .from_dict (message , harmonization = harmonization ,
78
80
default_type = default_type )
79
81
80
82
@staticmethod
81
- def serialize (message ) -> bytes :
83
+ def serialize (message , use_packer : str = 'MsgPack' ) -> bytes :
82
84
"""
83
85
Takes instance of message-derived class and makes JSON-encoded Message.
84
86
85
87
The class is saved in __type attribute.
86
88
"""
87
- raw_message = Message .serialize (message )
88
- return raw_message
89
+ return Message .serialize (message , use_packer = use_packer )
89
90
90
91
91
92
class Message (dict ):
@@ -305,34 +306,33 @@ def copy(self):
305
306
return retval
306
307
307
308
def deep_copy (self ):
308
- return MessageFactory .unserialize (MessageFactory .serialize (self ),
309
+ return MessageFactory .deserialize (MessageFactory .serialize (self ),
309
310
harmonization = {self .__class__ .__name__ .lower (): self .harmonization_config })
310
311
311
312
def __str__ (self ):
312
- return self .serialize (use_packer = "json " )
313
+ return self .serialize (use_packer = "JSON " )
313
314
314
- def serialize (self , use_packer : str = "msgpack " ):
315
+ def serialize (self , use_packer : str = "MsgPack " ):
315
316
delete_type = False
316
317
if '__type' not in self :
317
318
delete_type = True
318
319
self ['__type' ] = self .__class__ .__name__
319
320
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 )
324
326
325
327
if delete_type :
326
328
del self ['__type' ]
327
329
return packed
328
330
329
331
@staticmethod
330
- def unserialize (message : bytes , use_packer : str = "msgpack " ):
332
+ def deserialize (message : bytes , use_packer : str = "MsgPack " ):
331
333
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 )
336
336
except Exception as exc :
337
337
raise exceptions .UnserializationError (exception = exc , object = message )
338
338
@@ -485,13 +485,13 @@ def to_dict(self, hierarchical: bool = False, with_type: bool = False,
485
485
486
486
return new_dict
487
487
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 )
495
495
496
496
def __eq__ (self , other : dict ) -> bool :
497
497
"""
0 commit comments