package org.sleuthkit.autopsy.datamodel; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import org.sleuthkit.datamodel.Content; import org.sleuthkit.datamodel.ContentVisitor; import org.sleuthkit.datamodel.Directory; import org.sleuthkit.datamodel.FileSystem; import org.sleuthkit.datamodel.TskException; import org.sleuthkit.datamodel.VolumeSystem; /** * Returns all the children of a Content object, descending the hierarchy * past subclasses that aren't part of the exposed hierarchy (VolumeSystem, * FileSystem, and root Directories) */ public class ContentHierarchyVisitor extends ContentVisitor.Default> { private static final Logger logger = Logger.getLogger(ContentHierarchyVisitor.class.getName()); private static final ContentHierarchyVisitor INSTANCE = new ContentHierarchyVisitor(); private ContentHierarchyVisitor() {} /** * Get the child Content objects according the the exposed hierarchy. * @param parent * @return */ public static List getChildren(Content parent) { List keys = new ArrayList(); List children; try { children = parent.getChildren(); } catch (TskException ex) { logger.log(Level.WARNING, "Error getting Content children.", ex); children = Collections.emptyList(); } for (Content c : children) { keys.addAll(c.accept(INSTANCE)); } return keys; } @Override protected List defaultVisit(Content c) { return Collections.singletonList(c); } @Override public List visit(VolumeSystem vs) { return getChildren(vs); } @Override public List visit(FileSystem fs) { return getChildren(fs); } @Override public List visit(Directory dir) { if (dir.isRoot()) { return getChildren(dir); } else { return Collections.singletonList(dir); } } }