package com.threatconnect.sdk.parser.util;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.threatconnect.sdk.parser.model.Attribute;
import com.threatconnect.sdk.parser.model.Group;
import com.threatconnect.sdk.parser.model.Item;
import com.threatconnect.sdk.parser.util.attribute.AttributeDefinition;
import com.threatconnect.sdk.parser.util.attribute.AttributeDefinitionUtil;
/**
* A utility class that adds some of the commonly used attributes to an item
*
* @author Greg Marut
*/
public class AttributeHelper
{
public static final String ATTRIBUTE_AAC = "Additional Analysis and Context";
public static final String ATTRIBUTE_DESCRIPTION = "Description";
public static final String ATTRIBUTE_SOURCE = "Source";
public static final String ATTRIBUTE_SOURCE_DATE_TIME = "Source Date Time";
public static final String ATTRIBUTE_TTP = "Tactics, Techniques, and Procedures";
public static final String SOURCE_DATE_TIME_FORMAT = "MM-dd-yyyy HH:mm zzz";
private static final Logger logger = LoggerFactory.getLogger(AttributeHelper.class);
/**
* Adds the source attribute to all of the items in the list
*
* @param items
* the list of items to add the source attribute to
* @param source
* the source to use
* @param recursive
* whether or not this should be added to all associated items as
* well
*/
public static void addSourceAttributeToAll(final Collection<? extends Item> items, final String source,
final boolean recursive)
{
// for each of the items in the list
for (Item item : items)
{
// add the source attribute to this item
addSourceAttribute(item, source, true);
// check to see if this is recursive and that the item has
// associated items
if (recursive && item instanceof Group)
{
Group group = (Group) item;
if (!group.getAssociatedItems().isEmpty())
{
// add the source to all child items as well
addSourceAttributeToAll(group.getAssociatedItems(), source, recursive);
}
}
}
}
/**
* Adds a description attribute with the given value to the item
*
* @param item
* the item to add this attribute to
* @param value
* the value of the attribute
* @return the attribute that was created
*/
public static Attribute addDescriptionAttribute(final Item item, final String value)
{
return addDescriptionAttribute(item, value, null);
}
/**
* Adds a description attribute with the given value to the item
*
* @param item
* the item to add this attribute to
* @param value
* the value of the attribute
* @param displayed
* determines where this attribute is displayed
* @return the attribute that was created
*/
public static Attribute addDescriptionAttribute(final Item item, final String value, final Boolean displayed)
{
return addAttribute(item, ATTRIBUTE_DESCRIPTION, value, displayed);
}
/**
* Adds a source attribute with the given value to the item
*
* @param item
* the item to add this attribute to
* @param value
* the value of the attribute
* @return the attribute that was created
*/
public static Attribute addSourceAttribute(final Item item, final String value)
{
return addSourceAttribute(item, value, null);
}
/**
* Adds a source attribute with the given value to the item
*
* @param item
* the item to add this attribute to
* @param value
* the value of the attribute
* @param displayed
* determines where this attribute is displayed
* @return the attribute that was created
*/
public static Attribute addSourceAttribute(final Item item, final String value, final Boolean displayed)
{
return addAttribute(item, ATTRIBUTE_SOURCE, value, displayed);
}
/**
* Adds a source date time attribute with the given value to the item
*
* @param item
* the item to add this attribute to
* @param date
* the date object to use
* @return the attribute that was created
*/
public static Attribute addSourceDateTimeAttribute(final Item item, final Date date)
{
DateFormat dateFormat = new SimpleDateFormat(SOURCE_DATE_TIME_FORMAT);
return addAttribute(item, ATTRIBUTE_SOURCE_DATE_TIME, dateFormat.format(date));
}
/**
* Adds an Additional Analysis and Context attribute to the item
*
* @param item
* the item to add this attribute to
* @param value
* the value of the attribute
* @return the attribute that was created
*/
public static Attribute addAdditionalAnalysisAndContext(final Item item, final String value)
{
return addAttribute(item, ATTRIBUTE_AAC, value);
}
/**
* Adds a Tactics, Techniques, and Procedures attribute to the item
*
* @param item
* the item to add this attribute to
* @param value
* the value of the attribute
* @return the attribute that was created
*/
public static Attribute addTacticsTechniquesProcedures(final Item item, final String value)
{
return addAttribute(item, ATTRIBUTE_TTP, value);
}
/**
* Adds an attribute to the item
*
* @param item
* the item to add this attribute to
* @param type
* the type of attribute to add
* @param value
* the value of the attribute
* @return the attribute that was created
*/
public static Attribute addAttribute(final Item item, final String type, final String value)
{
return addAttribute(item, type, value, null);
}
/**
* Adds an attribute to the item provided that the value is not null or empty
*
* @param item
* the item to add this attribute to
* @param type
* the type of attribute to add
* @param value
* the value of the attribute
* @return the attribute that was created or null if the value was null or empty
*/
public static Attribute addAttributeIfExists(final Item item, final String type, final String value)
{
return addAttributeIfExists(item, type, value, null);
}
/**
* Adds an attribute to the item provided that the value is not null or empty
*
* @param item
* the item to add this attribute to
* @param type
* the type of attribute to add
* @param value
* the value of the attribute
* @return the attribute that was created or null if the value was null or empty
*/
public static Attribute addAttributeIfExists(final Item item, final String type, final String value,
final Boolean displayed)
{
if (null != value && !value.trim().isEmpty())
{
return addAttribute(item, type, value, displayed);
}
else
{
return null;
}
}
/**
* Adds an attribute to the item
*
* @param item
* the item to add this attribute to
* @param type
* the type of attribute to add
* @param value
* the value of the attribute
* @param displayed
* determines where this attribute is displayed
* @return the attribute that was created
*/
public static Attribute addAttribute(final Item item, final String type, final String value,
final Boolean displayed)
{
final String truncatedValue;
// make sure that the value is not null and check to see if there is an attribute definition
// for this
if (null != value && AttributeDefinitionUtil.getInstance().containsAttribute(type, item))
{
// retrieve the attribute definition
AttributeDefinition attributeDefinition = AttributeDefinitionUtil.getInstance().getAttribute(type, item);
// check to see if the value has exceeded the max length
if (value.length() > attributeDefinition.getMaxSize())
{
// truncate this value and notify this action in the logs
truncatedValue = value.substring(0, attributeDefinition.getMaxSize());
logger.info("Attribute {} has been truncated to {} characters as definied in {}", type,
attributeDefinition.getMaxSize(), AttributeDefinitionUtil.ATTRIBUTES_FILE);
}
else
{
truncatedValue = value;
}
}
else
{
truncatedValue = value;
}
// create a new attribute
Attribute attribute = new Attribute();
attribute.setType(type);
attribute.setValue(truncatedValue);
attribute.setDisplayed(displayed);
// add the attribute to the item
item.getAttributes().add(attribute);
return attribute;
}
}