Skip to content
Snippets Groups Projects
Commit ff5dc17d authored by Kelly Kelly's avatar Kelly Kelly
Browse files

Added TagName and TagSet events

parent 7367392d
Branches
Tags
No related merge requests found
...@@ -11351,10 +11351,11 @@ public List<TagName> getTagNamesInUse(long dsObjId) throws TskCoreException { ...@@ -11351,10 +11351,11 @@ public List<TagName> getTagNamesInUse(long dsObjId) throws TskCoreException {
* @return A TagName data transfer object (DTO) for the new row. * @return A TagName data transfer object (DTO) for the new row.
* *
* @throws TskCoreException * @throws TskCoreException
* @deprecated addOrUpdateTagName should be used this method calls * @deprecated TaggingManager.addOrUpdateTagName should be used instead
* addOrUpdateTagName with a default knownStatus value * with the default knowStatus of TskData.FileKnown.UNKNOWN
*/ */
@Deprecated @Deprecated
@SuppressWarnings("deprecation")
public TagName addTagName(String displayName, String description, TagName.HTML_COLOR color) throws TskCoreException { public TagName addTagName(String displayName, String description, TagName.HTML_COLOR color) throws TskCoreException {
return addOrUpdateTagName(displayName, description, color, TskData.FileKnown.UNKNOWN); return addOrUpdateTagName(displayName, description, color, TskData.FileKnown.UNKNOWN);
} }
...@@ -11372,35 +11373,11 @@ public TagName addTagName(String displayName, String description, TagName.HTML_C ...@@ -11372,35 +11373,11 @@ public TagName addTagName(String displayName, String description, TagName.HTML_C
* @return A TagName data transfer object (DTO) for the new row. * @return A TagName data transfer object (DTO) for the new row.
* *
* @throws TskCoreException * @throws TskCoreException
* @deprecated This method has been replaced by TaggingManager.addOrUpdateTagName.
*/ */
@Deprecated
public TagName addOrUpdateTagName(String displayName, String description, TagName.HTML_COLOR color, TskData.FileKnown knownStatus) throws TskCoreException { public TagName addOrUpdateTagName(String displayName, String description, TagName.HTML_COLOR color, TskData.FileKnown knownStatus) throws TskCoreException {
acquireSingleUserCaseWriteLock(); return getTaggingManager().addOrUpdateTagName(displayName, description, color, knownStatus);
try (CaseDbConnection connection = connections.getConnection();) {
PreparedStatement statement;
// INSERT INTO tag_names (display_name, description, color, knownStatus) VALUES (?, ?, ?, ?) ON CONFLICT (display_name) DO UPDATE SET description = ?, color = ?, knownStatus = ?
statement = connection.getPreparedStatement(PREPARED_STATEMENT.INSERT_OR_UPDATE_TAG_NAME, Statement.RETURN_GENERATED_KEYS);
statement.clearParameters();
statement.setString(5, description);
statement.setString(6, color.getName());
statement.setByte(7, knownStatus.getFileKnownValue());
statement.setString(1, displayName);
statement.setString(2, description);
statement.setString(3, color.getName());
statement.setByte(4, knownStatus.getFileKnownValue());
connection.executeUpdate(statement);
statement = connection.getPreparedStatement(PREPARED_STATEMENT.SELECT_TAG_NAME_BY_NAME);
statement.clearParameters();
statement.setString(1, displayName);
try (ResultSet resultSet = connection.executeQuery(statement)) {
resultSet.next();
return new TagName(resultSet.getLong("tag_name_id"), displayName, description, color, knownStatus, resultSet.getLong("tag_set_id"), resultSet.getInt("rank"));
}
} catch (SQLException ex) {
throw new TskCoreException("Error adding row for " + displayName + " tag name to tag_names table", ex);
} finally {
releaseSingleUserCaseWriteLock();
}
} }
   
/** /**
...@@ -12922,7 +12899,7 @@ private enum PREPARED_STATEMENT { ...@@ -12922,7 +12899,7 @@ private enum PREPARED_STATEMENT {
+ "FROM tsk_objects INNER JOIN blackboard_artifacts " //NON-NLS + "FROM tsk_objects INNER JOIN blackboard_artifacts " //NON-NLS
+ "ON tsk_objects.obj_id=blackboard_artifacts.obj_id " //NON-NLS + "ON tsk_objects.obj_id=blackboard_artifacts.obj_id " //NON-NLS
+ "WHERE (tsk_objects.par_obj_id = ?)"), + "WHERE (tsk_objects.par_obj_id = ?)"),
INSERT_OR_UPDATE_TAG_NAME("INSERT INTO tag_names (display_name, description, color, knownStatus) VALUES (?, ?, ?, ?) ON CONFLICT (display_name) DO UPDATE SET description = ?, color = ?, knownStatus = ?"), // INSERT_OR_UPDATE_TAG_NAME("INSERT INTO tag_names (display_name, description, color, knownStatus) VALUES (?, ?, ?, ?) ON CONFLICT (display_name) DO UPDATE SET description = ?, color = ?, knownStatus = ?"),
SELECT_EXAMINER_BY_ID("SELECT * FROM tsk_examiners WHERE examiner_id = ?"), SELECT_EXAMINER_BY_ID("SELECT * FROM tsk_examiners WHERE examiner_id = ?"),
SELECT_EXAMINER_BY_LOGIN_NAME("SELECT * FROM tsk_examiners WHERE login_name = ?"), SELECT_EXAMINER_BY_LOGIN_NAME("SELECT * FROM tsk_examiners WHERE login_name = ?"),
INSERT_EXAMINER_POSTGRESQL("INSERT INTO tsk_examiners (login_name) VALUES (?) ON CONFLICT DO NOTHING"), INSERT_EXAMINER_POSTGRESQL("INSERT INTO tsk_examiners (login_name) VALUES (?) ON CONFLICT DO NOTHING"),
...@@ -12941,8 +12918,7 @@ private enum PREPARED_STATEMENT { ...@@ -12941,8 +12918,7 @@ private enum PREPARED_STATEMENT {
INSERT_POOL_INFO("INSERT INTO tsk_pool_info (obj_id, pool_type) VALUES (?, ?)"), INSERT_POOL_INFO("INSERT INTO tsk_pool_info (obj_id, pool_type) VALUES (?, ?)"),
INSERT_FS_INFO("INSERT INTO tsk_fs_info (obj_id, data_source_obj_id, img_offset, fs_type, block_size, block_count, root_inum, first_inum, last_inum, display_name)" INSERT_FS_INFO("INSERT INTO tsk_fs_info (obj_id, data_source_obj_id, img_offset, fs_type, block_size, block_count, root_inum, first_inum, last_inum, display_name)"
+ "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"), + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"),
SELECT_TAG_NAME_BY_ID("SELECT * FROM tag_names where tag_name_id = ?"), SELECT_TAG_NAME_BY_ID("SELECT * FROM tag_names where tag_name_id = ?");
SELECT_TAG_NAME_BY_NAME("SELECT * FROM tag_names where display_name = ?");
   
private final String sql; private final String sql;
   
......
...@@ -72,7 +72,7 @@ public List<TagName> getTagNames() { ...@@ -72,7 +72,7 @@ public List<TagName> getTagNames() {
* *
* @return TagSet id value. * @return TagSet id value.
*/ */
long getId() { public long getId() {
return id; return id;
} }
......
/* /*
* Sleuth Kit Data Model * Sleuth Kit Data Model
* *
* Copyright 2020 Basis Technology Corp. * Copyright 2020-2021 Basis Technology Corp.
* Contact: carrier <at> sleuthkit <dot> org * Contact: carrier <at> sleuthkit <dot> org
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
*/ */
package org.sleuthkit.datamodel; package org.sleuthkit.datamodel;
import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.sql.Statement; import java.sql.Statement;
...@@ -28,6 +29,11 @@ ...@@ -28,6 +29,11 @@
import org.sleuthkit.datamodel.SleuthkitCase.CaseDbConnection; import org.sleuthkit.datamodel.SleuthkitCase.CaseDbConnection;
import org.sleuthkit.datamodel.SleuthkitCase.CaseDbTransaction; import org.sleuthkit.datamodel.SleuthkitCase.CaseDbTransaction;
import static org.sleuthkit.datamodel.TskData.DbType.POSTGRESQL; import static org.sleuthkit.datamodel.TskData.DbType.POSTGRESQL;
import org.sleuthkit.datamodel.TskEvent.TagNamesAddedTskEvent;
import org.sleuthkit.datamodel.TskEvent.TagNamesDeletedTskEvent;
import org.sleuthkit.datamodel.TskEvent.TagNamesUpdatedTskEvent;
import org.sleuthkit.datamodel.TskEvent.TagSetsAddedTskEvent;
import org.sleuthkit.datamodel.TskEvent.TagSetsDeletedTskEvent;
/** /**
* Provides an API to manage Tags. * Provides an API to manage Tags.
...@@ -54,10 +60,10 @@ public class TaggingManager { ...@@ -54,10 +60,10 @@ public class TaggingManager {
*/ */
public List<TagSet> getTagSets() throws TskCoreException { public List<TagSet> getTagSets() throws TskCoreException {
List<TagSet> tagSetList = new ArrayList<>(); List<TagSet> tagSetList = new ArrayList<>();
skCase.acquireSingleUserCaseReadLock(); skCase.acquireSingleUserCaseReadLock();
String getAllTagSetsQuery = "SELECT * FROM tsk_tag_sets"; String getAllTagSetsQuery = "SELECT * FROM tsk_tag_sets";
try (CaseDbConnection connection = skCase.getConnection();Statement stmt = connection.createStatement(); ResultSet resultSet = stmt.executeQuery(getAllTagSetsQuery);) { try (CaseDbConnection connection = skCase.getConnection(); Statement stmt = connection.createStatement(); ResultSet resultSet = stmt.executeQuery(getAllTagSetsQuery);) {
while (resultSet.next()) { while (resultSet.next()) {
int setID = resultSet.getInt("tag_set_id"); int setID = resultSet.getInt("tag_set_id");
String setName = resultSet.getString("name"); String setName = resultSet.getString("name");
...@@ -121,6 +127,8 @@ public TagSet addTagSet(String name, List<TagName> tagNames) throws TskCoreExcep ...@@ -121,6 +127,8 @@ public TagSet addTagSet(String name, List<TagName> tagNames) throws TskCoreExcep
} }
} }
tagSet = new TagSet(setID, name, updatedTags); tagSet = new TagSet(setID, name, updatedTags);
skCase.fireTSKEvent(new TagSetsAddedTskEvent(Collections.singletonList(tagSet)));
skCase.fireTSKEvent(new TagNamesUpdatedTskEvent(updatedTags));
} }
trans.commit(); trans.commit();
} catch (SQLException ex) { } catch (SQLException ex) {
...@@ -158,6 +166,14 @@ public void deleteTagSet(TagSet tagSet) throws TskCoreException { ...@@ -158,6 +166,14 @@ public void deleteTagSet(TagSet tagSet) throws TskCoreException {
queryTemplate = "DELETE FROM tsk_tag_sets WHERE tag_set_id = '%d'"; queryTemplate = "DELETE FROM tsk_tag_sets WHERE tag_set_id = '%d'";
stmt.execute(String.format(queryTemplate, tagSet.getId())); stmt.execute(String.format(queryTemplate, tagSet.getId()));
trans.commit(); trans.commit();
List<Long> tagNameIds = new ArrayList<>();
for (TagName tagName : tagSet.getTagNames()) {
tagNameIds.add(tagName.getId());
}
skCase.fireTSKEvent(new TagSetsDeletedTskEvent(Collections.singletonList(tagSet.getId())));
skCase.fireTSKEvent(new TagNamesDeletedTskEvent(tagNameIds));
} catch (SQLException ex) { } catch (SQLException ex) {
trans.rollback(); trans.rollback();
throw new TskCoreException(String.format("Error deleting tag set where id = %d.", tagSet.getId()), ex); throw new TskCoreException(String.format("Error deleting tag set where id = %d.", tagSet.getId()), ex);
...@@ -177,15 +193,15 @@ public TagSet getTagSet(TagName tagName) throws TskCoreException { ...@@ -177,15 +193,15 @@ public TagSet getTagSet(TagName tagName) throws TskCoreException {
if (tagName == null) { if (tagName == null) {
throw new IllegalArgumentException("Null tagName argument"); throw new IllegalArgumentException("Null tagName argument");
} }
if (tagName.getTagSetId() <= 0) { if (tagName.getTagSetId() <= 0) {
return null; return null;
} }
skCase.acquireSingleUserCaseReadLock(); skCase.acquireSingleUserCaseReadLock();
TagSet tagSet = null; TagSet tagSet = null;
String sqlQuery = String.format("SELECT * FROM tsk_tag_sets WHERE tag_set_id = %d", tagName.getTagSetId()); String sqlQuery = String.format("SELECT * FROM tsk_tag_sets WHERE tag_set_id = %d", tagName.getTagSetId());
try (CaseDbConnection connection = skCase.getConnection();Statement stmt = connection.createStatement(); ResultSet resultSet = stmt.executeQuery(sqlQuery);) { try (CaseDbConnection connection = skCase.getConnection(); Statement stmt = connection.createStatement(); ResultSet resultSet = stmt.executeQuery(sqlQuery);) {
if (resultSet.next()) { if (resultSet.next()) {
int setID = resultSet.getInt("tag_set_id"); int setID = resultSet.getInt("tag_set_id");
String setName = resultSet.getString("name"); String setName = resultSet.getString("name");
...@@ -199,6 +215,39 @@ public TagSet getTagSet(TagName tagName) throws TskCoreException { ...@@ -199,6 +215,39 @@ public TagSet getTagSet(TagName tagName) throws TskCoreException {
} }
} }
/**
* Return a TagSet object for the given id.
*
* @param id TagSet id.
*
* @return The TagSet represented by the given it, or null if one was not
* found.
*
* @throws TskCoreException
*/
public TagSet getTagSet(long id) throws TskCoreException {
TagSet tagSet = null;
String preparedQuery = "Select * FROM tsk_tag_sets WHERE tag_set_id = ?";
skCase.acquireSingleUserCaseReadLock();
try (CaseDbConnection connection = skCase.getConnection(); PreparedStatement statement = connection.getPreparedStatement(preparedQuery, Statement.NO_GENERATED_KEYS)) {
statement.setLong(1, id);
try (ResultSet resultSet = statement.executeQuery()) {
if (resultSet.next()) {
int setID = resultSet.getInt("tag_set_id");
String setName = resultSet.getString("name");
tagSet = new TagSet(setID, setName, getTagNamesByTagSetID(setID));
}
}
} catch (SQLException ex) {
throw new TskCoreException(String.format("Error occurred getting TagSet (ID=%d)", id), ex);
} finally {
skCase.releaseSingleUserCaseReadLock();
}
return tagSet;
}
/** /**
* Inserts a row into the blackboard_artifact_tags table in the case * Inserts a row into the blackboard_artifact_tags table in the case
* database. * database.
...@@ -216,7 +265,7 @@ public BlackboardArtifactTagChange addArtifactTag(BlackboardArtifact artifact, T ...@@ -216,7 +265,7 @@ public BlackboardArtifactTagChange addArtifactTag(BlackboardArtifact artifact, T
if (artifact == null || tagName == null) { if (artifact == null || tagName == null) {
throw new IllegalArgumentException("NULL argument passed to addArtifactTag"); throw new IllegalArgumentException("NULL argument passed to addArtifactTag");
} }
List<BlackboardArtifactTag> removedTags = new ArrayList<>(); List<BlackboardArtifactTag> removedTags = new ArrayList<>();
List<String> removedTagIds = new ArrayList<>(); List<String> removedTagIds = new ArrayList<>();
CaseDbTransaction trans = null; CaseDbTransaction trans = null;
...@@ -254,15 +303,14 @@ public BlackboardArtifactTagChange addArtifactTag(BlackboardArtifact artifact, T ...@@ -254,15 +303,14 @@ public BlackboardArtifactTagChange addArtifactTag(BlackboardArtifact artifact, T
} }
} }
} }
Content content = skCase.getContentById(artifact.getObjectID()); Content content = skCase.getContentById(artifact.getObjectID());
Examiner currentExaminer = skCase.getCurrentExaminer(); Examiner currentExaminer = skCase.getCurrentExaminer();
trans = skCase.beginTransaction(); trans = skCase.beginTransaction();
CaseDbConnection connection = trans.getConnection(); CaseDbConnection connection = trans.getConnection();
if (!removedTags.isEmpty()) { if (!removedTags.isEmpty()) {
// Remove the tags. // Remove the tags.
String removeQuery = String.format("DELETE FROM blackboard_artifact_tags WHERE tag_id IN (%s)", String.join(",", removedTagIds)); String removeQuery = String.format("DELETE FROM blackboard_artifact_tags WHERE tag_id IN (%s)", String.join(",", removedTagIds));
...@@ -274,7 +322,7 @@ public BlackboardArtifactTagChange addArtifactTag(BlackboardArtifact artifact, T ...@@ -274,7 +322,7 @@ public BlackboardArtifactTagChange addArtifactTag(BlackboardArtifact artifact, T
// Add the new Tag. // Add the new Tag.
BlackboardArtifactTag artifactTag; BlackboardArtifactTag artifactTag;
try (Statement stmt = connection.createStatement()) { try (Statement stmt = connection.createStatement()) {
String query = String.format( String query = String.format(
"INSERT INTO blackboard_artifact_tags (artifact_id, tag_name_id, comment, examiner_id) VALUES (%d, %d, '%s', %d)", "INSERT INTO blackboard_artifact_tags (artifact_id, tag_name_id, comment, examiner_id) VALUES (%d, %d, '%s', %d)",
artifact.getArtifactID(), artifact.getArtifactID(),
...@@ -294,7 +342,7 @@ public BlackboardArtifactTagChange addArtifactTag(BlackboardArtifact artifact, T ...@@ -294,7 +342,7 @@ public BlackboardArtifactTagChange addArtifactTag(BlackboardArtifact artifact, T
artifact, content, tagName, comment, currentExaminer.getLoginName()); artifact, content, tagName, comment, currentExaminer.getLoginName());
} }
} }
skCase.getScoringManager().updateAggregateScoreAfterAddition( skCase.getScoringManager().updateAggregateScoreAfterAddition(
artifact.getId(), artifact.getDataSourceObjectID(), getTagScore(tagName.getKnownStatus()), trans); artifact.getId(), artifact.getDataSourceObjectID(), getTagScore(tagName.getKnownStatus()), trans);
...@@ -302,35 +350,36 @@ public BlackboardArtifactTagChange addArtifactTag(BlackboardArtifact artifact, T ...@@ -302,35 +350,36 @@ public BlackboardArtifactTagChange addArtifactTag(BlackboardArtifact artifact, T
return new BlackboardArtifactTagChange(artifactTag, removedTags); return new BlackboardArtifactTagChange(artifactTag, removedTags);
} catch (SQLException ex) { } catch (SQLException ex) {
if(trans != null) { if (trans != null) {
trans.rollback(); trans.rollback();
} }
throw new TskCoreException("Error adding row to blackboard_artifact_tags table (obj_id = " + artifact.getArtifactID() + ", tag_name_id = " + tagName.getId() + ")", ex); throw new TskCoreException("Error adding row to blackboard_artifact_tags table (obj_id = " + artifact.getArtifactID() + ", tag_name_id = " + tagName.getId() + ")", ex);
} }
} }
/** /**
* Returns the score based on this TagName object. * Returns the score based on this TagName object.
*
* @param knownStatus The known status of the tag. * @param knownStatus The known status of the tag.
*
* @return The relevant score. * @return The relevant score.
*/ */
static Score getTagScore(TskData.FileKnown knownStatus) { static Score getTagScore(TskData.FileKnown knownStatus) {
switch (knownStatus) { switch (knownStatus) {
case BAD: case BAD:
return Score.SCORE_NOTABLE; return Score.SCORE_NOTABLE;
case UNKNOWN: case UNKNOWN:
case KNOWN: case KNOWN:
default: default:
return Score.SCORE_LIKELY_NOTABLE; return Score.SCORE_LIKELY_NOTABLE;
} }
} }
/** /**
* Retrieves the maximum FileKnown status of any tag associated with the * Retrieves the maximum FileKnown status of any tag associated with the
* object id. * object id.
* *
* @param objectId The object id of the item. * @param objectId The object id of the item.
* @param transaction The case db transaction to perform this query. * @param transaction The case db transaction to perform this query.
* *
* @return The maximum FileKnown status for this object or empty. * @return The maximum FileKnown status for this object or empty.
...@@ -385,7 +434,7 @@ public ContentTagChange addContentTag(Content content, TagName tagName, String c ...@@ -385,7 +434,7 @@ public ContentTagChange addContentTag(Content content, TagName tagName, String c
Examiner currentExaminer = skCase.getCurrentExaminer(); Examiner currentExaminer = skCase.getCurrentExaminer();
CaseDbTransaction trans = skCase.beginTransaction(); CaseDbTransaction trans = skCase.beginTransaction();
CaseDbConnection connection = trans.getConnection(); CaseDbConnection connection = trans.getConnection();
try { try {
long tagSetId = tagName.getTagSetId(); long tagSetId = tagName.getTagSetId();
...@@ -429,7 +478,7 @@ public ContentTagChange addContentTag(Content content, TagName tagName, String c ...@@ -429,7 +478,7 @@ public ContentTagChange addContentTag(Content content, TagName tagName, String c
String queryTemplate = "INSERT INTO content_tags (obj_id, tag_name_id, comment, begin_byte_offset, end_byte_offset, examiner_id) VALUES (%d, %d, '%s', %d, %d, %d)"; String queryTemplate = "INSERT INTO content_tags (obj_id, tag_name_id, comment, begin_byte_offset, end_byte_offset, examiner_id) VALUES (%d, %d, '%s', %d, %d, %d)";
ContentTag contentTag = null; ContentTag contentTag = null;
try (Statement stmt = connection.createStatement()) { try (Statement stmt = connection.createStatement()) {
String query = String.format(queryTemplate, String query = String.format(queryTemplate,
content.getId(), content.getId(),
tagName.getId(), tagName.getId(),
...@@ -450,7 +499,7 @@ public ContentTagChange addContentTag(Content content, TagName tagName, String c ...@@ -450,7 +499,7 @@ public ContentTagChange addContentTag(Content content, TagName tagName, String c
content, tagName, comment, beginByteOffset, endByteOffset, currentExaminer.getLoginName()); content, tagName, comment, beginByteOffset, endByteOffset, currentExaminer.getLoginName());
} }
} }
Long dataSourceId = content.getDataSource() != null ? content.getDataSource().getId() : null; Long dataSourceId = content.getDataSource() != null ? content.getDataSource().getId() : null;
skCase.getScoringManager().updateAggregateScoreAfterAddition( skCase.getScoringManager().updateAggregateScoreAfterAddition(
content.getId(), dataSourceId, getTagScore(tagName.getKnownStatus()), trans); content.getId(), dataSourceId, getTagScore(tagName.getKnownStatus()), trans);
...@@ -463,6 +512,104 @@ public ContentTagChange addContentTag(Content content, TagName tagName, String c ...@@ -463,6 +512,104 @@ public ContentTagChange addContentTag(Content content, TagName tagName, String c
} }
} }
/**
* Inserts row into the tags_names table, or updates the existing row if the
* displayName already exists in the tag_names table in the case database.
*
* @param displayName The display name for the new tag name.
* @param description The description for the new tag name.
* @param color The HTML color to associate with the new tag name.
* @param knownStatus The TskData.FileKnown value to associate with the new
* tag name.
*
* @return A TagName data transfer object (DTO) for the new row.
*
* @throws TskCoreException
*/
public TagName addOrUpdateTagName(String displayName, String description, TagName.HTML_COLOR color, TskData.FileKnown knownStatus) throws TskCoreException {
String insertQuery = "INSERT INTO tag_names (display_name, description, color, knownStatus) VALUES (?, ?, ?, ?) ON CONFLICT (display_name) DO UPDATE SET description = ?, color = ?, knownStatus = ?";
boolean isUpdated = false;
skCase.acquireSingleUserCaseWriteLock();
try (CaseDbConnection connection = skCase.getConnection()) {
try (PreparedStatement statement = connection.getPreparedStatement("SELECT * FROM tag_names WHERE display_name = ?", Statement.NO_GENERATED_KEYS)) {
statement.setString(1, displayName);
try (ResultSet resultSet = statement.executeQuery()) {
isUpdated = resultSet.next();
}
}
try (PreparedStatement statement = connection.getPreparedStatement(insertQuery, Statement.RETURN_GENERATED_KEYS);) {
statement.clearParameters();
statement.setString(5, description);
statement.setString(6, color.getName());
statement.setByte(7, knownStatus.getFileKnownValue());
statement.setString(1, displayName);
statement.setString(2, description);
statement.setString(3, color.getName());
statement.setByte(4, knownStatus.getFileKnownValue());
statement.executeUpdate();
}
try (PreparedStatement statement = connection.getPreparedStatement("SELECT * FROM tag_names where display_name = ?", Statement.NO_GENERATED_KEYS)) {
statement.setString(1, displayName);
try (ResultSet resultSet = connection.executeQuery(statement)) {
resultSet.next();
TagName newTag = new TagName(resultSet.getLong("tag_name_id"), displayName, description, color, knownStatus, resultSet.getLong("tag_set_id"), resultSet.getInt("rank"));
if (!isUpdated) {
skCase.fireTSKEvent(new TagNamesAddedTskEvent(Collections.singletonList(newTag)));
} else {
skCase.fireTSKEvent(new TagNamesUpdatedTskEvent(Collections.singletonList(newTag)));
}
return newTag;
}
}
} catch (SQLException ex) {
throw new TskCoreException("Error adding row for " + displayName + " tag name to tag_names table", ex);
} finally {
skCase.releaseSingleUserCaseWriteLock();
}
}
/**
* Return the TagName object for the given id.
*
* @param id The TagName id.
*
* @return The TagName object for the given id.
*
* @throws TskCoreException
*/
public TagName getTagName(long id) throws TskCoreException {
String preparedQuery = "SELECT * FROM tag_names where tag_name_id = ?";
skCase.acquireSingleUserCaseReadLock();
try (CaseDbConnection connection = skCase.getConnection()) {
try (PreparedStatement statement = connection.getPreparedStatement(preparedQuery, Statement.NO_GENERATED_KEYS)) {
statement.clearParameters();
statement.setLong(1, id);
try (ResultSet resultSet = statement.executeQuery()) {
if (resultSet.next()) {
return new TagName(resultSet.getLong("tag_name_id"),
resultSet.getString("display_name"),
resultSet.getString("description"),
TagName.HTML_COLOR.getColorByName(resultSet.getString("color")),
TskData.FileKnown.valueOf(resultSet.getByte("knowStatus")),
resultSet.getLong("tag_set_id"),
resultSet.getInt("rank"));
}
}
}
} catch (SQLException ex) {
throw new TskCoreException("", ex);
} finally {
skCase.releaseSingleUserCaseWriteLock();
}
return null;
}
/** /**
* Determine if the given TagSet contains TagNames that are currently in * Determine if the given TagSet contains TagNames that are currently in
* use, ie there is an existing ContentTag or ArtifactTag that uses TagName. * use, ie there is an existing ContentTag or ArtifactTag that uses TagName.
...@@ -522,7 +669,7 @@ private List<TagName> getTagNamesByTagSetID(int tagSetId) throws TskCoreExceptio ...@@ -522,7 +669,7 @@ private List<TagName> getTagNamesByTagSetID(int tagSetId) throws TskCoreExceptio
skCase.acquireSingleUserCaseReadLock(); skCase.acquireSingleUserCaseReadLock();
String query = String.format("SELECT * FROM tag_names WHERE tag_set_id = %d", tagSetId); String query = String.format("SELECT * FROM tag_names WHERE tag_set_id = %d", tagSetId);
try (CaseDbConnection connection = skCase.getConnection();Statement stmt = connection.createStatement(); ResultSet resultSet = stmt.executeQuery(query)) { try (CaseDbConnection connection = skCase.getConnection(); Statement stmt = connection.createStatement(); ResultSet resultSet = stmt.executeQuery(query)) {
while (resultSet.next()) { while (resultSet.next()) {
tagNameList.add(new TagName(resultSet.getLong("tag_name_id"), tagNameList.add(new TagName(resultSet.getLong("tag_name_id"),
resultSet.getString("display_name"), resultSet.getString("display_name"),
......
...@@ -462,7 +462,7 @@ public final static class HostsRemovedFromPersonTskEvent extends TskObjectsEvent ...@@ -462,7 +462,7 @@ public final static class HostsRemovedFromPersonTskEvent extends TskObjectsEvent
private final Person person; private final Person person;
/** /**
* Contructs an event published when one or more hosts are removed from * Constructs an event published when one or more hosts are removed from
* a person. * a person.
* *
* @param person The person. * @param person The person.
...@@ -493,4 +493,123 @@ public List<Long> getHostIds() { ...@@ -493,4 +493,123 @@ public List<Long> getHostIds() {
} }
static abstract class TagNamesTskEvent extends TskObjectsEvent<TagName> {
public TagNamesTskEvent(List<TagName> tagNames) {
super(tagNames);
}
/**
* Returns the list of added or updated TagName objects.
*
* @return The TagName list.
*/
public List<TagName> getTagNames() {
return getDataModelObjects();
}
}
/**
* An event published when one or more TagName are added.
*/
public final static class TagNamesAddedTskEvent extends TagNamesTskEvent {
/**
* Construct an event when one or more TagName are created or updated.
*
* @param tagNames List of added or modified TagName.
*/
public TagNamesAddedTskEvent(List<TagName> tagNames) {
super(tagNames);
}
}
/**
* An event published when one or more TagName are updated.
*/
public final static class TagNamesUpdatedTskEvent extends TagNamesTskEvent {
/**
* Construct an event when one or more TagName are updated.
*
* @param tagNames List of added or modified TagName.
*/
public TagNamesUpdatedTskEvent(List<TagName> tagNames) {
super(tagNames);
}
}
/**
* An event published when one or more TagName are deleted.
*/
public final static class TagNamesDeletedTskEvent extends TskObjectsEvent<Long> {
/**
* Constructs a new event with the given list of TagName ids.
*
* @param tagNameIds Deleted TagName id list.
*/
public TagNamesDeletedTskEvent(List<Long> tagNameIds) {
super(tagNameIds);
}
/**
* List of the deleted TagName ids.
*
* @return The list of deleted TagName Ids.
*/
public List<Long> getTagNameIds() {
return getDataModelObjects();
}
}
/**
* An event published when one or more TagSets have been added.
*/
public final static class TagSetsAddedTskEvent extends TskObjectsEvent<TagSet> {
/**
* Constructs an added event for one or more TagSets.
*
* @param tagSets The added TagSet.
*/
public TagSetsAddedTskEvent(List<TagSet> tagSets) {
super(tagSets);
}
/**
* Return the TagSets list.
*
* @return The TagSet list.
*/
public List<TagSet> getTagSets() {
return getDataModelObjects();
}
}
/**
* An event published when one or more TagSets have been deleted.
*/
public final static class TagSetsDeletedTskEvent extends TskObjectsEvent<Long> {
/**
* Constructs a deleted event for one or more TagSets.
*
* @param tagSetIds The ids of the deleted TagSets.
*/
public TagSetsDeletedTskEvent(List<Long> tagSetIds) {
super(tagSetIds);
}
/**
* Returns the list of deleted TagSet ids.
*
* @return The list of deleted TagSet ids.
*/
public List<Long> getTagSetIds() {
return getDataModelObjects();
}
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment