diff --git a/Core/src/org/sleuthkit/autopsy/tabulardatareader/AbstractReader.java b/Core/src/org/sleuthkit/autopsy/tabulardatareader/AbstractReader.java index 248a6f0e25..f39f4c85ba 100755 --- a/Core/src/org/sleuthkit/autopsy/tabulardatareader/AbstractReader.java +++ b/Core/src/org/sleuthkit/autopsy/tabulardatareader/AbstractReader.java @@ -59,7 +59,7 @@ public abstract class AbstractReader implements AutoCloseable { final String getLocalDiskPath(Content file) throws FileReaderException { try { return Case.getCurrentCaseThrows().getTempDirectory() + - File.separator + file.getId() + "-" + file.getName(); + File.separator + file.getId() + file.getName(); } catch (NoCurrentCaseException ex) { throw new FileReaderException(ex); } diff --git a/Core/src/org/sleuthkit/autopsy/tabulardatareader/SQLiteReader.java b/Core/src/org/sleuthkit/autopsy/tabulardatareader/SQLiteReader.java index 7ce8260c6e..10e49d6f0b 100755 --- a/Core/src/org/sleuthkit/autopsy/tabulardatareader/SQLiteReader.java +++ b/Core/src/org/sleuthkit/autopsy/tabulardatareader/SQLiteReader.java @@ -101,7 +101,7 @@ public final class SQLiteReader extends AbstractReader { if (metaFiles != null) { for (AbstractFile metaFile : metaFiles) { String tmpMetafilePathName = openCase.getTempDirectory() + - File.separator + metaFile.getId() + "-" + metaFile.getName(); + File.separator + metaFile.getId() + metaFile.getName(); File tmpMetafile = new File(tmpMetafilePathName); ContentUtils.writeToFile(metaFile, tmpMetafile); } diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/SqliteTextExtractor.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/SqliteTextExtractor.java index 7305aac511..8d4f16b50f 100755 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/SqliteTextExtractor.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/SqliteTextExtractor.java @@ -18,11 +18,9 @@ */ package org.sleuthkit.autopsy.keywordsearch; +import com.google.common.io.CharSource; import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; import java.io.Reader; -import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collection; import java.util.LinkedList; @@ -82,30 +80,8 @@ public class SqliteTextExtractor extends ContentTextExtractor { */ @Override public Reader getReader(Content source) throws TextExtractorException { - return new InputStreamReader(new SqliteTextReader(source)); - } - - @Override - public boolean isDisabled() { - return false; - } - - @Override - public void logWarning(String msg, Exception ex) { - logger.log(Level.WARNING, msg, ex); //NON-NLS - } - - /** - * InputStream that is returned from the getReader method. This stream opens - * a sqlite file and loads its contents into a buffer that can be read from - * the read function. - */ - private final class SqliteTextReader extends InputStream { - - private StringBuilder databaseBuffer; - private int currReadIndex; - private final int NO_CONTENT_LEFT = -1; - + StringBuilder databaseBuffer = new StringBuilder(); + /** * The buffer is filled during initialization, meaning the whole sqlite * file is read during construction. @@ -115,12 +91,11 @@ public class SqliteTextExtractor extends ContentTextExtractor { * @throws * org.sleuthkit.autopsy.keywordsearch.TextExtractor.TextExtractorException */ - public SqliteTextReader(Content source) throws TextExtractorException { - try (AbstractReader reader = FileReaderFactory.createReader( + try (AbstractReader reader = FileReaderFactory.createReader( SQLITE_MIMETYPE, source)) { - this.databaseBuffer = new StringBuilder(); + databaseBuffer = new StringBuilder(); //Fill the entire buffer upon instantiation - copyDatabaseIntoBuffer(source, reader); + copyDatabaseIntoBuffer(source, reader, databaseBuffer); } catch (FileReaderInitException ex) { throw new TextExtractorException( String.format("Encountered a FileReaderInitException" //NON-NLS @@ -128,92 +103,91 @@ public class SqliteTextExtractor extends ContentTextExtractor { + " for Content with id:[%s], name:[%s].", //NON-NLS source.getId(), source.getName())); } + + try { + return CharSource.wrap(databaseBuffer.toString()).openStream(); + } catch (IOException ex) { + throw new TextExtractorException(String.format("Unable to open CharSource stream on the databaseBuffer" + + "for content source name: [%s] with id: [%d]", source.getName(), source.getId())); } + } + + /** + * Queries the sqlite database and adds all tables and rows to a + * TableBuilder, which formats the strings into a table view for clean + * results while searching for keywords in the application. + * + * @param reader + */ + private void copyDatabaseIntoBuffer(Content source, AbstractReader reader, StringBuilder databaseBuffer) { + try { + Map tables = reader.getTableSchemas(); + iterateTablesAndPopulateBuffer(tables, reader, source, databaseBuffer); + } catch (AbstractReader.FileReaderException ex) { + logger.log(Level.WARNING, String.format( + "Error attempting to get tables from file: " //NON-NLS + + "[%s] (id=%d).", source.getName(), //NON-NLS + source.getId()), ex); + } + } - /** - * Queries the sqlite database and adds all tables and rows to a - * TableBuilder, which formats the strings into a table view for clean - * results while searching for keywords in the application. - * - * @param reader - */ - private void copyDatabaseIntoBuffer(Content source, AbstractReader reader) { + /** + * Iterates all of the tables and passes the rows to a helper function + * for reading. + * + * @param tables A map of table names to table schemas + * @param reader SqliteReader for interfacing with the database + * @param source Source database file for logging + */ + private void iterateTablesAndPopulateBuffer(Map tables, + AbstractReader reader, Content source, StringBuilder databaseBuffer) { + + for (String tableName : tables.keySet()) { + TableBuilder tableBuilder = new TableBuilder(); + tableBuilder.addSection(tableName); try { - Map tables = reader.getTableSchemas(); - iterateTablesAndPopulateBuffer(tables, reader, source); + List> rowsInTable + = reader.getRowsFromTable(tableName); + addRowsToTableBuilder(tableBuilder, rowsInTable, databaseBuffer); } catch (AbstractReader.FileReaderException ex) { logger.log(Level.WARNING, String.format( - "Error attempting to get tables from file: " //NON-NLS - + "[%s] (id=%d).", source.getName(), //NON-NLS - source.getId()), ex); + "Error attempting to read file table: [%s]" //NON-NLS + + " for file: [%s] (id=%d).", tableName, //NON-NLS + source.getName(), source.getId()), ex); } } - - /** - * Iterates all of the tables and passes the rows to a helper function - * for reading. - * - * @param tables A map of table names to table schemas - * @param reader SqliteReader for interfacing with the database - * @param source Source database file for logging - */ - private void iterateTablesAndPopulateBuffer(Map tables, - AbstractReader reader, Content source) { - - for (String tableName : tables.keySet()) { - TableBuilder tableBuilder = new TableBuilder(); - tableBuilder.addSection(tableName); - try { - List> rowsInTable - = reader.getRowsFromTable(tableName); - addRowsToTableBuilder(tableBuilder, rowsInTable); - } catch (AbstractReader.FileReaderException ex) { - logger.log(Level.WARNING, String.format( - "Error attempting to read file table: [%s]" //NON-NLS - + " for file: [%s] (id=%d).", tableName, //NON-NLS - source.getName(), source.getId()), ex); - } + } + + /** + * Iterates all rows in the table and adds the rows to the TableBuilder + * class which formats the input into a table view. + * + * @param tableBuilder + * @param rowsInTable list of rows from the sqlite table + */ + private void addRowsToTableBuilder(TableBuilder tableBuilder, + List> rowsInTable, StringBuilder databaseBuffer) { + if (!rowsInTable.isEmpty()) { + //Create a collection from the header set, so that the TableBuilder + //can easily format it + tableBuilder.addHeader(new ArrayList<>( + rowsInTable.get(0).keySet())); + for (Map row : rowsInTable) { + tableBuilder.addRow(row.values()); } } + //If rowsInTable was empty, just append the table as is + databaseBuffer.append(tableBuilder); + } + + @Override + public boolean isDisabled() { + return false; + } - /** - * Iterates all rows in the table and adds the rows to the TableBuilder - * class which formats the input into a table view. - * - * @param tableBuilder - * @param rowsInTable list of rows from the sqlite table - */ - private void addRowsToTableBuilder(TableBuilder tableBuilder, - List> rowsInTable) { - if (!rowsInTable.isEmpty()) { - //Create a collection from the header set, so that the TableBuilder - //can easily format it - tableBuilder.addHeader(new ArrayList<>( - rowsInTable.get(0).keySet())); - for (Map row : rowsInTable) { - tableBuilder.addRow(row.values()); - } - } - //If rowsInTable was empty, just append the table as is - databaseBuffer.append(tableBuilder); - } - - /** - * Returns one byte of the buffer at a time. This buffer was completely - * loaded during construction. Consider a lazy approach or a - * multi-threaded one if too slow. - * - * @return @throws IOException - */ - @Override - public int read() throws IOException { - //End of the buffer if true - if (currReadIndex == databaseBuffer.length() - 1) { - return NO_CONTENT_LEFT; - } - - return databaseBuffer.charAt(currReadIndex++); - } + @Override + public void logWarning(String msg, Exception ex) { + logger.log(Level.WARNING, msg, ex); //NON-NLS } /* @@ -279,7 +253,7 @@ public class SqliteTextExtractor extends ContentTextExtractor { public void addRow(Collection vals) { List rowValues = new ArrayList<>(); vals.forEach((val) -> { - rowValues.add(String.valueOf(val)); + rowValues.add(val.toString()); }); rows.add(rowValues.toArray( new String[rowValues.size()])); diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/TikaTextExtractor.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/TikaTextExtractor.java index 512f28a599..679bd5b9cc 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/TikaTextExtractor.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/TikaTextExtractor.java @@ -202,7 +202,6 @@ class TikaTextExtractor extends ContentTextExtractor { ) { return false; } - System.out.println(detectedFormat); return TIKA_SUPPORTED_TYPES.contains(detectedFormat); }