/* * Autopsy Forensic Browser * * Copyright 2011 Basis Technology Corp. * Contact: carrier <at> sleuthkit <dot> org * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.sleuthkit.autopsy.datamodel; import java.util.List; import java.util.logging.Level; import org.openide.util.NbBundle; import org.openide.util.lookup.Lookups; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.datamodel.Content; import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.datamodel.TskException; /** * Interface class that all Data nodes inherit from. Provides basic information * such as ID, parent ID, etc. * * @param <T> type of wrapped Content */ public abstract class AbstractContentNode<T extends Content> extends ContentNode { /** * Underlying Sleuth Kit Content object */ T content; private static final Logger logger = Logger.getLogger(AbstractContentNode.class.getName()); /** * Handles aspects that depend on the Content object * * @param content Underlying Content instances */ AbstractContentNode(T content) { //TODO consider child factory for the content children super(new ContentChildren(content), Lookups.singleton(content)); this.content = content; //super.setName(ContentUtils.getSystemName(content)); super.setName("content_" + Long.toString(content.getId())); //NON-NLS } /** * Return the content data associated with this node * * @return the content object wrapped by this node */ public T getContent() { return content; } @Override public void setName(String name) { throw new UnsupportedOperationException( NbBundle.getMessage(this.getClass(), "AbstractContentNode.exception.cannotChangeSysName.msg")); } @Override public String getName() { return super.getName(); } /** * Return true if the underlying content object has children Useful for lazy * loading. * * @return true if has children */ public boolean hasContentChildren() { boolean hasChildren = false; if (content != null) { try { hasChildren = content.hasChildren(); } catch (TskCoreException ex) { logger.log(Level.SEVERE, "Error checking if the node has children, for content: " + content, ex); //NON-NLS } } return hasChildren; } /** * Return ids of children of the underlying content. The ids can be treated * as keys - useful for lazy loading. * * @return list of content ids of children content. */ public List<Long> getContentChildrenIds() { List<Long> childrenIds = null; if (content != null) { try { childrenIds = content.getChildrenIds(); } catch (TskCoreException ex) { logger.log(Level.SEVERE, "Error getting children ids, for content: " + content, ex); //NON-NLS } } return childrenIds; } /** * Return children of the underlying content. * * @return list of content children content. */ public List<Content> getContentChildren() { List<Content> children = null; if (content != null) { try { children = content.getChildren(); } catch (TskCoreException ex) { logger.log(Level.SEVERE, "Error getting children, for content: " + content, ex); //NON-NLS } } return children; } /** * Get count of the underlying content object children. * * Useful for lazy loading. * * @return content children count */ public int getContentChildrenCount() { int childrenCount = -1; if (content != null) { try { childrenCount = content.getChildrenCount(); } catch (TskCoreException ex) { logger.log(Level.SEVERE, "Error checking node content children count, for content: " + content, ex); //NON-NLS } } return childrenCount; } /** * Reads the content of this node (of the underlying content object). * * @param buf buffer to read into * @param offset the starting offset in the content object * @param len the length to read * * @return the bytes read * * @throws TskException exception thrown if the requested part of content * could not be read */ public int read(byte[] buf, long offset, long len) throws TskException { return content.read(buf, offset, len); } }