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,36 +306,43 @@ 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' ))[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 )
324
330
325
331
if delete_type :
326
332
del self ['__type' ]
327
333
return packed
328
334
329
335
@staticmethod
330
- def unserialize (message : bytes , use_packer : str = "msgpack " ):
336
+ def deserialize (message : bytes , use_packer : str = "MsgPack " ):
331
337
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 )
336
344
except Exception as exc :
337
- raise exceptions .UnserializationError (exception = exc , object = message )
345
+ raise exceptions .DeserializationError (exception = exc , object = message )
338
346
339
347
def __is_valid_key (self , key : str ):
340
348
try :
@@ -485,13 +493,17 @@ def to_dict(self, hierarchical: bool = False, with_type: bool = False,
485
493
486
494
return new_dict
487
495
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 )
491
501
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 )
495
507
496
508
def __eq__ (self , other : dict ) -> bool :
497
509
"""
0 commit comments