Sleuth Kit Java Bindings (JNI) 4.14.0
Java bindings for using The Sleuth Kit
Loading...
Searching...
No Matches
AbstractContent.java
Go to the documentation of this file.
1/*
2 * Sleuth Kit Data Model
3 *
4 * Copyright 2011-2016 Basis Technology Corp.
5 * Contact: carrier <at> sleuthkit <dot> org
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 */
19package org.sleuthkit.datamodel;
20
21import com.google.common.annotations.Beta;
22import java.util.ArrayList;
23import java.util.Collection;
24import java.util.Collections;
25import java.util.HashSet;
26import java.util.List;
27import java.util.Optional;
28import java.util.Set;
29import java.util.logging.Level;
30import java.util.logging.Logger;
31import org.sleuthkit.datamodel.Blackboard.BlackboardException;
32import org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE;
33import org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE;
34import org.sleuthkit.datamodel.SleuthkitCase.CaseDbConnection;
35import org.sleuthkit.datamodel.SleuthkitCase.CaseDbTransaction;
36import org.sleuthkit.datamodel.SleuthkitCase.ObjectInfo;
37
42public abstract class AbstractContent implements Content {
43
44 private final static BlackboardArtifact.Type GEN_INFO_TYPE = new BlackboardArtifact.Type(ARTIFACT_TYPE.TSK_GEN_INFO);
45 public final static long UNKNOWN_ID = -1;
46 private final SleuthkitCase db;
47 private final long objId;
48 private final String name;
49 private volatile Content parent;
50 private volatile String uniquePath;
51 protected long parentId;
52 private volatile boolean hasChildren;
53 private volatile boolean checkedHasChildren;
54 private volatile int childrenCount;
55 private BlackboardArtifact genInfoArtifact = null;
56
57 protected AbstractContent(SleuthkitCase db, long obj_id, String name) {
58 this.db = db;
59 this.objId = obj_id;
60 this.name = name;
61 this.parentId = UNKNOWN_ID;
62
63 checkedHasChildren = false;
64 hasChildren = false;
65 childrenCount = -1;
66 }
67
68 @Override
69 public String getName() {
70 return this.name;
71 }
72
73 /*
74 * This base implementation simply walks the hierarchy appending its own
75 * name to the result of calling its parent's getUniquePath() method (with
76 * interleaving forward slashes).
77 */
78 @Override
79 public String getUniquePath() throws TskCoreException {
80 // It is possible that multiple threads could be doing this calculation
81 // simultaneously, but it's worth the potential extra processing to prevent deadlocks.
82 if (uniquePath == null) {
83 String tempUniquePath = "";
84 if (!name.isEmpty()) {
85 tempUniquePath = "/" + getName();
86 }
87
88 Content myParent = getParent();
89 if (myParent != null) {
90 tempUniquePath = myParent.getUniquePath() + tempUniquePath;
91 }
92
93 // Don't update uniquePath until it is complete.
94 uniquePath = tempUniquePath;
95 }
96 return uniquePath;
97 }
98
99 @Override
100 public boolean hasChildren() throws TskCoreException {
101 if (checkedHasChildren == true) {
102 return hasChildren;
103 }
104
105 hasChildren = this.getSleuthkitCase().getHasChildren(this);
106 checkedHasChildren = true;
107
108 return hasChildren;
109 }
110
111 @Override
112 public int getChildrenCount() throws TskCoreException {
113 if (childrenCount != -1) {
114 return childrenCount;
115 }
116
117 childrenCount = this.getSleuthkitCase().getContentChildrenCount(this);
118
119 hasChildren = childrenCount > 0;
120 checkedHasChildren = true;
121
122 return childrenCount;
123 }
124
125 @Override
127 // It is possible that multiple threads could be doing this calculation
128 // simultaneously, but it's worth the potential extra processing to prevent deadlocks.
129 if (parent == null) {
130 Optional<Long> parentIdOpt = getParentId();
131 if (!parentIdOpt.isPresent()) {
132 parent = null;
133 } else {
134 parent = db.getContentById(parentIdOpt.get());
135 }
136 }
137 return parent;
138 }
139
140 void setParent(Content parent) {
141 this.parent = parent;
142 }
143
152 @Beta
153 public Optional<Long> getParentId() throws TskCoreException {
154 if (parentId == UNKNOWN_ID) {
155 ObjectInfo parentInfo = db.getParentInfo(this);
156 if (parentInfo != null) {
157 parentId = parentInfo.getId();
158 }
159 }
160
161 return parentId == UNKNOWN_ID
162 ? Optional.empty()
163 : Optional.of(parentId);
164 }
165
173 void setParentId(long parentId) {
174 this.parentId = parentId;
175 }
176
177 @Override
178 public long getId() {
179 return this.objId;
180 }
181
190 @Override
191 public List<Content> getChildren() throws TskCoreException {
192 List<Content> children = new ArrayList<Content>();
193
194 children.addAll(getSleuthkitCase().getAbstractFileChildren(this));
195 children.addAll(getSleuthkitCase().getBlackboardArtifactChildren(this));
196
197 return children;
198
199 }
200
210 @Override
211 public List<Long> getChildrenIds() throws TskCoreException {
212
213 List<Long> childrenIDs = new ArrayList<Long>();
214
215 childrenIDs.addAll(getSleuthkitCase().getAbstractFileChildrenIds(this));
216 childrenIDs.addAll(getSleuthkitCase().getBlackboardArtifactChildrenIds(this));
217
218 return childrenIDs;
219 }
220
221 // classes should override this if they can be a data source
222 @Override
224 Content myParent = getParent();
225 if (myParent == null) {
226 return null;
227 }
228
229 return myParent.getDataSource();
230 }
231
239 boolean isPoolContent() throws TskCoreException {
240 return getPool() != null;
241 }
242
251 Volume getPoolVolume() throws TskCoreException {
252 Content myParent = getParent();
253 if (myParent == null) {
254 return null;
255 }
256
257 if (!(myParent instanceof AbstractContent)) {
258 return null;
259 }
260
261 if (myParent instanceof Volume) {
262 // This is potentially it, but need to check that this is a volume under a pool
263 if (((Volume) myParent).isPoolContent()) {
264 return (Volume) myParent;
265 } else {
266 // There are no pools in the hierarchy, so we're done
267 return null;
268 }
269 }
270
271 // Try one level higher
272 return ((AbstractContent) myParent).getPoolVolume();
273 }
274
282 Pool getPool() throws TskCoreException {
283 Content myParent = getParent();
284 if (myParent == null) {
285 return null;
286 }
287
288 if (!(myParent instanceof AbstractContent)) {
289 return null;
290 }
291
292 if (myParent instanceof Pool) {
293 return (Pool) myParent;
294 }
295
296 // Try one level higher
297 return ((AbstractContent) myParent).getPool();
298 }
299
306 return db;
307 }
308
309 @Override
310 public boolean equals(Object obj) {
311 if (obj == null) {
312 return false;
313 }
314 if (getClass() != obj.getClass()) {
315 return false;
316 }
317 final AbstractContent other = (AbstractContent) obj;
318 if (this.objId != other.objId) {
319 return false;
320 }
321
322 try {
323 // New children may have been added to an existing content
324 // object in which case they are not equal.
325 if (this.getChildrenCount() != other.getChildrenCount()) {
326 return false;
327 }
328 } catch (TskCoreException ex) {
329 Logger.getLogger(AbstractContent.class.getName()).log(Level.SEVERE, null, ex);
330 }
331
332 return true;
333 }
334
335 @Override
336 public int hashCode() {
337 int hash = 7 + (int) (this.objId ^ (this.objId >>> 32));
338 try {
339 hash = 41 * hash + this.getChildrenCount();
340 } catch (TskCoreException ex) {
341 Logger.getLogger(AbstractContent.class.getName()).log(Level.SEVERE, null, ex);
342 }
343 return hash;
344 }
345
346 @Deprecated
347 @Override
348 public BlackboardArtifact newArtifact(int artifactTypeID) throws TskCoreException {
349 // don't let them make more than 1 GEN_INFO
350 if (artifactTypeID == ARTIFACT_TYPE.TSK_GEN_INFO.getTypeID()) {
351 return getGenInfoArtifact(true);
352 }
353 BlackboardArtifact.Type artifactType = db.getBlackboard().getArtifactType(artifactTypeID);
354 switch (artifactType.getCategory()) {
355 case DATA_ARTIFACT:
356 return this.newDataArtifact(artifactType, Collections.emptyList());
357 case ANALYSIS_RESULT: {
358 AnalysisResultAdded addedResult = this.newAnalysisResult(artifactType, Score.SCORE_UNKNOWN, null, null, null, Collections.emptyList());
359 return addedResult.getAnalysisResult();
360 }
361 default:
362 throw new TskCoreException(String.format("Unknown category: %s for artifact type id: %d",
363 artifactType.getCategory().getName(), artifactTypeID));
364 }
365 }
366
367 @Override
368 public AnalysisResultAdded newAnalysisResult(BlackboardArtifact.Type artifactType, Score score, String conclusion, String configuration, String justification, Collection<BlackboardAttribute> attributesList) throws TskCoreException {
369
370 long dataSourceObjectId = this.getDataSource().getId();
371 CaseDbTransaction trans = db.beginTransaction();
372 try {
373 AnalysisResultAdded resultAdded = db.getBlackboard().newAnalysisResult(artifactType, objId, dataSourceObjectId, score, conclusion, configuration, justification, attributesList, trans);
374
375 trans.commit();
376 return resultAdded;
377 } catch (BlackboardException ex) {
378 trans.rollback();
379 throw new TskCoreException(String.format("Error adding analysis result to content with objId = %d.", objId), ex);
380 }
381 }
382
383 @Override
384 public AnalysisResultAdded newAnalysisResult(BlackboardArtifact.Type artifactType, Score score, String conclusion, String configuration, String justification, Collection<BlackboardAttribute> attributesList, long dataSourceId) throws TskCoreException {
385
386 long dataSourceObjectId = dataSourceId;
387 CaseDbTransaction trans = db.beginTransaction();
388 try {
389 AnalysisResultAdded resultAdded = db.getBlackboard().newAnalysisResult(artifactType, objId, dataSourceObjectId, score, conclusion, configuration, justification, attributesList, trans);
390
391 trans.commit();
392 return resultAdded;
393 } catch (BlackboardException ex) {
394 trans.rollback();
395 throw new TskCoreException(String.format("Error adding analysis result to content with objId = %d.", objId), ex);
396 }
397 }
398
399 @Override
400 public DataArtifact newDataArtifact(BlackboardArtifact.Type artifactType, Collection<BlackboardAttribute> attributesList, Long osAccountId) throws TskCoreException {
401 return db.getBlackboard().newDataArtifact(artifactType, objId, this.getDataSource().getId(), attributesList, osAccountId);
402 }
403
404 @Override
405 public DataArtifact newDataArtifact(BlackboardArtifact.Type artifactType, Collection<BlackboardAttribute> attributesList, Long osAccountId, long dataSourceId) throws TskCoreException {
406 return db.getBlackboard().newDataArtifact(artifactType, objId, dataSourceId, attributesList, osAccountId);
407 }
408
409 @Override
410 public DataArtifact newDataArtifact(BlackboardArtifact.Type artifactType, Collection<BlackboardAttribute> attributesList) throws TskCoreException {
411 return newDataArtifact(artifactType, attributesList, null);
412 }
413
414 @Deprecated
415 @SuppressWarnings("deprecation")
416 @Override
418 return newArtifact(type.getTypeID());
419 }
420
421 @Override
422 public ArrayList<BlackboardArtifact> getArtifacts(String artifactTypeName) throws TskCoreException {
423 return getArtifacts(db.getBlackboard().getArtifactType(artifactTypeName).getTypeID());
424 }
425
426 @Override
427 public ArrayList<BlackboardArtifact> getArtifacts(int artifactTypeID) throws TskCoreException {
428 if (artifactTypeID == ARTIFACT_TYPE.TSK_GEN_INFO.getTypeID()) {
429 if (genInfoArtifact == null) // don't make one if it doesn't already exist
430 {
431 getGenInfoArtifact(false);
432 }
433
434 ArrayList<BlackboardArtifact> list = new ArrayList<BlackboardArtifact>();
435 // genInfoArtifact coudl still be null if there isn't an artifact
436 if (genInfoArtifact != null) {
437 list.add(genInfoArtifact);
438 }
439 return list;
440 }
441 return db.getBlackboardArtifacts(artifactTypeID, objId);
442 }
443
444 @Override
445 public ArrayList<BlackboardArtifact> getArtifacts(BlackboardArtifact.ARTIFACT_TYPE type) throws TskCoreException {
446 return getArtifacts(type.getTypeID());
447 }
448
449 @Override
453
454 @Override
456 if (genInfoArtifact != null) {
457 return genInfoArtifact;
458 }
459
460 // go to db directly to avoid infinite loop
461 ArrayList<BlackboardArtifact> arts = db.getBlackboardArtifacts(BlackboardArtifact.ARTIFACT_TYPE.TSK_GEN_INFO, objId);
462 BlackboardArtifact retArt;
463 if (arts.isEmpty()) {
464 if (create) {
465 retArt = this.newDataArtifact(GEN_INFO_TYPE, Collections.emptyList());
466 } else {
467 return null;
468 }
469 } else {
470 retArt = arts.get(0);
471 }
472 genInfoArtifact = retArt;
473 return retArt;
474 }
475
476 @Override
477 public ArrayList<BlackboardAttribute> getGenInfoAttributes(ATTRIBUTE_TYPE attr_type) throws TskCoreException {
478 ArrayList<BlackboardAttribute> returnList = new ArrayList<BlackboardAttribute>();
479
480 if (genInfoArtifact == null) {
481 getGenInfoArtifact(false);
482 if (genInfoArtifact == null) {
483 return returnList;
484 }
485 }
486
487 for (BlackboardAttribute attribute : genInfoArtifact.getAttributes()) {
488 if (attribute.getAttributeType().getTypeID() == attr_type.getTypeID()) {
489 returnList.add(attribute);
490 }
491 }
492
493 return returnList;
494 }
495
496 @Override
497 public ArrayList<BlackboardArtifact> getAllArtifacts() throws TskCoreException {
498 return db.getMatchingArtifacts("WHERE obj_id = " + objId); //NON-NLS
499 }
500
501 @Override
502 public List<AnalysisResult> getAllAnalysisResults() throws TskCoreException {
503 return db.getBlackboard().getAnalysisResults(objId);
504 }
505
506 @Override
507 public List<DataArtifact> getAllDataArtifacts() throws TskCoreException {
508 return db.getBlackboard().getDataArtifactsBySource(objId);
509 }
510
511 @Override
513 return db.getScoringManager().getAggregateScore(objId);
514 }
515
516 @Override
517 public List<AnalysisResult> getAnalysisResults(BlackboardArtifact.Type artifactType) throws TskCoreException {
518 return db.getBlackboard().getAnalysisResults(objId, artifactType.getTypeID()); //NON-NLS
519 }
520
521 @Override
522 public long getArtifactsCount(String artifactTypeName) throws TskCoreException {
523 return db.getBlackboardArtifactsCount(artifactTypeName, objId);
524 }
525
526 @Override
527 public long getArtifactsCount(int artifactTypeID) throws TskCoreException {
528 return db.getBlackboardArtifactsCount(artifactTypeID, objId);
529 }
530
531 @Override
533 return db.getBlackboardArtifactsCount(type, objId);
534 }
535
536 @Override
538 return db.getBlackboardArtifactsCount(objId);
539 }
540
541 @Override
542 public Set<String> getHashSetNames() throws TskCoreException {
543 Set<String> hashNames = new HashSet<String>();
544 ArrayList<BlackboardArtifact> artifacts = getArtifacts(BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT);
545
546 for (BlackboardArtifact a : artifacts) {
548 if (attribute != null) {
549 hashNames.add(attribute.getValueString());
550 }
551 }
552 return Collections.unmodifiableSet(hashNames);
553 }
554
555 @Override
556 public String toString() {
557 return toString(true);
558 }
559
560 public String toString(boolean preserveState) {
561 if (preserveState) {
562 return "AbstractContent [\t" + "objId " + String.format("%010d", objId) + "\t" //NON-NLS
563 + "name " + name + "\t" + "parentId " + parentId + "\t" //NON-NLS
564 + "\t" + "checkedHasChildren " + checkedHasChildren //NON-NLS
565 + "\t" + "hasChildren " + hasChildren //NON-NLS
566 + "\t" + "childrenCount " + childrenCount //NON-NLS
567 + "uniquePath " + uniquePath + "]\t"; //NON-NLS
568 } else {
569 try {
570 if (getParent() != null) {
571 return "AbstractContent [\t" + "objId " + String.format("%010d", objId) //NON-NLS
572 + "\t" + "name " + name //NON-NLS
573 + "\t" + "checkedHasChildren " + checkedHasChildren //NON-NLS
574 + "\t" + "hasChildren " + hasChildren //NON-NLS
575 + "\t" + "childrenCount " + childrenCount //NON-NLS
576 + "\t" + "getUniquePath " + getUniquePath() //NON-NLS
577 + "\t" + "getParent " + getParent().getId() + "]\t"; //NON-NLS
578 } else {
579 return "AbstractContent [\t" + "objId " //NON-NLS
580 + String.format("%010d", objId) + "\t" + "name " + name //NON-NLS
581 + "\t" + "checkedHasChildren " + checkedHasChildren //NON-NLS
582 + "\t" + "hasChildren " + hasChildren //NON-NLS
583 + "\t" + "childrenCount " + childrenCount //NON-NLS
584 + "\t" + "uniquePath " + getUniquePath() //NON-NLS
585 + "\t" + "parentId " + parentId + "]\t"; //NON-NLS
586 }
587 } catch (TskCoreException ex) {
588 Logger.getLogger(AbstractContent.class.getName()).log(Level.SEVERE, "Could not find Parent", ex); //NON-NLS
589 return "AbstractContent [\t" + "objId " + String.format("%010d", objId) + "\t" //NON-NLS
590 + "name " + name + "\t" + "parentId " + parentId + "\t" //NON-NLS
591 + "\t" + "checkedHasChildren " + checkedHasChildren //NON-NLS
592 + "\t" + "hasChildren " + hasChildren //NON-NLS
593 + "\t" + "childrenCount " + childrenCount //NON-NLS
594 + "uniquePath " + uniquePath + "]\t"; //NON-NLS
595 }
596 }
597 }
598}
ArrayList< BlackboardArtifact > getAllArtifacts()
long getArtifactsCount(String artifactTypeName)
AnalysisResultAdded newAnalysisResult(BlackboardArtifact.Type artifactType, Score score, String conclusion, String configuration, String justification, Collection< BlackboardAttribute > attributesList, long dataSourceId)
AbstractContent(SleuthkitCase db, long obj_id, String name)
DataArtifact newDataArtifact(BlackboardArtifact.Type artifactType, Collection< BlackboardAttribute > attributesList, Long osAccountId, long dataSourceId)
AnalysisResultAdded newAnalysisResult(BlackboardArtifact.Type artifactType, Score score, String conclusion, String configuration, String justification, Collection< BlackboardAttribute > attributesList)
BlackboardArtifact getGenInfoArtifact(boolean create)
String toString(boolean preserveState)
BlackboardArtifact newArtifact(BlackboardArtifact.ARTIFACT_TYPE type)
ArrayList< BlackboardArtifact > getArtifacts(String artifactTypeName)
List< AnalysisResult > getAllAnalysisResults()
List< AnalysisResult > getAnalysisResults(BlackboardArtifact.Type artifactType)
DataArtifact newDataArtifact(BlackboardArtifact.Type artifactType, Collection< BlackboardAttribute > attributesList, Long osAccountId)
BlackboardArtifact newArtifact(int artifactTypeID)
ArrayList< BlackboardAttribute > getGenInfoAttributes(ATTRIBUTE_TYPE attr_type)
ArrayList< BlackboardArtifact > getArtifacts(int artifactTypeID)
ArrayList< BlackboardArtifact > getArtifacts(BlackboardArtifact.ARTIFACT_TYPE type)
DataArtifact newDataArtifact(BlackboardArtifact.Type artifactType, Collection< BlackboardAttribute > attributesList)
static final Score SCORE_UNKNOWN
Definition Score.java:213

Copyright © 2011-2024 Brian Carrier. (carrier -at- sleuthkit -dot- org)
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.