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' )
29
31
30
32
class MessageFactory :
31
33
"""
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
34
36
"""
35
37
36
38
@staticmethod
@@ -45,7 +47,7 @@ def from_dict(message: dict, harmonization=None,
45
47
default_type: If '__type' is not present in message, the given type will be used
46
48
47
49
See also:
48
- MessageFactory.unserialize
50
+ MessageFactory.deserialize
49
51
MessageFactory.serialize
50
52
"""
51
53
if default_type and "__type" not in message :
@@ -61,8 +63,8 @@ def from_dict(message: dict, harmonization=None,
61
63
return class_reference (message , auto = True , harmonization = harmonization )
62
64
63
65
@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 :
66
68
"""
67
69
Takes JSON-encoded Message object, returns instance of correct class.
68
70
@@ -75,19 +77,18 @@ def unserialize(raw_message: bytes, harmonization: dict = None,
75
77
MessageFactory.from_dict
76
78
MessageFactory.serialize
77
79
"""
78
- message = Message .unserialize (raw_message , use_packer = use_packer )
80
+ message = Message .deserialize (raw_message , use_packer = use_packer , ** kwargs )
79
81
return MessageFactory .from_dict (message , harmonization = harmonization ,
80
82
default_type = default_type )
81
83
82
84
@staticmethod
83
- def serialize (message ) -> bytes :
85
+ def serialize (message , use_packer : str = 'MsgPack' , ** kwargs ) -> bytes :
84
86
"""
85
- Takes instance of message-derived class and makes JSON-encoded Message.
87
+ Takes instance of message-derived class and makes packed Message.
86
88
87
89
The class is saved in __type attribute.
88
90
"""
89
- raw_message = Message .serialize (message )
90
- return raw_message
91
+ return Message .serialize (message , use_packer = use_packer , ** kwargs )
91
92
92
93
93
94
class Message (dict ):
@@ -307,36 +308,43 @@ def copy(self):
307
308
return retval
308
309
309
310
def deep_copy (self ):
310
- return MessageFactory .unserialize (MessageFactory .serialize (self ),
311
+ return MessageFactory .deserialize (MessageFactory .serialize (self ),
311
312
harmonization = {self .__class__ .__name__ .lower (): self .harmonization_config })
312
313
313
314
def __str__ (self ):
314
- return self .serialize (use_packer = "json " )
315
+ return self .serialize (use_packer = "JSON " )
315
316
316
- def serialize (self , use_packer : str = "msgpack" ):
317
+ def serialize (self , use_packer : str = "MsgPack" , ** kwargs ):
317
318
delete_type = False
318
319
if '__type' not in self :
319
320
delete_type = True
320
321
self ['__type' ] = self .__class__ .__name__
321
322
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 )
326
332
327
333
if delete_type :
328
334
del self ['__type' ]
329
335
return packed
330
336
331
337
@staticmethod
332
- def unserialize (message : bytes , use_packer : str = "msgpack" ):
338
+ def deserialize (message : bytes , use_packer : str = "MsgPack" , ** kwargs ):
333
339
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 )
338
346
except Exception as exc :
339
- raise exceptions .UnserializationError (exception = exc , object = message )
347
+ raise exceptions .DeserializationError (exception = exc , object = message )
340
348
341
349
def __is_valid_key (self , key : str ):
342
350
try :
@@ -489,13 +497,17 @@ def to_dict(self, hierarchical: bool = False, with_type: bool = False,
489
497
490
498
return new_dict
491
499
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 )
495
505
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 )
499
511
500
512
def __eq__ (self , other : dict ) -> bool :
501
513
"""
0 commit comments