69 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
| import copy
 | |
| 
 | |
| 
 | |
| class ObjectFactory(object):
 | |
|     """Object Factory
 | |
| 
 | |
|     Used to easily create STIX objects with default values for certain
 | |
|     properties.
 | |
| 
 | |
|     Args:
 | |
|         created_by_ref: Default created_by_ref value to apply to all
 | |
|             objects created by this factory.
 | |
|         created: Default created value to apply to all
 | |
|             objects created by this factory.
 | |
|         external_references: Default `external_references` value to apply
 | |
|             to all objects created by this factory.
 | |
|         object_marking_refs: Default `object_marking_refs` value to apply
 | |
|             to all objects created by this factory.
 | |
|         list_append: When a default is set for a list property like
 | |
|             `external_references` or `object_marking_refs` and a value for
 | |
|             that property is passed into `create()`, if this is set to True,
 | |
|             that value will be added to the list alongside the default. If
 | |
|             this is set to False, the passed in value will replace the
 | |
|             default. Defaults to True.
 | |
|     """
 | |
| 
 | |
|     def __init__(self, created_by_ref=None, created=None,
 | |
|                  external_references=None, object_marking_refs=None,
 | |
|                  list_append=True):
 | |
| 
 | |
|         self._defaults = {}
 | |
|         if created_by_ref:
 | |
|             self._defaults['created_by_ref'] = created_by_ref
 | |
|         if created:
 | |
|             self._defaults['created'] = created
 | |
|             # If the user provides a default "created" time, we also want to use
 | |
|             # that as the modified time.
 | |
|             self._defaults['modified'] = created
 | |
|         if external_references:
 | |
|             self._defaults['external_references'] = external_references
 | |
|         if object_marking_refs:
 | |
|             self._defaults['object_marking_refs'] = object_marking_refs
 | |
|         self._list_append = list_append
 | |
|         self._list_properties = ['external_references', 'object_marking_refs']
 | |
| 
 | |
|     def create(self, cls, **kwargs):
 | |
|         # Use self.defaults as the base, but update with any explicit args
 | |
|         # provided by the user.
 | |
|         properties = copy.deepcopy(self._defaults)
 | |
|         if kwargs:
 | |
|             if self._list_append:
 | |
|                 # Append provided items to list properties instead of replacing them
 | |
|                 for list_prop in set(self._list_properties).intersection(kwargs.keys(), properties.keys()):
 | |
|                     kwarg_prop = kwargs.pop(list_prop)
 | |
|                     if kwarg_prop is None:
 | |
|                         del properties[list_prop]
 | |
|                         continue
 | |
|                     if not isinstance(properties[list_prop], list):
 | |
|                         properties[list_prop] = [properties[list_prop]]
 | |
| 
 | |
|                     if isinstance(kwarg_prop, list):
 | |
|                         properties[list_prop].extend(kwarg_prop)
 | |
|                     else:
 | |
|                         properties[list_prop].append(kwarg_prop)
 | |
| 
 | |
|             properties.update(**kwargs)
 | |
| 
 | |
|         return cls(**properties)
 |