diff --git a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java index 988e6687a5e61989ef24a718392773f522e73863..2c2e6f32076dfd12369c428a621eac25cf3296ce 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java +++ b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java @@ -2148,7 +2148,7 @@ private CaseDbSchemaVersionNumber updateFromSchema8dot4toSchema8dot5(CaseDbSchem throw new TskCoreException("Failed to retrieve the default tag_set_id from DB"); } } - + // Add data_source_obj_id column to the tsk_files table. For newly created cases // this column will have a foreign key constraint on the data_source_info table. // There does not seem to be a reasonable way to do this in an upgrade, @@ -2171,7 +2171,7 @@ private CaseDbSchemaVersionNumber updateFromSchema8dot4toSchema8dot5(CaseDbSchem } finally { closeStatement(updateStatement); } - + return new CaseDbSchemaVersionNumber(8, 5); } finally { @@ -6093,7 +6093,7 @@ public FileSystem addFileSystem(long parentObjId, long imgOffset, TskData.TSK_FS // Get the data source object ID long dataSourceId = getDataSourceObjectId(connection, newObjId); - + // Add a row to tsk_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) PreparedStatement preparedStatement = connection.getPreparedStatement(PREPARED_STATEMENT.INSERT_FS_INFO); @@ -7888,13 +7888,13 @@ Directory getDirectoryById(long id, FileSystem parentFs) throws TskCoreException * @param image Image to lookup FileSystem for * * @return Collection of FileSystems in the image - * + * * @throws TskCoreException */ - public Collection<FileSystem> getImageFileSystems(Image image) throws TskCoreException { + public Collection<FileSystem> getImageFileSystems(Image image) throws TskCoreException { List<FileSystem> fileSystems = new ArrayList<>(); CaseDbConnection connection = connections.getConnection(); - + acquireSingleUserCaseReadLock(); Statement s = null; ResultSet rs = null; @@ -9593,7 +9593,7 @@ public List<TagName> getAllTagNames() throws TskCoreException { resultSet = connection.executeQuery(statement); ArrayList<TagName> tagNames = new ArrayList<>(); while (resultSet.next()) { - tagNames.add(new TagName(resultSet.getLong("tag_name_id"), resultSet.getString("display_name"), + tagNames.add(new TagName(this, resultSet.getLong("tag_name_id"), resultSet.getString("display_name"), resultSet.getString("description"), TagName.HTML_COLOR.getColorByName(resultSet.getString("color")), TskData.FileKnown.valueOf(resultSet.getByte("knownStatus")), resultSet.getLong("tag_set_id"), resultSet.getInt("rank"))); //NON-NLS } @@ -9627,7 +9627,7 @@ public List<TagName> getTagNamesInUse() throws TskCoreException { resultSet = connection.executeQuery(statement); ArrayList<TagName> tagNames = new ArrayList<>(); while (resultSet.next()) { - tagNames.add(new TagName(resultSet.getLong("tag_name_id"), resultSet.getString("display_name"), + tagNames.add(new TagName(this, resultSet.getLong("tag_name_id"), resultSet.getString("display_name"), resultSet.getString("description"), TagName.HTML_COLOR.getColorByName(resultSet.getString("color")), TskData.FileKnown.valueOf(resultSet.getByte("knownStatus")), resultSet.getLong("tag_set_id"), resultSet.getInt("rank"))); //NON-NLS } @@ -9671,7 +9671,7 @@ public List<TagName> getTagNamesInUse(long dsObjId) throws TskCoreException { statement.setLong(2, dsObjId); resultSet = connection.executeQuery(statement); //NON-NLS while (resultSet.next()) { - tagNames.add(new TagName(resultSet.getLong("tag_name_id"), resultSet.getString("display_name"), + tagNames.add(new TagName(this, resultSet.getLong("tag_name_id"), resultSet.getString("display_name"), resultSet.getString("description"), TagName.HTML_COLOR.getColorByName(resultSet.getString("color")), TskData.FileKnown.valueOf(resultSet.getByte("knownStatus")), resultSet.getLong("tag_set_id"), resultSet.getInt("rank"))); //NON-NLS } @@ -9746,7 +9746,7 @@ public TagName addOrUpdateTagName(String displayName, String description, TagNam resultSet = connection.executeQuery(statement); resultSet.next(); - return new TagName(tagId, + return new TagName(this, tagId, 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); @@ -9819,7 +9819,7 @@ public List<ContentTag> getAllContentTags() throws TskCoreException { resultSet = connection.executeQuery(statement); ArrayList<ContentTag> tags = new ArrayList<ContentTag>(); while (resultSet.next()) { - TagName tagName = new TagName(resultSet.getLong("tag_name_id"), resultSet.getString("display_name"), + TagName tagName = new TagName(this, resultSet.getLong("tag_name_id"), resultSet.getString("display_name"), resultSet.getString("description"), TagName.HTML_COLOR.getColorByName(resultSet.getString("color")), TskData.FileKnown.valueOf(resultSet.getByte("knownStatus")), resultSet.getLong("tag_set_id"), resultSet.getInt("rank")); //NON-NLS Content content = getContentById(resultSet.getLong("obj_id")); //NON-NLS @@ -9949,7 +9949,7 @@ public ContentTag getContentTagByID(long contentTagID) throws TskCoreException { resultSet = connection.executeQuery(statement); while (resultSet.next()) { - TagName tagName = new TagName(resultSet.getLong("tag_name_id"), resultSet.getString("display_name"), + TagName tagName = new TagName(this, resultSet.getLong("tag_name_id"), resultSet.getString("display_name"), resultSet.getString("description"), TagName.HTML_COLOR.getColorByName(resultSet.getString("color")), TskData.FileKnown.valueOf(resultSet.getByte("knownStatus")), resultSet.getLong("tag_set_id"), resultSet.getInt("rank")); tag = new ContentTag(resultSet.getLong("tag_id"), getContentById(resultSet.getLong("obj_id")), tagName, @@ -10085,7 +10085,7 @@ public List<ContentTag> getContentTagsByContent(Content content) throws TskCoreE resultSet = connection.executeQuery(statement); ArrayList<ContentTag> tags = new ArrayList<ContentTag>(); while (resultSet.next()) { - TagName tagName = new TagName(resultSet.getLong("tag_name_id"), resultSet.getString("display_name"), + TagName tagName = new TagName(this, resultSet.getLong("tag_name_id"), resultSet.getString("display_name"), resultSet.getString("description"), TagName.HTML_COLOR.getColorByName(resultSet.getString("color")), TskData.FileKnown.valueOf(resultSet.getByte("knownStatus")), resultSet.getLong("tag_set_id"), resultSet.getInt("rank")); //NON-NLS ContentTag tag = new ContentTag(resultSet.getLong("tag_id"), content, tagName, @@ -10165,7 +10165,7 @@ public List<BlackboardArtifactTag> getAllBlackboardArtifactTags() throws TskCore resultSet = connection.executeQuery(statement); ArrayList<BlackboardArtifactTag> tags = new ArrayList<>(); while (resultSet.next()) { - TagName tagName = new TagName(resultSet.getLong("tag_name_id"), resultSet.getString("display_name"), + TagName tagName = new TagName(this, resultSet.getLong("tag_name_id"), resultSet.getString("display_name"), resultSet.getString("description"), TagName.HTML_COLOR.getColorByName(resultSet.getString("color")), TskData.FileKnown.valueOf(resultSet.getByte("knownStatus")), resultSet.getLong("tag_set_id"), resultSet.getInt("rank")); //NON-NLS BlackboardArtifact artifact = getBlackboardArtifact(resultSet.getLong("artifact_id")); //NON-NLS @@ -10395,7 +10395,7 @@ public BlackboardArtifactTag getBlackboardArtifactTagByID(long artifactTagID) th resultSet = connection.executeQuery(statement); while (resultSet.next()) { - TagName tagName = new TagName(resultSet.getLong("tag_name_id"), resultSet.getString("display_name"), + TagName tagName = new TagName(this, resultSet.getLong("tag_name_id"), resultSet.getString("display_name"), resultSet.getString("description"), TagName.HTML_COLOR.getColorByName(resultSet.getString("color")), TskData.FileKnown.valueOf(resultSet.getByte("knownStatus")), resultSet.getLong("tag_set_id"), resultSet.getInt("rank")); BlackboardArtifact artifact = getBlackboardArtifact(resultSet.getLong("artifact_id")); //NON-NLS @@ -10443,7 +10443,7 @@ public List<BlackboardArtifactTag> getBlackboardArtifactTagsByArtifact(Blackboar resultSet = connection.executeQuery(statement); ArrayList<BlackboardArtifactTag> tags = new ArrayList<>(); while (resultSet.next()) { - TagName tagName = new TagName(resultSet.getLong("tag_name_id"), resultSet.getString("display_name"), + TagName tagName = new TagName(this, resultSet.getLong("tag_name_id"), resultSet.getString("display_name"), resultSet.getString("description"), TagName.HTML_COLOR.getColorByName(resultSet.getString("color")), TskData.FileKnown.valueOf(resultSet.getByte("knownStatus")), resultSet.getLong("tag_set_id"), resultSet.getInt("rank")); //NON-NLS Content content = getContentById(artifact.getObjectID()); @@ -11307,7 +11307,7 @@ void addLayoutFileRangeJNI(long objId, long byteStart, long byteLen, releaseSingleUserCaseWriteLock(); } } - + /** * Stores a pair of object ID and its type */ @@ -12865,15 +12865,16 @@ public LocalFile addLocalFile(String fileName, String localPath, public AddImageProcess makeAddImageProcess(String timezone, boolean addUnallocSpace, boolean noFatFsOrphans) { return this.caseHandle.initAddImageProcess(timezone, addUnallocSpace, noFatFsOrphans, "", this); } - + /** * Helper to return FileSystems in an Image * * @param image Image to lookup FileSystem for * * @return Collection of FileSystems in the image - * - * @deprecated Use getImageFileSystems which throws an exception if an error occurs. + * + * @deprecated Use getImageFileSystems which throws an exception if an error + * occurs. */ @Deprecated public Collection<FileSystem> getFileSystems(Image image) { diff --git a/bindings/java/src/org/sleuthkit/datamodel/TagName.java b/bindings/java/src/org/sleuthkit/datamodel/TagName.java index 769971b5e9be1776d6a8aab10a5fce03c3db4971..131073bf5f44245861df7f8bdd36f18de86120e7 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/TagName.java +++ b/bindings/java/src/org/sleuthkit/datamodel/TagName.java @@ -20,6 +20,7 @@ import java.io.Serializable; import java.util.HashMap; +import java.util.List; import java.util.Objects; /** @@ -33,23 +34,23 @@ public class TagName implements Comparable<TagName>, Serializable { public enum HTML_COLOR { - NONE ("None", ""), //NON-NLS - WHITE ("White", "#FFFFFF"), //NON-NLS - SILVER ("Silver", "#C0C0C0"), //NON-NLS - GRAY ("Gray", "#808080"), //NON-NLS - BLACK ("Black", "#000000"), //NON-NLS - RED ("Red", "#FF0000"), //NON-NLS - MAROON ("Maron", "#800000"), //NON-NLS - YELLOW ("Yellow", "#FFFF00"), //NON-NLS - OLIVE ("Olive", "#808000"), //NON-NLS - LIME ("Lime", "#00FF00"), //NON-NLS - GREEN ("Green", "#008000"), //NON-NLS - AQUA ("Aqua", "#00FFFF"), //NON-NLS - TEAL ("Teal", "#008080"), //NON-NLS - BLUE ("Blue", "#0000FF"), //NON-NLS - NAVY ("Navy", "#000080"), //NON-NLS - FUCHSIA ("Fuchsia", "#FF00FF"), //NON-NLS - PURPLE ("Purple", "#800080"); //NON-NLS + NONE("None", ""), //NON-NLS + WHITE("White", "#FFFFFF"), //NON-NLS + SILVER("Silver", "#C0C0C0"), //NON-NLS + GRAY("Gray", "#808080"), //NON-NLS + BLACK("Black", "#000000"), //NON-NLS + RED("Red", "#FF0000"), //NON-NLS + MAROON("Maron", "#800000"), //NON-NLS + YELLOW("Yellow", "#FFFF00"), //NON-NLS + OLIVE("Olive", "#808000"), //NON-NLS + LIME("Lime", "#00FF00"), //NON-NLS + GREEN("Green", "#008000"), //NON-NLS + AQUA("Aqua", "#00FFFF"), //NON-NLS + TEAL("Teal", "#008080"), //NON-NLS + BLUE("Blue", "#0000FF"), //NON-NLS + NAVY("Navy", "#000080"), //NON-NLS + FUCHSIA("Fuchsia", "#FF00FF"), //NON-NLS + PURPLE("Purple", "#800080"); //NON-NLS private final static HashMap<String, HTML_COLOR> colorMap = new HashMap<String, HTML_COLOR>(); private final String name; private final String hexString; @@ -68,7 +69,7 @@ public enum HTML_COLOR { String getName() { return name; } - + public String getRgbValue() { return hexString; } @@ -88,9 +89,10 @@ public static HTML_COLOR getColorByName(String colorName) { private final TskData.FileKnown knownStatus; private final long tagSetId; private final int rank; + private final SleuthkitCase skCase; // Clients of the org.sleuthkit.datamodel package should not directly create these objects. - TagName(long id, String displayName, String description, HTML_COLOR color, TskData.FileKnown knownStatus, long tagSetId, int rank) { + TagName(SleuthkitCase sleuthkitCase, long id, String displayName, String description, HTML_COLOR color, TskData.FileKnown knownStatus, long tagSetId, int rank) { this.id = id; this.displayName = displayName; this.description = description; @@ -98,6 +100,7 @@ public static HTML_COLOR getColorByName(String colorName) { this.knownStatus = knownStatus; this.tagSetId = tagSetId; this.rank = rank; + this.skCase = sleuthkitCase; } public long getId() { @@ -123,11 +126,32 @@ public TskData.FileKnown getKnownStatus() { long getTagSetId() { return tagSetId; } - + public int getRank() { return rank; } + /** + * Returns the TagName TagSet object. + * + * @return TagName TagSet object or null if the TagName is not a part of a + * TagSet. + * + * @throws TskCoreException + */ + public TagSet getTagSet() throws TskCoreException { + if (tagSetId != 0) { + List<TagSet> tagSets = skCase.getTaggingManager().getTagSets(); + for (TagSet set : tagSets) { + if (tagSetId == set.getId()) { + return set; + } + } + } + + return null; + } + /** * Compares two TagName objects by comparing their display names. * diff --git a/bindings/java/src/org/sleuthkit/datamodel/TagSet.java b/bindings/java/src/org/sleuthkit/datamodel/TagSet.java index 2821aff4d08f8534f93babfa886f1786b114b908..31e86808e21e04a915bb1ecb40da58b7c175469b 100755 --- a/bindings/java/src/org/sleuthkit/datamodel/TagSet.java +++ b/bindings/java/src/org/sleuthkit/datamodel/TagSet.java @@ -18,7 +18,9 @@ */ package org.sleuthkit.datamodel; +import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.List; import java.util.Objects; @@ -41,7 +43,8 @@ public class TagSet { if (setName == null || setName.isEmpty()) { throw new IllegalArgumentException("TagSet name must be a non-empty string"); } - this.tagNameList = tagNameList; + this.tagNameList = new ArrayList<>(tagNameList); + this.tagNameList.sort(new TagNameComparator()); this.id = id; this.setName = setName; } @@ -99,5 +102,18 @@ public int hashCode() { return hash; } - + + /** + * Comparator for TagNames. TagNames will sort by rank, then TagName.getName(). + */ + private class TagNameComparator implements Comparator<TagName> { + @Override + public int compare(TagName tagName1, TagName tagName2) { + int result = ((Integer)tagName1.getRank()).compareTo(tagName2.getRank()); + if(result == 0) { + result = tagName1.getDisplayName().compareTo(tagName2.getDisplayName()); + } + return result; + } + } } diff --git a/bindings/java/src/org/sleuthkit/datamodel/TaggingManager.java b/bindings/java/src/org/sleuthkit/datamodel/TaggingManager.java index 29826d973765b201532398a5c6c391262281d7ad..97e8b7b4b7a42e1d4b963e9c234104a3f25c3c95 100755 --- a/bindings/java/src/org/sleuthkit/datamodel/TaggingManager.java +++ b/bindings/java/src/org/sleuthkit/datamodel/TaggingManager.java @@ -112,7 +112,7 @@ public TagSet addTagSet(String name, List<TagName> tagNames) throws TskCoreExcep for (int index = 0; index < tagNames.size(); index++) { TagName tagName = tagNames.get(index); stmt.executeUpdate(String.format("UPDATE tag_names SET tag_set_id = %d, rank = %d WHERE tag_name_id = %d", setID, index, tagName.getId())); - updatedTags.add(new TagName(tagName.getId(), + updatedTags.add(new TagName(skCase, tagName.getId(), tagName.getDisplayName(), tagName.getDescription(), tagName.getColor(), @@ -173,55 +173,6 @@ public void deleteTagSet(TagSet tagSet) throws TskCoreException { } } - /** - * Add the given TagName to the TagSet. - * - * @param tagSet The tag set being added to. - * @param tagName The tag name to add to the set. - * - * @return TagSet TagSet object with newly added TagName. - * - * @throws TskCoreException - */ - public TagSet addTagNameToTagSet(TagSet tagSet, TagName tagName) throws TskCoreException { - if (tagSet == null || tagName == null) { - throw new IllegalArgumentException("NULL value passed to addTagToTagSet"); - } - - // Make sure the tagName is not already in the list. - List<TagName> setTagNameList = tagSet.getTagNames(); - for (TagName tag : setTagNameList) { - if (tagName.getId() == tag.getId()) { - return tagSet; - } - } - - CaseDbConnection connection = skCase.getConnection(); - skCase.acquireSingleUserCaseWriteLock(); - - try (Statement stmt = connection.createStatement()) { - connection.beginTransaction(); - - String queryTemplate = "UPDATE tag_names SET tag_set_id = %d where tag_name_id = %d"; - stmt.executeUpdate(String.format(queryTemplate, tagSet.getId(), tagName.getId())); - - connection.commitTransaction(); - - List<TagName> newTagNameList = new ArrayList<>(); - newTagNameList.addAll(setTagNameList); - newTagNameList.add(new TagName(tagName.getId(), tagName.getDisplayName(), tagName.getDescription(), tagName.getColor(), tagName.getKnownStatus(), tagSet.getId(), tagName.getRank())); - - return new TagSet(tagSet.getId(), tagSet.getName(), newTagNameList); - - } catch (SQLException ex) { - connection.rollbackTransaction(); - throw new TskCoreException(String.format("Error adding TagName (id=%d) to TagSet (id=%s)", tagName.getId(), tagSet.getId()), ex); - } finally { - connection.close(); - skCase.releaseSingleUserCaseWriteLock(); - } - } - /** * Inserts a row into the blackboard_artifact_tags table in the case * database. @@ -257,6 +208,7 @@ public BlackboardArtifactTagChange addArtifactTag(BlackboardArtifact artifact, T try (Statement stmt = connection.createStatement(); ResultSet resultSet = stmt.executeQuery(selectQuery)) { while (resultSet.next()) { TagName removedTag = new TagName( + skCase, resultSet.getLong("tag_name_id"), resultSet.getString("display_name"), resultSet.getString("description"), @@ -353,6 +305,7 @@ public ContentTagChange addContentTag(Content content, TagName tagName, String c try (Statement stmt = connection.createStatement(); ResultSet resultSet = stmt.executeQuery(selectQuery)) { while (resultSet.next()) { TagName removedTag = new TagName( + skCase, resultSet.getLong("tag_name_id"), resultSet.getString("display_name"), resultSet.getString("description"), @@ -485,7 +438,7 @@ private List<TagName> getTagNamesByTagSetID(int tagSetId) throws TskCoreExceptio String query = String.format("SELECT * FROM tag_names WHERE tag_set_id = %d", tagSetId); try (Statement stmt = connection.createStatement(); ResultSet resultSet = stmt.executeQuery(query)) { while (resultSet.next()) { - tagNameList.add(new TagName(resultSet.getLong("tag_name_id"), + tagNameList.add(new TagName(skCase, resultSet.getLong("tag_name_id"), resultSet.getString("display_name"), resultSet.getString("description"), TagName.HTML_COLOR.getColorByName(resultSet.getString("color")),