Skip to content
Snippets Groups Projects
Unverified Commit 90b8406c authored by Richard Cordovano's avatar Richard Cordovano Committed by GitHub
Browse files

Merge pull request #2496 from kellykelly3/7834-add-tag-name-events

7834 - Added TagName and TagSet events
parents f2a2ff62 4f39601e
No related branches found
No related tags found
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,6 @@ private enum PREPARED_STATEMENT { ...@@ -12922,7 +12899,6 @@ 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 = ?"),
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 +12917,7 @@ private enum PREPARED_STATEMENT { ...@@ -12941,8 +12917,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