From 8c635c058bf14799839f95adea63e100770edc87 Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Fri, 2 May 2014 16:37:05 -0400 Subject: [PATCH 01/59] Relax ingest module unique display name constraint --- .../ingest/IngestModuleFactoryLoader.java | 41 ++++++++++--------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleFactoryLoader.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleFactoryLoader.java index 510e777091..c40f9e3e4f 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleFactoryLoader.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleFactoryLoader.java @@ -44,7 +44,7 @@ final class IngestModuleFactoryLoader { } return instance; } - + synchronized List getIngestModuleFactories() { // Discover the ingest module factories, making sure that there are no // duplicate module display names. The duplicates requirement could be @@ -58,30 +58,31 @@ final class IngestModuleFactoryLoader { Collection factories = Lookup.getDefault().lookupAll(IngestModuleFactory.class); for (IngestModuleFactory factory : factories) { logger.log(Level.INFO, "Found ingest module factory: name = {0}, version = {1}", new Object[]{factory.getModuleDisplayName(), factory.getModuleVersionNumber()}); //NON-NLS + moduleFactoriesByClass.put(factory.getClass().getCanonicalName(), factory); + moduleDisplayNames.add(factory.getModuleDisplayName()); if (!moduleDisplayNames.contains(factory.getModuleDisplayName())) { - moduleFactoriesByClass.put(factory.getClass().getCanonicalName(), factory); - moduleDisplayNames.add(factory.getModuleDisplayName()); - } else { // Not popping up a message box to keep this class UI-indepdent. - logger.log(Level.SEVERE, "Found duplicate ingest module display name, discarding ingest module factory (name = {0}", new Object[]{factory.getModuleDisplayName(), factory.getModuleVersionNumber()}); //NON-NLS + logger.log(Level.SEVERE, "Found duplicate ingest module display name (name = {0})", factory.getModuleDisplayName()); //NON-NLS } } - + // Kick out the sample modules factory. moduleFactoriesByClass.remove("org.sleuthkit.autopsy.examples.SampleIngestModuleFactory"); - + // Do the core ingest module ordering hack described above. - ArrayList coreModuleOrdering = new ArrayList() {{ - add("org.sleuthkit.autopsy.recentactivity.RecentActivityExtracterModuleFactory"); - add("org.sleuthkit.autopsy.ewfverify.EwfVerifierModuleFactory"); - add("org.sleuthkit.autopsy.hashdatabase.HashLookupModuleFactory"); - add("org.sleuthkit.autopsy.modules.filetypeid.FileTypeIdModuleFactory"); - add("org.sleuthkit.autopsy.modules.sevenzip.ArchiveFileExtractorModuleFactory"); - add("org.sleuthkit.autopsy.modules.exif.ExifParserModuleFactory"); - add("org.sleuthkit.autopsy.keywordsearch.KeywordSearchModuleFactory"); - add("org.sleuthkit.autopsy.thunderbirdparser.EmailParserModuleFactory"); - add("org.sleuthkit.autopsy.modules.fileextmismatch.FileExtMismatchDetectorModuleFactory"); - }}; + ArrayList coreModuleOrdering = new ArrayList() { + { + add("org.sleuthkit.autopsy.recentactivity.RecentActivityExtracterModuleFactory"); + add("org.sleuthkit.autopsy.ewfverify.EwfVerifierModuleFactory"); + add("org.sleuthkit.autopsy.hashdatabase.HashLookupModuleFactory"); + add("org.sleuthkit.autopsy.modules.filetypeid.FileTypeIdModuleFactory"); + add("org.sleuthkit.autopsy.modules.sevenzip.ArchiveFileExtractorModuleFactory"); + add("org.sleuthkit.autopsy.modules.exif.ExifParserModuleFactory"); + add("org.sleuthkit.autopsy.keywordsearch.KeywordSearchModuleFactory"); + add("org.sleuthkit.autopsy.thunderbirdparser.EmailParserModuleFactory"); + add("org.sleuthkit.autopsy.modules.fileextmismatch.FileExtMismatchDetectorModuleFactory"); + } + }; List orderedModuleFactories = new ArrayList<>(); for (String className : coreModuleOrdering) { IngestModuleFactory coreFactory = moduleFactoriesByClass.remove(className); @@ -89,12 +90,12 @@ final class IngestModuleFactoryLoader { orderedModuleFactories.add(coreFactory); } } - + // Add in any non-core factories discovered. Order is not guaranteed! for (IngestModuleFactory nonCoreFactory : moduleFactoriesByClass.values()) { orderedModuleFactories.add(nonCoreFactory); } - + return orderedModuleFactories; } } \ No newline at end of file From b37615e58189ed0280c4b14920355af0b94b8774 Mon Sep 17 00:00:00 2001 From: Brian Carrier Date: Mon, 5 May 2014 01:07:44 -0400 Subject: [PATCH 02/59] interim commit of refresh updates in tree. Still need to do interestingitems. --- .../datamodel/ArtifactTypeChildren.java | 75 ------- .../autopsy/datamodel/ArtifactTypeNode.java | 140 ------------- .../datamodel/ExtractedContentChildren.java | 86 -------- .../datamodel/ExtractedContentNode.java | 67 ------ .../directorytree/ResultDeleteAction.java | 193 ------------------ 5 files changed, 561 deletions(-) delete mode 100644 Core/src/org/sleuthkit/autopsy/datamodel/ArtifactTypeChildren.java delete mode 100644 Core/src/org/sleuthkit/autopsy/datamodel/ArtifactTypeNode.java delete mode 100644 Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContentChildren.java delete mode 100644 Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContentNode.java delete mode 100644 Core/src/org/sleuthkit/autopsy/directorytree/ResultDeleteAction.java diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/ArtifactTypeChildren.java b/Core/src/org/sleuthkit/autopsy/datamodel/ArtifactTypeChildren.java deleted file mode 100644 index a1c3182978..0000000000 --- a/Core/src/org/sleuthkit/autopsy/datamodel/ArtifactTypeChildren.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Autopsy Forensic Browser - * - * Copyright 2011 Basis Technology Corp. - * Contact: carrier sleuthkit 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.sleuthkit.autopsy.coreutils.Logger; -import org.openide.nodes.ChildFactory; -import org.openide.nodes.Node; -import org.sleuthkit.datamodel.BlackboardArtifact; -import org.sleuthkit.datamodel.SleuthkitCase; -import org.sleuthkit.datamodel.TskException; - -/** - * - * @author dfickling - */ -class ArtifactTypeChildren extends ChildFactory{ - - private SleuthkitCase skCase; - private BlackboardArtifact.ARTIFACT_TYPE type; - - public ArtifactTypeChildren(BlackboardArtifact.ARTIFACT_TYPE type, SleuthkitCase skCase) { - this.skCase = skCase; - this.type = type; - } - - @Override - protected boolean createKeys(List list) { - try { - List arts = skCase.getBlackboardArtifacts(type.getTypeID()); - //list.addAll(arts.subList(0, Math.min(arts.size(), getTypeLimit(type)))); - list.addAll(arts); - } catch (TskException ex) { - Logger.getLogger(ArtifactTypeChildren.class.getName()) - .log(Level.SEVERE, "Couldn't get blackboard artifacts from database", ex); //NON-NLS - } - return true; - } - - @Override - protected Node createNodeForKey(BlackboardArtifact key){ - return new BlackboardArtifactNode(key); - } - - /** - private static int getTypeLimit(BlackboardArtifact.ARTIFACT_TYPE type) { - switch(type) { - case TSK_WEB_HISTORY: - return 1000000; - case TSK_WEB_COOKIE: - return 1000000; - default: - return 1000000; - } - } - */ - -} diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/ArtifactTypeNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/ArtifactTypeNode.java deleted file mode 100644 index 5df1fc1474..0000000000 --- a/Core/src/org/sleuthkit/autopsy/datamodel/ArtifactTypeNode.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Autopsy Forensic Browser - * - * Copyright 2011-2014 Basis Technology Corp. - * Contact: carrier sleuthkit 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.logging.Level; - -import org.openide.util.NbBundle; -import org.sleuthkit.autopsy.coreutils.Logger; -import org.openide.nodes.Children; -import org.openide.nodes.Sheet; -import org.openide.util.lookup.Lookups; -import org.sleuthkit.datamodel.BlackboardArtifact; -import org.sleuthkit.datamodel.SleuthkitCase; -import org.sleuthkit.datamodel.TskException; - -/** - * Node encapsulating blackboard artifact type. This is used on the left-hand - * navigation side of the Autopsy UI as the parent node for all of the artifacts - * of a given type. Its children will be BlackboardArtifactNode objects. - */ -public class ArtifactTypeNode extends DisplayableItemNode { - - private BlackboardArtifact.ARTIFACT_TYPE type; - private long childCount = 0; - - ArtifactTypeNode(BlackboardArtifact.ARTIFACT_TYPE type, SleuthkitCase skCase) { - super(Children.create(new ArtifactTypeChildren(type, skCase), true), Lookups.singleton(type.getDisplayName())); - super.setName(type.getLabel()); - // NOTE: This completely destroys our lazy-loading ideal - // a performance increase might be had by adding a - // "getBlackboardArtifactCount()" method to skCase - try { - this.childCount = skCase.getBlackboardArtifactsTypeCount(type.getTypeID()); - } catch (TskException ex) { - Logger.getLogger(ArtifactTypeNode.class.getName()) - .log(Level.WARNING, "Error getting child count", ex); //NON-NLS - } - super.setDisplayName(type.getDisplayName() + " (" + childCount + ")"); - this.type = type; - this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/" + getIcon(type)); //NON-NLS - - } - - @Override - protected Sheet createSheet() { - Sheet s = super.createSheet(); - Sheet.Set ss = s.get(Sheet.PROPERTIES); - if (ss == null) { - ss = Sheet.createPropertiesSet(); - s.put(ss); - } - - ss.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "ArtifactTypeNode.createSheet.artType.name"), - NbBundle.getMessage(this.getClass(), "ArtifactTypeNode.createSheet.artType.displayName"), - NbBundle.getMessage(this.getClass(), "ArtifactTypeNode.createSheet.artType.desc"), - type.getDisplayName())); - - ss.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "ArtifactTypeNode.createSheet.childCnt.name"), - NbBundle.getMessage(this.getClass(), "ArtifactTypeNode.createSheet.childCnt.displayName"), - NbBundle.getMessage(this.getClass(), "ArtifactTypeNode.createSheet.childCnt.desc"), - childCount)); - - return s; - } - - @Override - public T accept(DisplayableItemNodeVisitor v) { - return v.visit(this); - } - - // @@@ TODO: Merge with BlackboartArtifactNode.getIcon() - private String getIcon(BlackboardArtifact.ARTIFACT_TYPE type) { - switch (type) { - case TSK_WEB_BOOKMARK: - return "bookmarks.png"; //NON-NLS - case TSK_WEB_COOKIE: - return "cookies.png"; //NON-NLS - case TSK_WEB_HISTORY: - return "history.png"; //NON-NLS - case TSK_WEB_DOWNLOAD: - return "downloads.png"; //NON-NLS - case TSK_INSTALLED_PROG: - return "programs.png"; //NON-NLS - case TSK_RECENT_OBJECT: - return "recent_docs.png"; //NON-NLS - case TSK_DEVICE_ATTACHED: - return "usb_devices.png"; //NON-NLS - case TSK_WEB_SEARCH_QUERY: - return "searchquery.png"; //NON-NLS - case TSK_METADATA_EXIF: - return "camera-icon-16.png"; //NON-NLS - case TSK_CONTACT: - return "contact.png"; //NON-NLS - case TSK_MESSAGE: - return "message.png"; //NON-NLS - case TSK_CALLLOG: - return "calllog.png"; //NON-NLS - case TSK_CALENDAR_ENTRY: - return "calendar.png"; //NON-NLS - case TSK_SPEED_DIAL_ENTRY: - return "speeddialentry.png"; //NON-NLS - case TSK_BLUETOOTH_PAIRING: - return "bluetooth.png"; //NON-NLS - case TSK_GPS_BOOKMARK: - return "gpsfav.png"; //NON-NLS - case TSK_GPS_LAST_KNOWN_LOCATION: - return "gps-lastlocation.png"; //NON-NLS - case TSK_GPS_SEARCH: - return "gps-search.png"; //NON-NLS - case TSK_SERVICE_ACCOUNT: - return "account-icon-16.png"; //NON-NLS - case TSK_ENCRYPTION_DETECTED: - return "encrypted-file.png"; //NON-NLS - case TSK_EXT_MISMATCH_DETECTED: - return "mismatch-16.png"; //NON-NLS - } - return "artifact-icon.png"; //NON-NLS - } - - @Override - public boolean isLeafTypeNode() { - return true; - } -} diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContentChildren.java b/Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContentChildren.java deleted file mode 100644 index 9d48f7fb70..0000000000 --- a/Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContentChildren.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Autopsy Forensic Browser - * - * Copyright 2011-2013 Basis Technology Corp. - * Contact: carrier sleuthkit 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.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; -import java.util.logging.Level; -import org.openide.nodes.ChildFactory; -import org.openide.nodes.Node; -import org.openide.util.Exceptions; -import org.sleuthkit.autopsy.coreutils.Logger; -import org.sleuthkit.datamodel.BlackboardArtifact; -import org.sleuthkit.datamodel.SleuthkitCase; -import org.sleuthkit.datamodel.TskCoreException; - -/** - * Creates the children for the ExtractedContent area of the results tree. This area - * has all of the blackboard artifacts that are not displayed in a more specific form elsewhere - * in the tree. - */ -class ExtractedContentChildren extends ChildFactory { - private SleuthkitCase skCase; - private final ArrayList doNotShow; - - public ExtractedContentChildren(SleuthkitCase skCase) { - super(); - this.skCase = skCase; - - // these are shown in other parts of the UI tree - doNotShow = new ArrayList<>(); - doNotShow.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_GEN_INFO); - doNotShow.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG); - doNotShow.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT); - doNotShow.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT); - doNotShow.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_TAG_ARTIFACT); - doNotShow.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_TAG_FILE); - doNotShow.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT); - doNotShow.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_ARTIFACT_HIT); - } - - @Override - protected boolean createKeys(List list) { - try { - List inUse = skCase.getBlackboardArtifactTypesInUse(); - inUse.removeAll(doNotShow); - Collections.sort(inUse, - new Comparator() { - @Override - public int compare(BlackboardArtifact.ARTIFACT_TYPE a, BlackboardArtifact.ARTIFACT_TYPE b) { - return a.getDisplayName().compareTo(b.getDisplayName()); - } - }); - list.addAll(inUse); - } catch (TskCoreException ex) { - Logger.getLogger(ExtractedContentChildren.class.getName()).log(Level.SEVERE, "Error getting list of artifacts in use: " + ex.getLocalizedMessage()); //NON-NLS - return false; - } - return true; - } - - - @Override - protected Node createNodeForKey(BlackboardArtifact.ARTIFACT_TYPE key){ - return new ArtifactTypeNode(key, skCase); - } - -} diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContentNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContentNode.java deleted file mode 100644 index e4077c7dcf..0000000000 --- a/Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContentNode.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Autopsy Forensic Browser - * - * Copyright 2011-2014 Basis Technology Corp. - * Contact: carrier sleuthkit 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 org.openide.nodes.Children; -import org.openide.nodes.Sheet; -import org.openide.util.NbBundle; -import org.openide.util.lookup.Lookups; -import org.sleuthkit.datamodel.SleuthkitCase; - -/** - * Node for the extracted content artifacts (artifacts that are not shown in - * more specific areas of the tree) - */ -public class ExtractedContentNode extends DisplayableItemNode { - - public static final String NAME = NbBundle.getMessage(ExtractedContentNode.class, "ExtractedContentNode.name.text"); - - public ExtractedContentNode(SleuthkitCase skCase) { - super(Children.create(new ExtractedContentChildren(skCase), true), Lookups.singleton(NAME)); - super.setName(NAME); - super.setDisplayName(NAME); - this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/extracted_content.png"); //NON-NLS - } - - @Override - public boolean isLeafTypeNode() { - return false; - } - - @Override - public T accept(DisplayableItemNodeVisitor v) { - return v.visit(this); - } - - @Override - protected Sheet createSheet() { - Sheet s = super.createSheet(); - Sheet.Set ss = s.get(Sheet.PROPERTIES); - if (ss == null) { - ss = Sheet.createPropertiesSet(); - s.put(ss); - } - - ss.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "ExtractedContentNode.createSheet.name.name"), - NbBundle.getMessage(this.getClass(), "ExtractedContentNode.createSheet.name.displayName"), - NbBundle.getMessage(this.getClass(), "ExtractedContentNode.createSheet.name.desc"), - NAME)); - return s; - } -} diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/ResultDeleteAction.java b/Core/src/org/sleuthkit/autopsy/directorytree/ResultDeleteAction.java deleted file mode 100644 index f11024990c..0000000000 --- a/Core/src/org/sleuthkit/autopsy/directorytree/ResultDeleteAction.java +++ /dev/null @@ -1,193 +0,0 @@ -/* - * Autopsy Forensic Browser - * - * Copyright 2011 Basis Technology Corp. - * Contact: carrier sleuthkit 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.directorytree; - -import java.awt.event.ActionEvent; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.List; -import java.util.logging.Level; - -import org.openide.util.NbBundle; -import org.sleuthkit.autopsy.coreutils.Logger; -import javax.swing.AbstractAction; -import javax.swing.JOptionPane; -import org.sleuthkit.autopsy.casemodule.Case; -import org.sleuthkit.datamodel.BlackboardArtifact; -import org.sleuthkit.datamodel.BlackboardAttribute; -import org.sleuthkit.datamodel.SleuthkitCase; - -/** - * Action that deletes blackboard artifacts requested and reloads the view - * @deprecated do not use, it is here in case we ever pick up on this work - */ -@Deprecated - class ResultDeleteAction extends AbstractAction { - - private enum ActionType { - - SINGLE_ARTIFACT ///< deletes individual artifacts and assoc. attributes - , - MULT_ARTIFACTS ///< deletes multiple artifacts and assoc. attributes - , - TYPE_ARTIFACTS ///< deletes all artifacts by type and assoc. attributes - } - private BlackboardArtifact art; - private BlackboardArtifact.ARTIFACT_TYPE artType; - private List arts; - private ActionType actionType; - private static final Logger logger = Logger.getLogger(ResultDeleteAction.class.getName()); - - ResultDeleteAction(String title) { - super(title); - } - - ResultDeleteAction(String title, BlackboardArtifact art) { - this(title); - this.art = art; - this.actionType = ActionType.SINGLE_ARTIFACT; - } - - ResultDeleteAction(String title, List arts) { - this(title); - this.arts = arts; - this.actionType = ActionType.MULT_ARTIFACTS; - } - - ResultDeleteAction(String title, BlackboardArtifact.ARTIFACT_TYPE artType) { - this(title); - this.artType = artType; - this.actionType = ActionType.TYPE_ARTIFACTS; - } - - @Override - public void actionPerformed(ActionEvent e) { - if (actionType == ActionType.SINGLE_ARTIFACT) { - deleteArtifact(art); - DirectoryTreeTopComponent viewer = DirectoryTreeTopComponent.findInstance(); - viewer.refreshTree(BlackboardArtifact.ARTIFACT_TYPE.fromID(art.getArtifactTypeID())); - } - if (actionType == ActionType.MULT_ARTIFACTS) { - for (BlackboardArtifact art : arts) { - deleteArtifact(art); - } - DirectoryTreeTopComponent viewer = DirectoryTreeTopComponent.findInstance(); - viewer.refreshTree(BlackboardArtifact.ARTIFACT_TYPE.fromID(art.getArtifactTypeID())); - } else if (this.actionType == ActionType.TYPE_ARTIFACTS) { - if (JOptionPane.showConfirmDialog(null, - NbBundle.getMessage(this.getClass(), - "ResultDeleteAction.actionPerf.confDlg.delAllResults.msg", - artType.getDisplayName()), - NbBundle.getMessage(this.getClass(), - "ResultDeleteAction.actoinPerf.confDlg.delAllresults.details", - artType.getDisplayName()), JOptionPane.YES_NO_OPTION, - JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) { - deleteArtifacts(artType); - DirectoryTreeTopComponent viewer = DirectoryTreeTopComponent.findInstance(); - viewer.refreshTree(artType); - } - } else { - throw new IllegalArgumentException( - NbBundle.getMessage(this.getClass(), "ResultDeleteAction.exception.invalidAction.msg", - this.actionType)); - } - } - - //TODO should be moved to SleuthkitCase and BlackboardArtifact API - @SuppressWarnings("deprecation") - private static void deleteArtifact(BlackboardArtifact art) { - final SleuthkitCase skCase = Case.getCurrentCase().getSleuthkitCase(); - final long artId = art.getArtifactID(); - try { - ResultSet rs = skCase.runQuery("DELETE from blackboard_attributes where artifact_id = " + Long.toString(artId)); //NON-NLS - skCase.closeRunQuery(rs); - - rs = skCase.runQuery("DELETE from blackboard_artifacts where artifact_id = " + Long.toString(artId)); //NON-NLS - skCase.closeRunQuery(rs); - - } catch (SQLException ex) { - logger.log(Level.WARNING, "Could not delete artifact by id: " + artId, ex); //NON-NLS - } - - } - - - @SuppressWarnings("deprecation") - private static void deleteArtifactsByAttributeValue(BlackboardArtifact.ARTIFACT_TYPE artType, - BlackboardAttribute.ATTRIBUTE_TYPE attrType, String value) { - - final SleuthkitCase skCase = Case.getCurrentCase().getSleuthkitCase(); - ResultSet rs = null; - try { - //first to select to get artifact ids to delete - //then join delete attrs - //then delete arts by id - rs = skCase.runQuery("DELETE FROM blackboard_attributes WHERE artifact_id IN " //NON-NLS - + "(SELECT blackboard_artifacts.artifact_id FROM blackboard_artifacts " //NON-NLS - + "INNER JOIN blackboard_attributes ON (blackboard_attributes.artifact_id = blackboard_artifacts.artifact_id) " //NON-NLS - + "WHERE blackboard_artifacts.artifact_type_id = " //NON-NLS - + Integer.toString(artType.getTypeID()) - + " AND blackboard_attributes.attribute_type_id = " + Integer.toString(attrType.getTypeID()) //NON-NLS - + " AND blackboard_attributes.value_type = " + BlackboardAttribute.TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE.STRING.getType() //NON-NLS - + " AND blackboard_attributes.value_text = '" + value + "'" //NON-NLS - + ")"); - - - //rs = skCase.runQuery("DELETE from blackboard_artifacts where artifact_type_id = " - // + Integer.toString(artType.getTypeID())); - //skCase.closeRunQuery(rs); - - } catch (SQLException ex) { - logger.log(Level.WARNING, "Could not delete artifacts by type id: " + artType.getTypeID(), ex); //NON-NLS - } - finally { - if (rs != null) { - try { - skCase.closeRunQuery(rs); - } catch (SQLException ex) { - logger.log(Level.WARNING, "Error closing result set after deleting", ex); //NON-NLS - } - } - } - - } - - //TODO should be moved to SleuthkitCase - @SuppressWarnings("deprecation") - private static void deleteArtifacts(BlackboardArtifact.ARTIFACT_TYPE artType) { - // SELECT * from blackboard_attributes INNER JOIN blackboard_artifacts ON blackboard_artifacts.artifact_id = blackboard_attributes.artifact_ID AND blackboard_artifacts.artifact_type_id = 9; - final SleuthkitCase skCase = Case.getCurrentCase().getSleuthkitCase(); - try { - ResultSet rs = skCase.runQuery("DELETE FROM blackboard_attributes WHERE artifact_id IN " //NON-NLS - + "(SELECT blackboard_artifacts.artifact_id FROM blackboard_artifacts " //NON-NLS - + "INNER JOIN blackboard_attributes ON (blackboard_attributes.artifact_id = blackboard_artifacts.artifact_id) " //NON-NLS - + "WHERE blackboard_artifacts.artifact_type_id = " //NON-NLS - + Integer.toString(artType.getTypeID()) - + ")"); - skCase.closeRunQuery(rs); - - rs = skCase.runQuery("DELETE from blackboard_artifacts where artifact_type_id = " //NON-NLS - + Integer.toString(artType.getTypeID())); - skCase.closeRunQuery(rs); - - } catch (SQLException ex) { - logger.log(Level.WARNING, "Could not delete artifacts by type id: " + artType.getTypeID(), ex); //NON-NLS - } - } -} From 33b463cd168ef724661c11f20a57cf7b9f90d01d Mon Sep 17 00:00:00 2001 From: Brian Carrier Date: Mon, 5 May 2014 01:07:58 -0400 Subject: [PATCH 03/59] interim commit of refresh updates in tree. Still need to do interestingitems. --- .../sleuthkit/autopsy/actions/TagAction.java | 4 +- .../datamodel/AbstractContentChildren.java | 13 +- .../autopsy/datamodel/AutopsyItemVisitor.java | 2 - .../datamodel/BlackboardArtifactNode.java | 4 +- .../datamodel/DisplayableItemNodeVisitor.java | 58 +-- .../autopsy/datamodel/EmailExtracted.java | 440 ++++++++++------- .../autopsy/datamodel/ExtractedContent.java | 359 +++++++++++++- .../autopsy/datamodel/HashsetHits.java | 249 +++++++--- .../autopsy/datamodel/InterestingHits.java | 20 +- .../autopsy/datamodel/KeywordHits.java | 454 +++++++++++------- .../datamodel/RootContentChildren.java | 6 +- .../autopsy/datamodel/TagNameNode.java | 25 +- .../sleuthkit/autopsy/datamodel/TagsNode.java | 35 +- .../directorytree/DataResultFilterNode.java | 48 +- .../DirectoryTreeTopComponent.java | 48 +- .../netbeans/core/startup/Bundle.properties | 2 +- .../core/windows/view/ui/Bundle.properties | 2 +- 17 files changed, 1224 insertions(+), 545 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/actions/TagAction.java b/Core/src/org/sleuthkit/autopsy/actions/TagAction.java index 376e52ce62..0b454bd4a5 100755 --- a/Core/src/org/sleuthkit/autopsy/actions/TagAction.java +++ b/Core/src/org/sleuthkit/autopsy/actions/TagAction.java @@ -50,13 +50,13 @@ import org.sleuthkit.datamodel.BlackboardArtifact; protected void refreshDirectoryTree() { // The way the "directory tree" currently works, a new tags sub-tree // needs to be made to reflect the results of invoking tag Actions. The - // way to do this is to call DirectoryTreeTopComponent.refreshTree(), + // way to do this is to call DirectoryTreeTopComponent.refreshResultsTree(), // which calls RootContentChildren.refreshKeys(BlackboardArtifact.ARTIFACT_TYPE... types) // for the RootContentChildren object that is the child factory for the // ResultsNode that is the root of the tags sub-tree. There is a switch // statement in RootContentChildren.refreshKeys() that maps both // BlackboardArtifact.ARTIFACT_TYPE.TSK_TAG_FILE and BlackboardArtifact.ARTIFACT_TYPE.TSK_TAG_ARTIFACT // to making a call to refreshKey(TagsNodeKey). - DirectoryTreeTopComponent.findInstance().refreshTree(BlackboardArtifact.ARTIFACT_TYPE.TSK_TAG_FILE); + DirectoryTreeTopComponent.findInstance().refreshResultsTree(BlackboardArtifact.ARTIFACT_TYPE.TSK_TAG_FILE); } } diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/AbstractContentChildren.java b/Core/src/org/sleuthkit/autopsy/datamodel/AbstractContentChildren.java index 539fb1e1fc..cd066a0a64 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/AbstractContentChildren.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/AbstractContentChildren.java @@ -22,7 +22,6 @@ import org.openide.nodes.AbstractNode; import org.openide.nodes.Children.Keys; import org.openide.nodes.Node; import org.openide.util.NbBundle; -import org.sleuthkit.autopsy.datamodel.KeywordHits.KeywordHitsRootNode; import org.sleuthkit.datamodel.Content; import org.sleuthkit.datamodel.DerivedFile; import org.sleuthkit.datamodel.Directory; @@ -119,8 +118,8 @@ abstract class AbstractContentChildren extends Keys { static class CreateAutopsyNodeVisitor extends AutopsyItemVisitor.Default { @Override - public ExtractedContentNode visit(ExtractedContent ec) { - return new ExtractedContentNode(ec.getSleuthkitCase()); + public ExtractedContent.RootNode visit(ExtractedContent ec) { + return ec.new RootNode(ec.getSleuthkitCase()); } @Override @@ -145,22 +144,22 @@ abstract class AbstractContentChildren extends Keys { @Override public AbstractNode visit(KeywordHits kh) { - return kh.new KeywordHitsRootNode(); + return kh.new RootNode(); } @Override public AbstractNode visit(HashsetHits hh) { - return hh.new HashsetHitsRootNode(); + return hh.new RootNode(); } @Override public AbstractNode visit(InterestingHits ih) { - return ih.new InterestingHitsRootNode(); + return ih.new RootNode(); } @Override public AbstractNode visit(EmailExtracted ee) { - return ee.new EmailExtractedRootNode(); + return ee.new RootNode(); } @Override diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/AutopsyItemVisitor.java b/Core/src/org/sleuthkit/autopsy/datamodel/AutopsyItemVisitor.java index 3a53552739..1f4ab0a94e 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/AutopsyItemVisitor.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/AutopsyItemVisitor.java @@ -19,8 +19,6 @@ package org.sleuthkit.autopsy.datamodel; /** - * - * @author dfickling */ interface AutopsyItemVisitor { diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java index 9cebc3a51c..69af7dccaf 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java @@ -41,8 +41,8 @@ import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.datamodel.TskException; /** - * Node wrapping a blackboard artifact object. This represents a single artifact. - * Its parent is typically an ArtifactTypeNode. + * Node wrapping a blackboard artifact object. This is generated from several + * places in the tree. */ public class BlackboardArtifactNode extends DisplayableItemNode { diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/DisplayableItemNodeVisitor.java b/Core/src/org/sleuthkit/autopsy/datamodel/DisplayableItemNodeVisitor.java index 88921891fd..60b2a50e48 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/DisplayableItemNodeVisitor.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/DisplayableItemNodeVisitor.java @@ -20,18 +20,8 @@ package org.sleuthkit.autopsy.datamodel; import org.sleuthkit.autopsy.datamodel.DeletedContent.DeletedContentsChildren.DeletedContentNode; import org.sleuthkit.autopsy.datamodel.DeletedContent.DeletedContentsNode; -import org.sleuthkit.autopsy.datamodel.EmailExtracted.EmailExtractedAccountNode; -import org.sleuthkit.autopsy.datamodel.EmailExtracted.EmailExtractedFolderNode; -import org.sleuthkit.autopsy.datamodel.EmailExtracted.EmailExtractedRootNode; import org.sleuthkit.autopsy.datamodel.FileSize.FileSizeRootChildren.FileSizeNode; import org.sleuthkit.autopsy.datamodel.FileSize.FileSizeRootNode; -import org.sleuthkit.autopsy.datamodel.HashsetHits.HashsetHitsRootNode; -import org.sleuthkit.autopsy.datamodel.HashsetHits.HashsetHitsSetNode; -import org.sleuthkit.autopsy.datamodel.InterestingHits.InterestingHitsRootNode; -import org.sleuthkit.autopsy.datamodel.InterestingHits.InterestingHitsSetNode; -import org.sleuthkit.autopsy.datamodel.KeywordHits.KeywordHitsKeywordNode; -import org.sleuthkit.autopsy.datamodel.KeywordHits.KeywordHitsListNode; -import org.sleuthkit.autopsy.datamodel.KeywordHits.KeywordHitsRootNode; import org.sleuthkit.autopsy.directorytree.BlackboardArtifactTagTypeNode; /** @@ -49,9 +39,9 @@ public interface DisplayableItemNodeVisitor { T visit(BlackboardArtifactNode ban); - T visit(ArtifactTypeNode atn); + T visit(ExtractedContent.TypeNode atn); - T visit(ExtractedContentNode ecn); + T visit(ExtractedContent.RootNode ecn); T visit(FileTypeNode fsfn); @@ -69,27 +59,27 @@ public interface DisplayableItemNodeVisitor { T visit(RecentFilesFilterNode rffn); - T visit(KeywordHitsRootNode khrn); + T visit(KeywordHits.RootNode khrn); - T visit(KeywordHitsListNode khsn); + T visit(KeywordHits.ListNode khsn); - T visit(KeywordHitsKeywordNode khmln); + T visit(KeywordHits.TermNode khmln); - T visit(HashsetHitsRootNode hhrn); + T visit(HashsetHits.RootNode hhrn); - T visit(HashsetHitsSetNode hhsn); + T visit(HashsetHits.HashsetNameNode hhsn); - T visit(EmailExtractedRootNode eern); + T visit(EmailExtracted.RootNode eern); - T visit(EmailExtractedAccountNode eean); + T visit(EmailExtracted.AccountNode eean); - T visit(EmailExtractedFolderNode eefn); + T visit(EmailExtracted.FolderNode eefn); T visit(TagsNode node); - T visit(InterestingHitsRootNode ihrn); + T visit(InterestingHits.RootNode ihrn); - T visit(InterestingHitsSetNode ihsn); + T visit(InterestingHits.SetNameNode ihsn); T visit(TagNameNode node); @@ -155,12 +145,12 @@ public interface DisplayableItemNodeVisitor { } @Override - public T visit(ArtifactTypeNode atn) { + public T visit(ExtractedContent.TypeNode atn) { return defaultVisit(atn); } @Override - public T visit(ExtractedContentNode ecn) { + public T visit(ExtractedContent.RootNode ecn) { return defaultVisit(ecn); } @@ -205,17 +195,17 @@ public interface DisplayableItemNodeVisitor { } @Override - public T visit(KeywordHitsRootNode khrn) { + public T visit(KeywordHits.RootNode khrn) { return defaultVisit(khrn); } @Override - public T visit(KeywordHitsListNode khsn) { + public T visit(KeywordHits.ListNode khsn) { return defaultVisit(khsn); } @Override - public T visit(KeywordHitsKeywordNode khmln) { + public T visit(KeywordHits.TermNode khmln) { return defaultVisit(khmln); } @@ -235,37 +225,37 @@ public interface DisplayableItemNodeVisitor { } @Override - public T visit(HashsetHitsRootNode hhrn) { + public T visit(HashsetHits.RootNode hhrn) { return defaultVisit(hhrn); } @Override - public T visit(HashsetHitsSetNode hhsn) { + public T visit(HashsetHits.HashsetNameNode hhsn) { return defaultVisit(hhsn); } @Override - public T visit(InterestingHitsRootNode ihrn) { + public T visit(InterestingHits.RootNode ihrn) { return defaultVisit(ihrn); } @Override - public T visit(InterestingHitsSetNode ihsn) { + public T visit(InterestingHits.SetNameNode ihsn) { return defaultVisit(ihsn); } @Override - public T visit(EmailExtractedRootNode eern) { + public T visit(EmailExtracted.RootNode eern) { return defaultVisit(eern); } @Override - public T visit(EmailExtractedAccountNode eean) { + public T visit(EmailExtracted.AccountNode eean) { return defaultVisit(eean); } @Override - public T visit(EmailExtractedFolderNode eefn) { + public T visit(EmailExtracted.FolderNode eefn) { return defaultVisit(eefn); } diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/EmailExtracted.java b/Core/src/org/sleuthkit/autopsy/datamodel/EmailExtracted.java index 7e0d8801f4..5d60ce4fa8 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/EmailExtracted.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/EmailExtracted.java @@ -18,6 +18,8 @@ */ package org.sleuthkit.autopsy.datamodel; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; @@ -25,6 +27,9 @@ import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Observable; +import java.util.Observer; +import java.util.Set; import java.util.logging.Level; import org.openide.util.NbBundle; @@ -34,11 +39,14 @@ import org.openide.nodes.Children; import org.openide.nodes.Node; import org.openide.nodes.Sheet; import org.openide.util.lookup.Lookups; +import org.sleuthkit.autopsy.ingest.IngestManager; +import org.sleuthkit.autopsy.ingest.ModuleDataEvent; import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.BlackboardAttribute; import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.TskException; + /** * Support for TSK_EMAIL_MSG nodes and displaying emails in the directory tree * Email messages are grouped into parent folders, and the folders are grouped @@ -54,64 +62,85 @@ public class EmailExtracted implements AutopsyVisitableItem { private static final String MAIL_FOLDER = NbBundle.getMessage(EmailExtracted.class, "EmailExtracted.mailFolder.text"); private static final String MAIL_PATH_SEPARATOR = "/"; private SleuthkitCase skCase; - private Map>> accounts; + private EmailResults emailResults; + public EmailExtracted(SleuthkitCase skCase) { this.skCase = skCase; - accounts = new LinkedHashMap<>(); + emailResults = new EmailResults(); } - - @SuppressWarnings("deprecation") - private void initArtifacts() { - accounts.clear(); - try { - int artId = BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG.getTypeID(); - int pathAttrId = BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PATH.getTypeID(); - String query = "SELECT value_text,blackboard_attributes.artifact_id,attribute_type_id " //NON-NLS - + "FROM blackboard_attributes,blackboard_artifacts WHERE " //NON-NLS - + "attribute_type_id=" + pathAttrId //NON-NLS - + " AND blackboard_attributes.artifact_id=blackboard_artifacts.artifact_id" //NON-NLS - + " AND blackboard_artifacts.artifact_type_id=" + artId; //NON-NLS - ResultSet rs = skCase.runQuery(query); - while (rs.next()) { - final String path = rs.getString("value_text"); //NON-NLS - final long artifactId = rs.getLong("artifact_id"); //NON-NLS - final Map parsedPath = parsePath(path); - final String account = parsedPath.get(MAIL_ACCOUNT); - final String folder = parsedPath.get(MAIL_FOLDER); - - Map> folders = accounts.get(account); - if (folders == null) { - folders = new LinkedHashMap<>(); - accounts.put(account, folders); - } - List messages = folders.get(folder); - if (messages == null) { - messages = new ArrayList<>(); - folders.put(folder, messages); - } - messages.add(artifactId); - } - skCase.closeRunQuery(rs); - - } catch (SQLException ex) { - logger.log(Level.WARNING, "Cannot initialize email extraction", ex); //NON-NLS + + private final class EmailResults extends Observable { + private Map>> accounts = new LinkedHashMap<>(); + + EmailResults() { + update(); } - } + + public Set getAccounts() { + return accounts.keySet(); + } + + public Set getFolders(String account) { + return accounts.get(account).keySet(); + } + + public List getArtifactIds(String account, String folder) { + return accounts.get(account).get(folder); + } + + public void update() { + accounts.clear(); + try { + int artId = BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG.getTypeID(); + int pathAttrId = BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PATH.getTypeID(); + String query = "SELECT value_text,blackboard_attributes.artifact_id,attribute_type_id " //NON-NLS + + "FROM blackboard_attributes,blackboard_artifacts WHERE " //NON-NLS + + "attribute_type_id=" + pathAttrId //NON-NLS + + " AND blackboard_attributes.artifact_id=blackboard_artifacts.artifact_id" //NON-NLS + + " AND blackboard_artifacts.artifact_type_id=" + artId; //NON-NLS + ResultSet rs = skCase.runQuery(query); + while (rs.next()) { + final String path = rs.getString("value_text"); //NON-NLS + final long artifactId = rs.getLong("artifact_id"); //NON-NLS + final Map parsedPath = parsePath(path); + final String account = parsedPath.get(MAIL_ACCOUNT); + final String folder = parsedPath.get(MAIL_FOLDER); - private static Map parsePath(String path) { - Map parsed = new HashMap<>(); - String[] split = path.split(MAIL_PATH_SEPARATOR); - if (split.length < 4) { - logger.log(Level.WARNING, "Unexpected number of tokens when parsing email PATH: {0}, will use defaults", split.length); //NON-NLS - parsed.put(MAIL_ACCOUNT, NbBundle.getMessage(EmailExtracted.class, "EmailExtracted.defaultAcct.text")); - parsed.put(MAIL_FOLDER, NbBundle.getMessage(EmailExtracted.class, "EmailExtracted.defaultFolder.text")); + Map> folders = accounts.get(account); + if (folders == null) { + folders = new LinkedHashMap<>(); + accounts.put(account, folders); + } + List messages = folders.get(folder); + if (messages == null) { + messages = new ArrayList<>(); + folders.put(folder, messages); + } + messages.add(artifactId); + } + skCase.closeRunQuery(rs); + + } catch (SQLException ex) { + logger.log(Level.WARNING, "Cannot initialize email extraction", ex); //NON-NLS + } + } + + + private Map parsePath(String path) { + Map parsed = new HashMap<>(); + String[] split = path.split(MAIL_PATH_SEPARATOR); + if (split.length < 4) { + logger.log(Level.WARNING, "Unexpected number of tokens when parsing email PATH: {0}, will use defaults", split.length); //NON-NLS + parsed.put(MAIL_ACCOUNT, NbBundle.getMessage(EmailExtracted.class, "EmailExtracted.defaultAcct.text")); + parsed.put(MAIL_FOLDER, NbBundle.getMessage(EmailExtracted.class, "EmailExtracted.defaultFolder.text")); + return parsed; + } + + parsed.put(MAIL_ACCOUNT, split[2]); + parsed.put(MAIL_FOLDER, split[3]); return parsed; } - - parsed.put(MAIL_ACCOUNT, split[2]); - parsed.put(MAIL_FOLDER, split[3]); - return parsed; } @Override @@ -122,94 +151,94 @@ public class EmailExtracted implements AutopsyVisitableItem { /** * Mail root node showing all emails */ - public class EmailExtractedRootNodeFlat extends DisplayableItemNode { - - public EmailExtractedRootNodeFlat() { - super(Children.create(new EmailExtractedRootChildrenFlat(), true), Lookups.singleton(DISPLAY_NAME)); - super.setName(LABEL_NAME); - super.setDisplayName(DISPLAY_NAME); - this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/mail-icon-16.png"); //NON-NLS - initArtifacts(); - } - - @Override - public boolean isLeafTypeNode() { - return false; - } - - @Override - public T accept(DisplayableItemNodeVisitor v) { - //return v.visit(this); - return null; - } - - @Override - protected Sheet createSheet() { - Sheet s = super.createSheet(); - Sheet.Set ss = s.get(Sheet.PROPERTIES); - if (ss == null) { - ss = Sheet.createPropertiesSet(); - s.put(ss); - } - - ss.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "EmailExtracted.createSheet.name.name"), - NbBundle.getMessage(this.getClass(), "EmailExtracted.createSheet.name.displayName"), - NbBundle.getMessage(this.getClass(), "EmailExtracted.createSheet.name.desc"), - getName())); - return s; - } - } - - /** - * Mail root child node showing flattened emails - */ - private class EmailExtractedRootChildrenFlat extends ChildFactory { - - private EmailExtractedRootChildrenFlat() { - super(); - } - - @Override - protected boolean createKeys(List list) { - //flatten all emails - List tempList = new ArrayList<>(); - for (String account : accounts.keySet()) { - Map> folders = accounts.get(account); - for (String folder : folders.keySet()) { - List messages = folders.get(folder); - for (long l : messages) { - try { - //TODO: bulk artifact gettings - tempList.add(skCase.getBlackboardArtifact(l)); - } catch (TskException ex) { - logger.log(Level.WARNING, "Error creating mail messages nodes", ex); //NON-NLS - } - } - } - } - - list.addAll(tempList); - return true; - } - - @Override - protected Node createNodeForKey(BlackboardArtifact artifact) { - return new BlackboardArtifactNode(artifact); - } - } +// public class FlatRootNode extends DisplayableItemNode { +// +// public FlatRootNode() { +// super(Children.create(new FlatRootFactory(), true), Lookups.singleton(DISPLAY_NAME)); +// super.setName(LABEL_NAME); +// super.setDisplayName(DISPLAY_NAME); +// this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/mail-icon-16.png"); //NON-NLS +// initArtifacts(); +// } +// +// @Override +// public boolean isLeafTypeNode() { +// return false; +// } +// +// @Override +// public T accept(DisplayableItemNodeVisitor v) { +// //return v.visit(this); +// return null; +// } +// +// @Override +// protected Sheet createSheet() { +// Sheet s = super.createSheet(); +// Sheet.Set ss = s.get(Sheet.PROPERTIES); +// if (ss == null) { +// ss = Sheet.createPropertiesSet(); +// s.put(ss); +// } +// +// ss.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "EmailExtracted.createSheet.name.name"), +// NbBundle.getMessage(this.getClass(), "EmailExtracted.createSheet.name.displayName"), +// NbBundle.getMessage(this.getClass(), "EmailExtracted.createSheet.name.desc"), +// getName())); +// return s; +// } +// } +// +// /** +// * Mail root child node showing flattened emails +// */ +// private class FlatRootFactory extends ChildFactory { +// +// private FlatRootFactory() { +// super(); +// } +// +// @Override +// protected boolean createKeys(List list) { +// //flatten all emails +// List tempList = new ArrayList<>(); +// for (String account : accounts.keySet()) { +// Map> folders = accounts.get(account); +// for (String folder : folders.keySet()) { +// List messages = folders.get(folder); +// for (long l : messages) { +// try { +// //TODO: bulk artifact gettings +// tempList.add(skCase.getBlackboardArtifact(l)); +// } catch (TskException ex) { +// logger.log(Level.WARNING, "Error creating mail messages nodes", ex); //NON-NLS +// } +// } +// } +// } +// +// list.addAll(tempList); +// return true; +// } +// +// @Override +// protected Node createNodeForKey(BlackboardArtifact artifact) { +// return new BlackboardArtifactNode(artifact); +// } +// } /** * Mail root node grouping all mail accounts, supports account-> folder * structure */ - public class EmailExtractedRootNode extends DisplayableItemNode { + public class RootNode extends DisplayableItemNode { - public EmailExtractedRootNode() { - super(Children.create(new EmailExtractedRootChildren(), true), Lookups.singleton(DISPLAY_NAME)); + public RootNode() { + super(Children.create(new AccountFactory(), true), Lookups.singleton(DISPLAY_NAME)); super.setName(LABEL_NAME); super.setDisplayName(DISPLAY_NAME); this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/mail-icon-16.png"); //NON-NLS - initArtifacts(); + emailResults.update(); } @Override @@ -220,7 +249,6 @@ public class EmailExtracted implements AutopsyVisitableItem { @Override public T accept(DisplayableItemNodeVisitor v) { return v.visit(this); - //return null; } @Override @@ -244,30 +272,74 @@ public class EmailExtracted implements AutopsyVisitableItem { /** * Mail root child node creating each account node */ - private class EmailExtractedRootChildren extends ChildFactory { + private class AccountFactory extends ChildFactory.Detachable implements Observer { + + /* The pcl is in the class because it has the easiest mechanisms to add and remove itself + * during its life cycles. + */ + private final PropertyChangeListener pcl = new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + String eventType = evt.getPropertyName(); + + if (eventType.equals(IngestManager.IngestEvent.DATA.toString())) { + if (((ModuleDataEvent) evt.getOldValue()).getArtifactType() == BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG) { + emailResults.update(); + } + } + else if (eventType.equals(IngestManager.IngestEvent.INGEST_JOB_COMPLETED.toString()) + || eventType.equals(IngestManager.IngestEvent.INGEST_JOB_CANCELLED.toString())) { + emailResults.update(); + } + } + }; + + @Override + protected void addNotify() { + IngestManager.addPropertyChangeListener(pcl); + emailResults.addObserver(this); + } + @Override + protected void removeNotify() { + IngestManager.removePropertyChangeListener(pcl); + emailResults.deleteObserver(this); + } + @Override protected boolean createKeys(List list) { - list.addAll(accounts.keySet()); + list.addAll(emailResults.getAccounts()); return true; } @Override protected Node createNodeForKey(String key) { - return new EmailExtractedAccountNode(key, accounts.get(key)); + return new AccountNode(key); + } + + @Override + public void update(Observable o, Object arg) { + refresh(true); } } /** * Account node representation */ - public class EmailExtractedAccountNode extends DisplayableItemNode { - - public EmailExtractedAccountNode(String name, Map> children) { - super(Children.create(new EmailExtractedAccountChildrenNode(children), true), Lookups.singleton(name)); - super.setName(name); - super.setDisplayName(name + " (" + children.size() + ")"); + public class AccountNode extends DisplayableItemNode implements Observer { + private String accountName; + + public AccountNode(String accountName) { + super(Children.create(new FolderFactory(accountName), true), Lookups.singleton(accountName)); + super.setName(accountName); + this.accountName = accountName; this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/account-icon-16.png"); //NON-NLS + updateDisplayName(); + emailResults.addObserver(this); + } + + private void updateDisplayName() { + super.setDisplayName(accountName + " (" + emailResults.getFolders(accountName) + ")"); } @Override @@ -296,43 +368,61 @@ public class EmailExtracted implements AutopsyVisitableItem { public T accept(DisplayableItemNodeVisitor v) { return v.visit(this); } + + @Override + public void update(Observable o, Object arg) { + updateDisplayName(); + } } /** * Account node child creating sub nodes for every folder */ - private class EmailExtractedAccountChildrenNode extends ChildFactory { + private class FolderFactory extends ChildFactory implements Observer { - private Map> folders; + private String accountName; - private EmailExtractedAccountChildrenNode(Map> folders) { + private FolderFactory(String accountName) { super(); - this.folders = folders; + this.accountName = accountName; + emailResults.addObserver(this); } @Override protected boolean createKeys(List list) { - list.addAll(folders.keySet()); - + list.addAll(emailResults.getFolders(accountName)); return true; } @Override - protected Node createNodeForKey(String key) { - return new EmailExtractedFolderNode(key, folders.get(key)); + protected Node createNodeForKey(String folderName) { + return new FolderNode(accountName, folderName); + } + + @Override + public void update(Observable o, Object arg) { + refresh(true); } } /** * Node representing mail folder */ - public class EmailExtractedFolderNode extends DisplayableItemNode { - - public EmailExtractedFolderNode(String name, List children) { - super(Children.create(new EmailExtractedFolderChildrenNode(children), true), Lookups.singleton(name)); - super.setName(name); - super.setDisplayName(name + " (" + children.size() + ")"); + public class FolderNode extends DisplayableItemNode implements Observer { + private String accountName; + private String folderName; + + public FolderNode(String accountName, String folderName) { + super(Children.create(new MessageFactory(accountName, folderName), true), Lookups.singleton(accountName)); + super.setName(folderName); this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/folder-icon-16.png"); //NON-NLS + updateDisplayName(); + emailResults.addObserver(this); + } + + private void updateDisplayName() { + super.setDisplayName(folderName + " (" + emailResults.getArtifactIds(accountName, folderName).size() + ")"); + } @Override @@ -361,38 +451,48 @@ public class EmailExtracted implements AutopsyVisitableItem { public T accept(DisplayableItemNodeVisitor v) { return v.visit(this); } + + @Override + public void update(Observable o, Object arg) { + updateDisplayName(); + } } /** * Node representing mail folder content (mail messages) */ - private class EmailExtractedFolderChildrenNode extends ChildFactory { + private class MessageFactory extends ChildFactory implements Observer { - private List messages; + private String accountName; + private String folderName; - private EmailExtractedFolderChildrenNode(List messages) { + private MessageFactory(String accountName, String folderName) { super(); - this.messages = messages; + this.accountName = accountName; + this.folderName = folderName; + emailResults.addObserver(this); } @Override - protected boolean createKeys(List list) { - List tempList = new ArrayList<>(); - for (long l : messages) { - try { - //TODO: bulk artifact gettings - tempList.add(skCase.getBlackboardArtifact(l)); - } catch (TskException ex) { - logger.log(Level.WARNING, "Error creating mail messages nodes", ex); //NON-NLS - } - } - list.addAll(tempList); + protected boolean createKeys(List list) { + list.addAll(emailResults.getArtifactIds(accountName, folderName)); return true; } @Override - protected Node createNodeForKey(BlackboardArtifact artifact) { - return new BlackboardArtifactNode(artifact); + protected Node createNodeForKey(Long artifactId) { + try { + BlackboardArtifact artifact = skCase.getBlackboardArtifact(artifactId); + return new BlackboardArtifactNode(artifact); + } catch (TskException ex) { + logger.log(Level.WARNING, "Error creating mail messages nodes", ex); //NON-NLS + } + return null; + } + + @Override + public void update(Observable o, Object arg) { + refresh(true); } } } diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContent.java b/Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContent.java index 394eb2228e..2be34d8cae 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContent.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContent.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011 Basis Technology Corp. + * Copyright 2011-2014 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -18,17 +18,59 @@ */ package org.sleuthkit.autopsy.datamodel; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.logging.Level; +import org.openide.nodes.ChildFactory; +import org.openide.nodes.Children; +import org.openide.nodes.Node; +import org.openide.nodes.Sheet; +import org.openide.util.NbBundle; +import org.openide.util.lookup.Lookups; +import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.autopsy.ingest.IngestManager; +import org.sleuthkit.autopsy.ingest.ModuleDataEvent; +import org.sleuthkit.datamodel.BlackboardArtifact; +import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_BLUETOOTH_PAIRING; +import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_CALENDAR_ENTRY; +import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_CALLLOG; +import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_CONTACT; +import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_DEVICE_ATTACHED; +import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_ENCRYPTION_DETECTED; +import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_EXT_MISMATCH_DETECTED; +import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_BOOKMARK; +import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_LAST_KNOWN_LOCATION; +import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_SEARCH; +import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_INSTALLED_PROG; +import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_MESSAGE; +import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_METADATA_EXIF; +import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_RECENT_OBJECT; +import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_SERVICE_ACCOUNT; +import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_SPEED_DIAL_ENTRY; +import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_BOOKMARK; +import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_COOKIE; +import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_DOWNLOAD; +import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_HISTORY; +import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_SEARCH_QUERY; import org.sleuthkit.datamodel.SleuthkitCase; +import org.sleuthkit.datamodel.TskCoreException; +import org.sleuthkit.datamodel.TskException; /** - * Parent of the "extracted content" artifacts to be displayed in the tree. Other - * artifacts are displayed under other more specific parents. + * Parent of the "extracted content" artifacts to be displayed in the tree. + * Other artifacts are displayed under other more specific parents. */ - class ExtractedContent implements AutopsyVisitableItem{ +public class ExtractedContent implements AutopsyVisitableItem { - SleuthkitCase skCase; + private SleuthkitCase skCase; + public static final String NAME = NbBundle.getMessage(RootNode.class, "ExtractedContentNode.name.text"); - public ExtractedContent(SleuthkitCase skCase){ + public ExtractedContent(SleuthkitCase skCase) { this.skCase = skCase; } @@ -37,7 +79,310 @@ import org.sleuthkit.datamodel.SleuthkitCase; return v.visit(this); } - public SleuthkitCase getSleuthkitCase(){ + public SleuthkitCase getSleuthkitCase() { return skCase; } + + public class RootNode extends DisplayableItemNode { + + public RootNode(SleuthkitCase skCase) { + super(Children.create(new TypeFactory(skCase), true), Lookups.singleton(NAME)); + super.setName(NAME); + super.setDisplayName(NAME); + this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/extracted_content.png"); //NON-NLS + } + + @Override + public boolean isLeafTypeNode() { + return false; + } + + @Override + public T accept(DisplayableItemNodeVisitor v) { + return v.visit(this); + } + + @Override + protected Sheet createSheet() { + Sheet s = super.createSheet(); + Sheet.Set ss = s.get(Sheet.PROPERTIES); + if (ss == null) { + ss = Sheet.createPropertiesSet(); + s.put(ss); + } + + ss.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "ExtractedContentNode.createSheet.name.name"), + NbBundle.getMessage(this.getClass(), "ExtractedContentNode.createSheet.name.displayName"), + NbBundle.getMessage(this.getClass(), "ExtractedContentNode.createSheet.name.desc"), + NAME)); + return s; + } + } + + /** + * Creates the children for the ExtractedContent area of the results tree. + * This area has all of the blackboard artifacts that are not displayed in a + * more specific form elsewhere in the tree. + */ + private class TypeFactory extends ChildFactory.Detachable { + + private SleuthkitCase skCase; + private final ArrayList doNotShow; + // maps the artifact type to its child node + private HashMap typeNodeList = new HashMap<>(); + + public TypeFactory(SleuthkitCase skCase) { + super(); + this.skCase = skCase; + + // these are shown in other parts of the UI tree + doNotShow = new ArrayList<>(); + doNotShow.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_GEN_INFO); + doNotShow.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG); + doNotShow.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT); + doNotShow.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT); + doNotShow.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_TAG_ARTIFACT); + doNotShow.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_TAG_FILE); + doNotShow.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT); + doNotShow.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_ARTIFACT_HIT); + } + + private final PropertyChangeListener pcl = new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + String eventType = evt.getPropertyName(); + + if (eventType.equals(IngestManager.IngestEvent.DATA.toString())) { + final ModuleDataEvent event = (ModuleDataEvent) evt.getOldValue(); + if (doNotShow.contains(event.getArtifactType()) == false) { + refresh(true); + } + } else if (eventType.equals(IngestManager.IngestEvent.INGEST_JOB_COMPLETED.toString()) + || eventType.equals(IngestManager.IngestEvent.INGEST_JOB_CANCELLED.toString())) { + refresh(true); + } + } + }; + + @Override + protected void addNotify() { + IngestManager.addPropertyChangeListener(pcl); + } + + @Override + protected void removeNotify() { + IngestManager.removePropertyChangeListener(pcl); + typeNodeList.clear(); + } + + @Override + protected boolean createKeys(List list) { + try { + List inUse = skCase.getBlackboardArtifactTypesInUse(); + inUse.removeAll(doNotShow); + Collections.sort(inUse, + new Comparator() { + @Override + public int compare(BlackboardArtifact.ARTIFACT_TYPE a, BlackboardArtifact.ARTIFACT_TYPE b) { + return a.getDisplayName().compareTo(b.getDisplayName()); + } + }); + list.addAll(inUse); + + // the create node method will get called only for new types + // refresh the counts if we already created them from a previous update + for (BlackboardArtifact.ARTIFACT_TYPE art : inUse) { + TypeNode node = typeNodeList.get(art); + if (node != null) { + node.updateDisplayName(); + } + } + } catch (TskCoreException ex) { + Logger.getLogger(TypeFactory.class.getName()).log(Level.SEVERE, "Error getting list of artifacts in use: " + ex.getLocalizedMessage()); //NON-NLS + return false; + } + return true; + } + + @Override + protected Node createNodeForKey(BlackboardArtifact.ARTIFACT_TYPE key) { + TypeNode node = new TypeNode(key, skCase); + typeNodeList.put(key, node); + return node; + } + } + + /** + * Node encapsulating blackboard artifact type. This is used on the + * left-hand navigation side of the Autopsy UI as the parent node for all of + * the artifacts of a given type. Its children will be + * BlackboardArtifactNode objects. + */ + public class TypeNode extends DisplayableItemNode { + + private BlackboardArtifact.ARTIFACT_TYPE type; + private long childCount = 0; + private SleuthkitCase skCase; + + TypeNode(BlackboardArtifact.ARTIFACT_TYPE type, SleuthkitCase skCase) { + super(Children.create(new ArtifactFactory(type, skCase), true), Lookups.singleton(type.getDisplayName())); + super.setName(type.getLabel()); + this.skCase = skCase; + this.type = type; + this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/" + getIcon(type)); //NON-NLS + updateDisplayName(); + } + + final void updateDisplayName() { + // NOTE: This completely destroys our lazy-loading ideal + // a performance increase might be had by adding a + // "getBlackboardArtifactCount()" method to skCase + try { + this.childCount = skCase.getBlackboardArtifactsTypeCount(type.getTypeID()); + } catch (TskException ex) { + Logger.getLogger(TypeNode.class.getName()) + .log(Level.WARNING, "Error getting child count", ex); //NON-NLS + } + super.setDisplayName(type.getDisplayName() + " (" + childCount + ")"); + } + + @Override + protected Sheet createSheet() { + Sheet s = super.createSheet(); + Sheet.Set ss = s.get(Sheet.PROPERTIES); + if (ss == null) { + ss = Sheet.createPropertiesSet(); + s.put(ss); + } + + ss.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "ArtifactTypeNode.createSheet.artType.name"), + NbBundle.getMessage(this.getClass(), "ArtifactTypeNode.createSheet.artType.displayName"), + NbBundle.getMessage(this.getClass(), "ArtifactTypeNode.createSheet.artType.desc"), + type.getDisplayName())); + + ss.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "ArtifactTypeNode.createSheet.childCnt.name"), + NbBundle.getMessage(this.getClass(), "ArtifactTypeNode.createSheet.childCnt.displayName"), + NbBundle.getMessage(this.getClass(), "ArtifactTypeNode.createSheet.childCnt.desc"), + childCount)); + + return s; + } + + @Override + public T accept(DisplayableItemNodeVisitor v) { + return v.visit(this); + } + + // @@@ TODO: Merge with BlackboartArtifactNode.getIcon() + private String getIcon(BlackboardArtifact.ARTIFACT_TYPE type) { + switch (type) { + case TSK_WEB_BOOKMARK: + return "bookmarks.png"; //NON-NLS + case TSK_WEB_COOKIE: + return "cookies.png"; //NON-NLS + case TSK_WEB_HISTORY: + return "history.png"; //NON-NLS + case TSK_WEB_DOWNLOAD: + return "downloads.png"; //NON-NLS + case TSK_INSTALLED_PROG: + return "programs.png"; //NON-NLS + case TSK_RECENT_OBJECT: + return "recent_docs.png"; //NON-NLS + case TSK_DEVICE_ATTACHED: + return "usb_devices.png"; //NON-NLS + case TSK_WEB_SEARCH_QUERY: + return "searchquery.png"; //NON-NLS + case TSK_METADATA_EXIF: + return "camera-icon-16.png"; //NON-NLS + case TSK_CONTACT: + return "contact.png"; //NON-NLS + case TSK_MESSAGE: + return "message.png"; //NON-NLS + case TSK_CALLLOG: + return "calllog.png"; //NON-NLS + case TSK_CALENDAR_ENTRY: + return "calendar.png"; //NON-NLS + case TSK_SPEED_DIAL_ENTRY: + return "speeddialentry.png"; //NON-NLS + case TSK_BLUETOOTH_PAIRING: + return "bluetooth.png"; //NON-NLS + case TSK_GPS_BOOKMARK: + return "gpsfav.png"; //NON-NLS + case TSK_GPS_LAST_KNOWN_LOCATION: + return "gps-lastlocation.png"; //NON-NLS + case TSK_GPS_SEARCH: + return "gps-search.png"; //NON-NLS + case TSK_SERVICE_ACCOUNT: + return "account-icon-16.png"; //NON-NLS + case TSK_ENCRYPTION_DETECTED: + return "encrypted-file.png"; //NON-NLS + case TSK_EXT_MISMATCH_DETECTED: + return "mismatch-16.png"; //NON-NLS + } + return "artifact-icon.png"; //NON-NLS + } + + @Override + public boolean isLeafTypeNode() { + return true; + } + } + + /** + * Creates children for a given artifact type + */ + private static class ArtifactFactory extends ChildFactory.Detachable { + + private SleuthkitCase skCase; + private BlackboardArtifact.ARTIFACT_TYPE type; + + public ArtifactFactory(BlackboardArtifact.ARTIFACT_TYPE type, SleuthkitCase skCase) { + super(); + this.skCase = skCase; + this.type = type; + } + + private final PropertyChangeListener pcl = new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + String eventType = evt.getPropertyName(); + + if (eventType.equals(IngestManager.IngestEvent.DATA.toString())) { + final ModuleDataEvent event = (ModuleDataEvent) evt.getOldValue(); + if (event.getArtifactType() == type) { + refresh(true); + } + } else if (eventType.equals(IngestManager.IngestEvent.INGEST_JOB_COMPLETED.toString()) + || eventType.equals(IngestManager.IngestEvent.INGEST_JOB_CANCELLED.toString())) { + refresh(true); + } + } + }; + + @Override + protected void addNotify() { + IngestManager.addPropertyChangeListener(pcl); + } + + @Override + protected void removeNotify() { + IngestManager.removePropertyChangeListener(pcl); + } + + @Override + protected boolean createKeys(List list) { + try { + List arts = skCase.getBlackboardArtifacts(type.getTypeID()); + list.addAll(arts); + } catch (TskException ex) { + Logger.getLogger(ArtifactFactory.class.getName()).log(Level.SEVERE, "Couldn't get blackboard artifacts from database", ex); //NON-NLS + } + return true; + } + + @Override + protected Node createNodeForKey(BlackboardArtifact key) { + return new BlackboardArtifactNode(key); + } + } } diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/HashsetHits.java b/Core/src/org/sleuthkit/autopsy/datamodel/HashsetHits.java index e2970c3993..b555f385d7 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/HashsetHits.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/HashsetHits.java @@ -18,12 +18,16 @@ */ package org.sleuthkit.autopsy.datamodel; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; import java.sql.ResultSet; import java.sql.SQLException; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Observable; +import java.util.Observer; import java.util.Set; import java.util.logging.Level; @@ -34,13 +38,16 @@ import org.openide.nodes.Children; import org.openide.nodes.Node; import org.openide.nodes.Sheet; import org.openide.util.lookup.Lookups; +import org.sleuthkit.autopsy.ingest.IngestManager; +import org.sleuthkit.autopsy.ingest.ModuleDataEvent; import org.sleuthkit.datamodel.BlackboardArtifact; -import org.sleuthkit.datamodel.BlackboardAttribute; +import org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE; +import org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE; import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.TskException; /** - * Hash set hits node support + * Hash set hits node support. Inner classes have all of the nodes in the tree. */ public class HashsetHits implements AutopsyVisitableItem { @@ -48,65 +55,85 @@ public class HashsetHits implements AutopsyVisitableItem { private static final String DISPLAY_NAME = BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT.getDisplayName(); private static final Logger logger = Logger.getLogger(HashsetHits.class.getName()); private SleuthkitCase skCase; - private Map> hashSetHitsMap; - + private HashsetResults hashsetResults; + public HashsetHits(SleuthkitCase skCase) { this.skCase = skCase; - hashSetHitsMap = new LinkedHashMap<>(); - } - - @SuppressWarnings("deprecation") - private void initArtifacts() { - hashSetHitsMap.clear(); - ResultSet rs = null; - try { - int setNameId = BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID(); - int artId = BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT.getTypeID(); - String query = "SELECT value_text,blackboard_attributes.artifact_id,attribute_type_id " //NON-NLS - + "FROM blackboard_attributes,blackboard_artifacts WHERE " //NON-NLS - + "attribute_type_id=" + setNameId //NON-NLS - + " AND blackboard_attributes.artifact_id=blackboard_artifacts.artifact_id" //NON-NLS - + " AND blackboard_artifacts.artifact_type_id=" + artId; //NON-NLS - rs = skCase.runQuery(query); - while (rs.next()) { - String value = rs.getString("value_text"); //NON-NLS - long artifactId = rs.getLong("artifact_id"); //NON-NLS - if (!hashSetHitsMap.containsKey(value)) { - hashSetHitsMap.put(value, new HashSet()); - } - hashSetHitsMap.get(value).add(artifactId); - - } - - } catch (SQLException ex) { - logger.log(Level.WARNING, "SQL Exception occurred: ", ex); //NON-NLS - } finally { - if (rs != null) { - try { - skCase.closeRunQuery(rs); - } catch (SQLException ex) { - logger.log(Level.WARNING, "Error closing result set after getting hashset hits", ex); //NON-NLS - } - } - } + hashsetResults = new HashsetResults(); } + @Override public T accept(AutopsyItemVisitor v) { return v.visit(this); } + + /** + * Stores all of the hashset results in a single class that is observable for the + * child nodes + */ + private class HashsetResults extends Observable { + // maps hashset name to list of artifacts for that set + private Map> hashSetHitsMap = new LinkedHashMap<>(); + + HashsetResults() { + update(); + } + + Set getSetNames() { + return hashSetHitsMap.keySet(); + } + + Set getArtifactIds(String hashSetName) { + return hashSetHitsMap.get(hashSetName); + } + + final void update() { + hashSetHitsMap.clear(); + ResultSet rs = null; + try { + int setNameId = ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID(); + int artId = ARTIFACT_TYPE.TSK_HASHSET_HIT.getTypeID(); + String query = "SELECT value_text,blackboard_attributes.artifact_id,attribute_type_id " //NON-NLS + + "FROM blackboard_attributes,blackboard_artifacts WHERE " //NON-NLS + + "attribute_type_id=" + setNameId //NON-NLS + + " AND blackboard_attributes.artifact_id=blackboard_artifacts.artifact_id" //NON-NLS + + " AND blackboard_artifacts.artifact_type_id=" + artId; //NON-NLS + rs = skCase.runQuery(query); + while (rs.next()) { + String setName = rs.getString("value_text"); //NON-NLS + long artifactId = rs.getLong("artifact_id"); //NON-NLS + if (!hashSetHitsMap.containsKey(setName)) { + hashSetHitsMap.put(setName, new HashSet()); + } + hashSetHitsMap.get(setName).add(artifactId); + } + } catch (SQLException ex) { + logger.log(Level.WARNING, "SQL Exception occurred: ", ex); //NON-NLS + } finally { + if (rs != null) { + try { + skCase.closeRunQuery(rs); + } catch (SQLException ex) { + logger.log(Level.WARNING, "Error closing result set after getting hashset hits", ex); //NON-NLS + } + } + } + setChanged(); + notifyObservers(); + } + } /** - * Node for the hash set hits + * Top-level node for all hash sets */ - public class HashsetHitsRootNode extends DisplayableItemNode { + public class RootNode extends DisplayableItemNode { - public HashsetHitsRootNode() { - super(Children.create(new HashsetHitsRootChildren(), true), Lookups.singleton(DISPLAY_NAME)); + public RootNode() { + super(Children.create(new HashsetNameFactory(), true), Lookups.singleton(DISPLAY_NAME)); super.setName(HASHSET_HITS); super.setDisplayName(DISPLAY_NAME); this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/hashset_hits.png"); //NON-NLS - initArtifacts(); } @Override @@ -137,27 +164,80 @@ public class HashsetHits implements AutopsyVisitableItem { } } - private class HashsetHitsRootChildren extends ChildFactory { + /** + * Creates child nodes for each hashset name + */ + private class HashsetNameFactory extends ChildFactory.Detachable implements Observer { + + /* This should probably be in the HashsetHits class, but the factory has nice methods + * for its startup and shutdown, so it seemed like a cleaner place to register the + * property change listener. + */ + private final PropertyChangeListener pcl = new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + String eventType = evt.getPropertyName(); + + if (eventType.equals(IngestManager.IngestEvent.DATA.toString())) { + if (((ModuleDataEvent) evt.getOldValue()).getArtifactType() == ARTIFACT_TYPE.TSK_HASHSET_HIT) { + hashsetResults.update(); + } + } + else if (eventType.equals(IngestManager.IngestEvent.INGEST_JOB_COMPLETED.toString()) + || eventType.equals(IngestManager.IngestEvent.INGEST_JOB_CANCELLED.toString())) { + hashsetResults.update(); + } + } + }; @Override - protected boolean createKeys(List list) { - list.addAll(hashSetHitsMap.keySet()); + protected void addNotify() { + IngestManager.addPropertyChangeListener(pcl); + hashsetResults.addObserver(this); + } + + @Override + protected void removeNotify() { + IngestManager.removePropertyChangeListener(pcl); + hashsetResults.deleteObserver(this); + } + + @Override + protected boolean createKeys(List list) { + list.addAll(hashsetResults.getSetNames()); return true; } @Override protected Node createNodeForKey(String key) { - return new HashsetHitsSetNode(key, hashSetHitsMap.get(key)); + return new HashsetNameNode(key); + } + + @Override + public void update(Observable o, Object arg) { + refresh(true); } } - public class HashsetHitsSetNode extends DisplayableItemNode { - - public HashsetHitsSetNode(String name, Set children) { - super(Children.create(new HashsetHitsSetChildren(children), true), Lookups.singleton(name)); - super.setName(name); - super.setDisplayName(name + " (" + children.size() + ")"); + /** + * Node for a hash set name + */ + public class HashsetNameNode extends DisplayableItemNode implements Observer { + private String hashSetName; + public HashsetNameNode(String hashSetName) { + super(Children.create(new HitFactory(hashSetName), true), Lookups.singleton(hashSetName)); + super.setName(hashSetName); + super.setDisplayName(hashSetName + " (0)"); + this.hashSetName = hashSetName; this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/hashset_hits.png"); //NON-NLS + hashsetResults.addObserver(this); + } + + /** + * Update the count in the display name + */ + private void updateName() { + super.setDisplayName(hashSetName + " (" + hashsetResults.getArtifactIds(hashSetName).size() + ")"); } @Override @@ -186,33 +266,54 @@ public class HashsetHits implements AutopsyVisitableItem { public T accept(DisplayableItemNodeVisitor v) { return v.visit(this); } + + @Override + public void update(Observable o, Object arg) { + updateName(); + } } - private class HashsetHitsSetChildren extends ChildFactory { - - private Set children; - - private HashsetHitsSetChildren(Set children) { + /** + * Creates the nodes for the hits in a given set. + */ + private class HitFactory extends ChildFactory.Detachable implements Observer { + private String hashsetName; + + private HitFactory(String hashsetName) { super(); - this.children = children; + this.hashsetName = hashsetName; + } + + @Override + protected void addNotify() { + hashsetResults.addObserver(this); } @Override - protected boolean createKeys(List list) { - for (long l : children) { - try { - //TODO: bulk artifact gettings - list.add(skCase.getBlackboardArtifact(l)); - } catch (TskException ex) { - logger.log(Level.WARNING, "TSK Exception occurred", ex); //NON-NLS - } - } + protected void removeNotify() { + hashsetResults.deleteObserver(this); + } + + @Override + protected boolean createKeys(List list) { + list.addAll(hashsetResults.getArtifactIds(hashsetName)); return true; } @Override - protected Node createNodeForKey(BlackboardArtifact artifact) { - return new BlackboardArtifactNode(artifact); + protected Node createNodeForKey(Long id) { + try { + BlackboardArtifact art = skCase.getBlackboardArtifact(id); + return new BlackboardArtifactNode(art); + } catch (TskException ex) { + logger.log(Level.WARNING, "TSK Exception occurred", ex); //NON-NLS + } + return null; + } + + @Override + public void update(Observable o, Object arg) { + refresh(true); } } -} +} \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/InterestingHits.java b/Core/src/org/sleuthkit/autopsy/datamodel/InterestingHits.java index f084188ef7..2abfaf1f9a 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/InterestingHits.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/InterestingHits.java @@ -106,10 +106,10 @@ public class InterestingHits implements AutopsyVisitableItem { /** * Node for the interesting items */ - public class InterestingHitsRootNode extends DisplayableItemNode { + public class RootNode extends DisplayableItemNode { - public InterestingHitsRootNode() { - super(Children.create(new InterestingHitsRootChildren(), true), Lookups.singleton(DISPLAY_NAME)); + public RootNode() { + super(Children.create(new SetNameFactory(), true), Lookups.singleton(DISPLAY_NAME)); super.setName(INTERESTING_ITEMS); super.setDisplayName(DISPLAY_NAME); this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/interesting_item.png"); //NON-NLS @@ -144,7 +144,7 @@ public class InterestingHits implements AutopsyVisitableItem { } } - private class InterestingHitsRootChildren extends ChildFactory { + private class SetNameFactory extends ChildFactory { @Override protected boolean createKeys(List list) { @@ -154,14 +154,14 @@ public class InterestingHits implements AutopsyVisitableItem { @Override protected Node createNodeForKey(String key) { - return new InterestingHitsSetNode(key, interestingItemsMap.get(key)); + return new SetNameNode(key, interestingItemsMap.get(key)); } } - public class InterestingHitsSetNode extends DisplayableItemNode { + public class SetNameNode extends DisplayableItemNode { - public InterestingHitsSetNode(String name, Set children) { - super(Children.create(new InterestingHitsSetChildren(children), true), Lookups.singleton(name)); + public SetNameNode(String name, Set children) { + super(Children.create(new HitFactory(children), true), Lookups.singleton(name)); super.setName(name); super.setDisplayName(name + " (" + children.size() + ")"); this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/interesting_item.png"); //NON-NLS @@ -195,11 +195,11 @@ public class InterestingHits implements AutopsyVisitableItem { } } - private class InterestingHitsSetChildren extends ChildFactory { + private class HitFactory extends ChildFactory { private Set children; - private InterestingHitsSetChildren(Set children) { + private HitFactory(Set children) { super(); this.children = children; } diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/KeywordHits.java b/Core/src/org/sleuthkit/autopsy/datamodel/KeywordHits.java index e031fe4fc7..69b1b246f3 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/KeywordHits.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/KeywordHits.java @@ -18,13 +18,16 @@ */ package org.sleuthkit.autopsy.datamodel; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; import java.sql.ResultSet; import java.sql.SQLException; -import java.util.ArrayList; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Observable; +import java.util.Observer; import java.util.Set; import java.util.logging.Level; import org.openide.util.NbBundle; @@ -34,6 +37,8 @@ import org.openide.nodes.Children; import org.openide.nodes.Node; import org.openide.nodes.Sheet; import org.openide.util.lookup.Lookups; +import org.sleuthkit.autopsy.ingest.IngestManager; +import org.sleuthkit.autopsy.ingest.ModuleDataEvent; import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.BlackboardAttribute; import org.sleuthkit.datamodel.SleuthkitCase; @@ -54,101 +59,123 @@ public class KeywordHits implements AutopsyVisitableItem { .getMessage(KeywordHits.class, "KeywordHits.simpleLiteralSearch.text"); public static final String SIMPLE_REGEX_SEARCH = NbBundle .getMessage(KeywordHits.class, "KeywordHits.singleRegexSearch.text"); - // Map from String (list name) to Map from string (keyword) to set (artifact ids) - private Map>> topLevelMap; - private Map>> listsMap; - // Map from String (literal keyword) to set (artifact ids) - private Map> literalMap; - // Map from String (regex keyword) to set (artifact ids); - private Map> regexMap; - Map> artifacts; + private KeywordResults keywordResults; public KeywordHits(SleuthkitCase skCase) { this.skCase = skCase; - artifacts = new LinkedHashMap<>(); - listsMap = new LinkedHashMap<>(); - literalMap = new LinkedHashMap<>(); - regexMap = new LinkedHashMap<>(); - topLevelMap = new LinkedHashMap<>(); + keywordResults = new KeywordResults(); } - - private void initMaps() { - topLevelMap.clear(); - topLevelMap.put(SIMPLE_LITERAL_SEARCH, literalMap); - topLevelMap.put(SIMPLE_REGEX_SEARCH, regexMap); - listsMap.clear(); - regexMap.clear(); - literalMap.clear(); - for (Map.Entry> art : artifacts.entrySet()) { - long id = art.getKey(); - Map attributes = art.getValue(); - // I think we can use attributes.remove(...) here? - String listName = attributes.get(Long.valueOf(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID())); - String word = attributes.get(Long.valueOf(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD.getTypeID())); - String reg = attributes.get(Long.valueOf(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD_REGEXP.getTypeID())); - if (listName != null) { - if (!listsMap.containsKey(listName)) { - listsMap.put(listName, new LinkedHashMap>()); - } - if (!listsMap.get(listName).containsKey(word)) { - listsMap.get(listName).put(word, new HashSet()); - } - listsMap.get(listName).get(word).add(id); - } else if (reg != null) { - if (!regexMap.containsKey(reg)) { - regexMap.put(reg, new HashSet()); - } - regexMap.get(reg).add(id); - } else { - if (!literalMap.containsKey(word)) { - literalMap.put(word, new HashSet()); - } - literalMap.get(word).add(id); - } - topLevelMap.putAll(listsMap); + + private final class KeywordResults extends Observable { + // Map from listName/Type to Map of keyword to set of artifact Ids + private Map>> topLevelMap; + + KeywordResults() { + topLevelMap = new LinkedHashMap<>(); + update(); + } + + Set getListNames() { + return topLevelMap.keySet(); + } + + Set getKeywords(String listName) { + return topLevelMap.get(listName).keySet(); + } + + Set getArtifactIds(String listName, String keyword) { + return topLevelMap.get(listName).get(keyword); } - } - @SuppressWarnings("deprecation") - private void initArtifacts() { - artifacts.clear(); - ResultSet rs = null; - try { - int setId = BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID(); - int wordId = BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD.getTypeID(); - int regexId = BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD_REGEXP.getTypeID(); - int artId = BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID(); - String query = "SELECT blackboard_attributes.value_text,blackboard_attributes.artifact_id," //NON-NLS - + "blackboard_attributes.attribute_type_id FROM blackboard_attributes,blackboard_artifacts WHERE " //NON-NLS - + "(blackboard_attributes.artifact_id=blackboard_artifacts.artifact_id AND " //NON-NLS - + "blackboard_artifacts.artifact_type_id=" + artId //NON-NLS - + ") AND (attribute_type_id=" + setId + " OR " //NON-NLS - + "attribute_type_id=" + wordId + " OR " //NON-NLS - + "attribute_type_id=" + regexId + ")"; //NON-NLS - rs = skCase.runQuery(query); - while (rs.next()) { - String value = rs.getString("value_text"); //NON-NLS - long artifactId = rs.getLong("artifact_id"); //NON-NLS - long typeId = rs.getLong("attribute_type_id"); //NON-NLS - if (!artifacts.containsKey(artifactId)) { - artifacts.put(artifactId, new LinkedHashMap()); + // populate maps based on artifactIds + void populateMaps(Map> artifactIds) { + topLevelMap.clear(); + + Map>> listsMap = new LinkedHashMap<>(); + // Map from String (literal keyword) to set (artifact ids) + Map> literalMap = new LinkedHashMap<>(); + // Map from String (regex keyword) to set (artifact ids); + Map> regexMap = new LinkedHashMap<>(); + + + // top-level nodes + topLevelMap.put(SIMPLE_LITERAL_SEARCH, literalMap); + topLevelMap.put(SIMPLE_REGEX_SEARCH, regexMap); + + for (Map.Entry> art : artifactIds.entrySet()) { + long id = art.getKey(); + Map attributes = art.getValue(); + + // I think we can use attributes.remove(...) here? + String listName = attributes.get(Long.valueOf(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID())); + String word = attributes.get(Long.valueOf(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD.getTypeID())); + String reg = attributes.get(Long.valueOf(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD_REGEXP.getTypeID())); + if (listName != null) { + if (!listsMap.containsKey(listName)) { + listsMap.put(listName, new LinkedHashMap>()); + } + if (!listsMap.get(listName).containsKey(word)) { + listsMap.get(listName).put(word, new HashSet()); + } + listsMap.get(listName).get(word).add(id); + } else if (reg != null) { + if (!regexMap.containsKey(reg)) { + regexMap.put(reg, new HashSet()); + } + regexMap.get(reg).add(id); + } else { + if (!literalMap.containsKey(word)) { + literalMap.put(word, new HashSet()); + } + literalMap.get(word).add(id); } - if (!value.equals("")) { - artifacts.get(artifactId).put(typeId, value); - } - + topLevelMap.putAll(listsMap); } - - } catch (SQLException ex) { - logger.log(Level.WARNING, "SQL Exception occurred: ", ex); //NON-NLS - } finally { - if (rs != null) { - try { - skCase.closeRunQuery(rs); - } catch (SQLException ex) { - logger.log(Level.WARNING, "Error closing result set after getting keyword hits", ex); //NON-NLS + + setChanged(); + notifyObservers(); + } + + public void update() { + Map> artifactIds = new LinkedHashMap<>(); + + ResultSet rs = null; + try { + int setId = BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID(); + int wordId = BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD.getTypeID(); + int regexId = BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD_REGEXP.getTypeID(); + int artId = BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID(); + String query = "SELECT blackboard_attributes.value_text,blackboard_attributes.artifact_id," //NON-NLS + + "blackboard_attributes.attribute_type_id FROM blackboard_attributes,blackboard_artifacts WHERE " //NON-NLS + + "(blackboard_attributes.artifact_id=blackboard_artifacts.artifact_id AND " //NON-NLS + + "blackboard_artifacts.artifact_type_id=" + artId //NON-NLS + + ") AND (attribute_type_id=" + setId + " OR " //NON-NLS + + "attribute_type_id=" + wordId + " OR " //NON-NLS + + "attribute_type_id=" + regexId + ")"; //NON-NLS + rs = skCase.runQuery(query); + while (rs.next()) { + String value = rs.getString("value_text"); //NON-NLS + long artifactId = rs.getLong("artifact_id"); //NON-NLS + long typeId = rs.getLong("attribute_type_id"); //NON-NLS + if (!artifactIds.containsKey(artifactId)) { + artifactIds.put(artifactId, new LinkedHashMap()); + } + if (!value.equals("")) { + artifactIds.get(artifactId).put(typeId, value); + } + } + } catch (SQLException ex) { + logger.log(Level.WARNING, "SQL Exception occurred: ", ex); //NON-NLS + } finally { + if (rs != null) { + try { + skCase.closeRunQuery(rs); + } catch (SQLException ex) { + logger.log(Level.WARNING, "Error closing result set after getting keyword hits", ex); //NON-NLS + } } } + populateMaps(artifactIds); } } @@ -157,15 +184,14 @@ public class KeywordHits implements AutopsyVisitableItem { return v.visit(this); } - public class KeywordHitsRootNode extends DisplayableItemNode { + // Created by CreateAutopsyNodeVisitor + public class RootNode extends DisplayableItemNode { - public KeywordHitsRootNode() { - super(Children.create(new KeywordHitsRootChildren(), true), Lookups.singleton(KEYWORD_HITS)); + public RootNode() { + super(Children.create(new ListFactory(), true), Lookups.singleton(KEYWORD_HITS)); super.setName(NAME); super.setDisplayName(KEYWORD_HITS); this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/keyword_hits.png"); //NON-NLS - initArtifacts(); - initMaps(); } @Override @@ -196,36 +222,73 @@ public class KeywordHits implements AutopsyVisitableItem { } } - private class KeywordHitsRootChildren extends ChildFactory { + private class ListFactory extends ChildFactory.Detachable implements Observer { + + private final PropertyChangeListener pcl = new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + String eventType = evt.getPropertyName(); + + if (eventType.equals(IngestManager.IngestEvent.DATA.toString())) { + if (((ModuleDataEvent) evt.getOldValue()).getArtifactType() == BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT) { + keywordResults.update(); + } + } + else if (eventType.equals(IngestManager.IngestEvent.INGEST_JOB_COMPLETED.toString()) + || eventType.equals(IngestManager.IngestEvent.INGEST_JOB_CANCELLED.toString())) { + keywordResults.update(); + } + } + }; + + @Override + protected void addNotify() { + IngestManager.addPropertyChangeListener(pcl); + keywordResults.addObserver(this); + } + @Override + protected void removeNotify() { + IngestManager.removePropertyChangeListener(pcl); + keywordResults.deleteObserver(this); + } + @Override protected boolean createKeys(List list) { - list.addAll(topLevelMap.keySet()); + list.addAll(keywordResults.getListNames()); return true; } @Override protected Node createNodeForKey(String key) { - return new KeywordHitsListNode(key, topLevelMap.get(key)); + return new ListNode(key); + } + + @Override + public void update(Observable o, Object arg) { + refresh(true); } } - public class KeywordHitsListNode extends DisplayableItemNode { + public class ListNode extends DisplayableItemNode implements Observer { + private String listName; - private String name; - private Map> children; - - public KeywordHitsListNode(String name, Map> children) { - super(Children.create(new KeywordHitsListChildren(children), true), Lookups.singleton(name)); - super.setName(name); - int totalDescendants = 0; - for (Set grandChildren : children.values()) { - totalDescendants += grandChildren.size(); - } - super.setDisplayName(name + " (" + totalDescendants + ")"); + public ListNode(String listName) { + super(Children.create(new TermFactory(listName), true), Lookups.singleton(listName)); + super.setName(listName); this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/keyword_hits.png"); //NON-NLS - this.name = name; - this.children = children; + this.listName = listName; + updateDisplayName(); + keywordResults.addObserver(this); + } + + private void updateDisplayName() { + int totalDescendants = 0; + for (String word : keywordResults.getKeywords(listName)) { + Set ids = keywordResults.getArtifactIds(listName, word); + totalDescendants += ids.size(); + } + super.setDisplayName(listName + " (" + totalDescendants + ")"); } @Override @@ -240,13 +303,13 @@ public class KeywordHits implements AutopsyVisitableItem { ss.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "KeywordHits.createSheet.listName.name"), NbBundle.getMessage(this.getClass(), "KeywordHits.createSheet.listName.displayName"), NbBundle.getMessage(this.getClass(), "KeywordHits.createSheet.listName.desc"), - name)); + listName)); ss.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "KeywordHits.createSheet.numChildren.name"), NbBundle.getMessage(this.getClass(), "KeywordHits.createSheet.numChildren.displayName"), NbBundle.getMessage(this.getClass(), "KeywordHits.createSheet.numChildren.desc"), - children.size())); + keywordResults.getKeywords(listName).size())); return s; } @@ -260,39 +323,71 @@ public class KeywordHits implements AutopsyVisitableItem { public T accept(DisplayableItemNodeVisitor v) { return v.visit(this); } + + @Override + public void update(Observable o, Object arg) { + updateDisplayName(); + } } - private class KeywordHitsListChildren extends ChildFactory { - - private Map> children; - - private KeywordHitsListChildren(Map> children) { + private class TermFactory extends ChildFactory.Detachable implements Observer { + private String setName; + + private TermFactory(String setName) { super(); - this.children = children; + this.setName = setName; } + @Override + protected void addNotify() { + keywordResults.addObserver(this); + } + + @Override + protected void removeNotify() { + keywordResults.deleteObserver(this); + } + @Override protected boolean createKeys(List list) { - list.addAll(children.keySet()); + list.addAll(keywordResults.getKeywords(setName)); return true; } @Override protected Node createNodeForKey(String key) { - return new KeywordHitsKeywordNode(key, children.get(key)); + return new TermNode(setName, key); + } + + @Override + public void update(Observable o, Object arg) { + refresh(true); } } - public class KeywordHitsKeywordNode extends DisplayableItemNode { + public class TermNode extends DisplayableItemNode implements Observer { - private Set children; + private String setName; + private String keyword; - public KeywordHitsKeywordNode(String name, Set children) { - super(Children.create(new KeywordHitsKeywordChildren(children), true), Lookups.singleton(name)); - super.setName(name); - super.setDisplayName(name + " (" + children.size() + ")"); + public TermNode(String setName, String keyword) { + super(Children.create(new HitsFactory (setName, keyword), true), Lookups.singleton(keyword)); + super.setName(keyword); + this.setName = setName; + this.keyword = keyword; this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/keyword_hits.png"); //NON-NLS - this.children = children; + updateDisplayName(); + keywordResults.addObserver(this); + } + + private void updateDisplayName() { + super.setDisplayName(keyword + " (" + keywordResults.getArtifactIds(setName, keyword).size() + ")"); + } + + + @Override + public void update(Observable o, Object arg) { + updateDisplayName(); } @Override @@ -322,70 +417,83 @@ public class KeywordHits implements AutopsyVisitableItem { ss.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "KeywordHits.createSheet.filesWithHits.name"), NbBundle.getMessage(this.getClass(), "KeywordHits.createSheet.filesWithHits.displayName"), NbBundle.getMessage(this.getClass(), "KeywordHits.createSheet.filesWithHits.desc"), - children.size())); + keywordResults.getArtifactIds(setName, keyword).size())); return s; } } - private class KeywordHitsKeywordChildren extends ChildFactory { - - private Set children; - - private KeywordHitsKeywordChildren(Set children) { + public class HitsFactory extends ChildFactory.Detachable implements Observer { + private String keyword; + private String setName; + + public HitsFactory(String setName, String keyword) { super(); - this.children = children; + this.setName = setName; + this.keyword = keyword; + } + + @Override + protected void addNotify() { + keywordResults.addObserver(this); } @Override - protected boolean createKeys(List list) { - List tempList = new ArrayList<>(); - for (long l : children) { - try { - //TODO: bulk artifact gettings - tempList.add(skCase.getBlackboardArtifact(l)); - } catch (TskException ex) { - logger.log(Level.WARNING, "TSK Exception occurred", ex); //NON-NLS - } - } - list.addAll(tempList); + protected void removeNotify() { + keywordResults.deleteObserver(this); + } + + @Override + protected boolean createKeys(List list) { + list.addAll(keywordResults.getArtifactIds(setName, keyword)); return true; } + @Override - protected Node createNodeForKey(BlackboardArtifact artifact) { - BlackboardArtifactNode n = new BlackboardArtifactNode(artifact); - AbstractFile file; + protected Node createNodeForKey(Long artifactId) { try { - file = artifact.getSleuthkitCase().getAbstractFileById(artifact.getObjectID()); - } catch (TskCoreException ex) { - logger.log(Level.SEVERE, "TskCoreException while constructing BlackboardArtifact Node from KeywordHitsKeywordChildren"); //NON-NLS - return n; + BlackboardArtifact art = skCase.getBlackboardArtifact(artifactId); + BlackboardArtifactNode n = new BlackboardArtifactNode(art); + AbstractFile file; + try { + file = art.getSleuthkitCase().getAbstractFileById(art.getObjectID()); + } catch (TskCoreException ex) { + logger.log(Level.SEVERE, "TskCoreException while constructing BlackboardArtifact Node from KeywordHitsKeywordChildren"); //NON-NLS + return n; + } + + n.addNodeProperty(new NodeProperty<>( + NbBundle.getMessage(this.getClass(), "KeywordHits.createNodeForKey.modTime.name"), + NbBundle.getMessage(this.getClass(), + "KeywordHits.createNodeForKey.modTime.displayName"), + NbBundle.getMessage(this.getClass(), + "KeywordHits.createNodeForKey.modTime.desc"), + ContentUtils.getStringTime(file.getMtime(), file))); + n.addNodeProperty(new NodeProperty<>( + NbBundle.getMessage(this.getClass(), "KeywordHits.createNodeForKey.accessTime.name"), + NbBundle.getMessage(this.getClass(), + "KeywordHits.createNodeForKey.accessTime.displayName"), + NbBundle.getMessage(this.getClass(), + "KeywordHits.createNodeForKey.accessTime.desc"), + ContentUtils.getStringTime(file.getAtime(), file))); + n.addNodeProperty(new NodeProperty<>( + NbBundle.getMessage(this.getClass(), "KeywordHits.createNodeForKey.chgTime.name"), + NbBundle.getMessage(this.getClass(), + "KeywordHits.createNodeForKey.chgTime.displayName"), + NbBundle.getMessage(this.getClass(), + "KeywordHits.createNodeForKey.chgTime.desc"), + ContentUtils.getStringTime(file.getCtime(), file))); + return n; + } catch (TskException ex) { + logger.log(Level.WARNING, "TSK Exception occurred", ex); //NON-NLS } + return null; + } - n.addNodeProperty(new NodeProperty<>( - NbBundle.getMessage(this.getClass(), "KeywordHits.createNodeForKey.modTime.name"), - NbBundle.getMessage(this.getClass(), - "KeywordHits.createNodeForKey.modTime.displayName"), - NbBundle.getMessage(this.getClass(), - "KeywordHits.createNodeForKey.modTime.desc"), - ContentUtils.getStringTime(file.getMtime(), file))); - n.addNodeProperty(new NodeProperty<>( - NbBundle.getMessage(this.getClass(), "KeywordHits.createNodeForKey.accessTime.name"), - NbBundle.getMessage(this.getClass(), - "KeywordHits.createNodeForKey.accessTime.displayName"), - NbBundle.getMessage(this.getClass(), - "KeywordHits.createNodeForKey.accessTime.desc"), - ContentUtils.getStringTime(file.getAtime(), file))); - n.addNodeProperty(new NodeProperty<>( - NbBundle.getMessage(this.getClass(), "KeywordHits.createNodeForKey.chgTime.name"), - NbBundle.getMessage(this.getClass(), - "KeywordHits.createNodeForKey.chgTime.displayName"), - NbBundle.getMessage(this.getClass(), - "KeywordHits.createNodeForKey.chgTime.desc"), - ContentUtils.getStringTime(file.getCtime(), file))); - - return n; + @Override + public void update(Observable o, Object arg) { + refresh(true); } } } diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/RootContentChildren.java b/Core/src/org/sleuthkit/autopsy/datamodel/RootContentChildren.java index da6843c8d2..ffc00fe367 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/RootContentChildren.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/RootContentChildren.java @@ -65,6 +65,8 @@ public class RootContentChildren extends AbstractContentChildren { //TODO this will be removed, Children should be listening for interesting //events from datamodel and calling refresh / refreshKey() themselves public void refreshKeys(BlackboardArtifact.ARTIFACT_TYPE... types) { + // find the corresponding top-level node and refresh its children. + // should be more effeciently stored than a list. for (Object o : contentKeys) { for (BlackboardArtifact.ARTIFACT_TYPE type : types) { switch (type) { @@ -91,8 +93,10 @@ public class RootContentChildren extends AbstractContentChildren { this.refreshKey(o); break; default: - if (o instanceof ExtractedContent) + if (o instanceof ExtractedContent) { + this.refreshKey(o); + } break; } } diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/TagNameNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/TagNameNode.java index 1ccf5a8465..8949671495 100755 --- a/Core/src/org/sleuthkit/autopsy/datamodel/TagNameNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/TagNameNode.java @@ -27,6 +27,7 @@ import org.openide.nodes.Sheet; import org.openide.util.NbBundle; import org.openide.util.lookup.Lookups; import org.sleuthkit.autopsy.casemodule.Case; +import org.sleuthkit.autopsy.casemodule.services.TagsManager; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.directorytree.BlackboardArtifactTagTypeNode; import org.sleuthkit.datamodel.TagName; @@ -52,22 +53,26 @@ public class TagNameNode extends DisplayableItemNode { NbBundle.getMessage(TagNameNode.class, "TagNameNode.namePlusTags.text", tagName.getDisplayName()))); this.tagName = tagName; - long tagsCount = 0; - try { - tagsCount = Case.getCurrentCase().getServices().getTagsManager().getContentTagsCountByTagName(tagName); - tagsCount += Case.getCurrentCase().getServices().getTagsManager().getBlackboardArtifactTagsCountByTagName(tagName); - } catch (TskCoreException ex) { - Logger.getLogger(TagNameNode.class.getName()).log(Level.SEVERE, "Failed to get tags count for " + tagName.getDisplayName() + " tag name", ex); //NON-NLS - } - - super.setName(tagName.getDisplayName()); - super.setDisplayName(tagName.getDisplayName() + " (" + tagsCount + ")"); + setName(tagName.getDisplayName()); + updateDisplayName(); if (tagName.getDisplayName().equals(NbBundle.getMessage(this.getClass(), "TagNameNode.bookmark.text"))) { setIconBaseWithExtension(BOOKMARK_TAG_ICON_PATH); } else { setIconBaseWithExtension(ICON_PATH); } } + + private void updateDisplayName() { + long tagsCount = 0; + try { + TagsManager tm = Case.getCurrentCase().getServices().getTagsManager(); + tagsCount = tm.getContentTagsCountByTagName(tagName); + tagsCount += tm.getBlackboardArtifactTagsCountByTagName(tagName); + } catch (TskCoreException ex) { + Logger.getLogger(TagNameNode.class.getName()).log(Level.SEVERE, "Failed to get tags count for " + tagName.getDisplayName() + " tag name", ex); //NON-NLS + } + setDisplayName(tagName.getDisplayName() + " (" + tagsCount + ")"); + } @Override protected Sheet createSheet() { diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/TagsNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/TagsNode.java index 81b5c53c8b..d6ceff425c 100755 --- a/Core/src/org/sleuthkit/autopsy/datamodel/TagsNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/TagsNode.java @@ -18,6 +18,8 @@ */ package org.sleuthkit.autopsy.datamodel; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; import java.util.List; import java.util.logging.Level; import org.openide.nodes.ChildFactory; @@ -28,6 +30,9 @@ import org.openide.util.NbBundle; import org.openide.util.lookup.Lookups; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.autopsy.ingest.IngestManager; +import org.sleuthkit.autopsy.ingest.ModuleDataEvent; +import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.TagName; import org.sleuthkit.datamodel.TskCoreException; @@ -76,8 +81,36 @@ class TagsNode extends DisplayableItemNode { return propertySheet; } - private static class TagNameNodeFactory extends ChildFactory { + private static class TagNameNodeFactory extends ChildFactory.Detachable { + private final PropertyChangeListener pcl = new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + String eventType = evt.getPropertyName(); + + if (eventType.equals(IngestManager.IngestEvent.DATA.toString())) { + if ((((ModuleDataEvent) evt.getOldValue()).getArtifactType() == BlackboardArtifact.ARTIFACT_TYPE.TSK_TAG_ARTIFACT) || + ((ModuleDataEvent) evt.getOldValue()).getArtifactType() == BlackboardArtifact.ARTIFACT_TYPE.TSK_TAG_FILE) { + refresh(true); + } + } + else if (eventType.equals(IngestManager.IngestEvent.INGEST_JOB_COMPLETED.toString()) + || eventType.equals(IngestManager.IngestEvent.INGEST_JOB_CANCELLED.toString())) { + refresh(true); + } + } + }; + + @Override + protected void addNotify() { + IngestManager.addPropertyChangeListener(pcl); + } + + @Override + protected void removeNotify() { + IngestManager.removePropertyChangeListener(pcl); + } + @Override protected boolean createKeys(List keys) { try { diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/DataResultFilterNode.java b/Core/src/org/sleuthkit/autopsy/directorytree/DataResultFilterNode.java index 4facc9603a..fe0f34f2a1 100755 --- a/Core/src/org/sleuthkit/autopsy/directorytree/DataResultFilterNode.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/DataResultFilterNode.java @@ -33,14 +33,12 @@ import javax.swing.AbstractAction; import javax.swing.Action; import org.openide.explorer.ExplorerManager; import org.openide.nodes.AbstractNode; -import org.openide.nodes.ChildFactory; import org.openide.nodes.FilterNode; import org.openide.nodes.Node; import org.openide.nodes.Sheet; import org.sleuthkit.autopsy.coreutils.ContextMenuExtensionPoint; import org.sleuthkit.autopsy.datamodel.AbstractAbstractFileNode.AbstractFilePropertyType; import org.sleuthkit.autopsy.datamodel.AbstractFsContentNode; -import org.sleuthkit.autopsy.datamodel.ArtifactTypeNode; import org.sleuthkit.autopsy.datamodel.BlackboardArtifactNode; import org.sleuthkit.autopsy.datamodel.ContentTagTypeNode; import org.sleuthkit.autopsy.datamodel.LocalFileNode; @@ -48,27 +46,27 @@ import org.sleuthkit.autopsy.datamodel.DeletedContent.DeletedContentsChildren.De import org.sleuthkit.autopsy.datamodel.DeletedContent.DeletedContentsNode; import org.sleuthkit.autopsy.datamodel.DisplayableItemNode; import org.sleuthkit.autopsy.datamodel.DisplayableItemNodeVisitor; -import org.sleuthkit.autopsy.datamodel.EmailExtracted.EmailExtractedAccountNode; -import org.sleuthkit.autopsy.datamodel.EmailExtracted.EmailExtractedFolderNode; -import org.sleuthkit.autopsy.datamodel.EmailExtracted.EmailExtractedRootNode; -import org.sleuthkit.autopsy.datamodel.ExtractedContentNode; +import org.sleuthkit.autopsy.datamodel.EmailExtracted.AccountNode; +import org.sleuthkit.autopsy.datamodel.EmailExtracted.FolderNode; +import org.sleuthkit.autopsy.datamodel.EmailExtracted; +import org.sleuthkit.autopsy.datamodel.ExtractedContent.TypeNode; +import org.sleuthkit.autopsy.datamodel.ExtractedContent; import org.sleuthkit.autopsy.datamodel.FileNode; import org.sleuthkit.autopsy.datamodel.FileTypeNode; import org.sleuthkit.autopsy.datamodel.FileSize.FileSizeRootChildren.FileSizeNode; import org.sleuthkit.autopsy.datamodel.FileSize.FileSizeRootNode; -import org.sleuthkit.autopsy.datamodel.HashsetHits.HashsetHitsRootNode; -import org.sleuthkit.autopsy.datamodel.HashsetHits.HashsetHitsSetNode; -import org.sleuthkit.autopsy.datamodel.InterestingHits.InterestingHitsRootNode; -import org.sleuthkit.autopsy.datamodel.InterestingHits.InterestingHitsSetNode; +import org.sleuthkit.autopsy.datamodel.HashsetHits; +import org.sleuthkit.autopsy.datamodel.HashsetHits.HashsetNameNode; import org.sleuthkit.autopsy.datamodel.ImageNode; -import org.sleuthkit.autopsy.datamodel.KeywordHits.KeywordHitsKeywordNode; -import org.sleuthkit.autopsy.datamodel.KeywordHits.KeywordHitsListNode; -import org.sleuthkit.autopsy.datamodel.KeywordHits.KeywordHitsRootNode; +import org.sleuthkit.autopsy.datamodel.InterestingHits; +import org.sleuthkit.autopsy.datamodel.KeywordHits.TermNode; +import org.sleuthkit.autopsy.datamodel.KeywordHits.ListNode; import org.sleuthkit.autopsy.datamodel.VirtualDirectoryNode; import org.sleuthkit.autopsy.datamodel.LayoutFileNode; import org.sleuthkit.autopsy.datamodel.RecentFilesFilterNode; import org.sleuthkit.autopsy.datamodel.RecentFilesNode; import org.sleuthkit.autopsy.datamodel.FileTypesNode; +import org.sleuthkit.autopsy.datamodel.KeywordHits; import org.sleuthkit.autopsy.datamodel.TagNameNode; import org.sleuthkit.datamodel.AbstractFile; import org.sleuthkit.datamodel.BlackboardArtifact; @@ -367,47 +365,47 @@ public class DataResultFilterNode extends FilterNode { } @Override - public AbstractAction visit(ExtractedContentNode ecn) { + public AbstractAction visit(ExtractedContent.RootNode ecn) { return openChild(ecn); } @Override - public AbstractAction visit(KeywordHitsRootNode khrn) { + public AbstractAction visit(KeywordHits.RootNode khrn) { return openChild(khrn); } @Override - public AbstractAction visit(HashsetHitsRootNode hhrn) { + public AbstractAction visit(HashsetHits.RootNode hhrn) { return openChild(hhrn); } @Override - public AbstractAction visit(HashsetHitsSetNode hhsn) { + public AbstractAction visit(HashsetNameNode hhsn) { return openChild(hhsn); } @Override - public AbstractAction visit(InterestingHitsRootNode iarn) { + public AbstractAction visit(InterestingHits.RootNode iarn) { return openChild(iarn); } @Override - public AbstractAction visit(InterestingHitsSetNode iasn) { + public AbstractAction visit(InterestingHits.SetNameNode iasn) { return openChild(iasn); } @Override - public AbstractAction visit(EmailExtractedRootNode eern) { + public AbstractAction visit(EmailExtracted.RootNode eern) { return openChild(eern); } @Override - public AbstractAction visit(EmailExtractedAccountNode eean) { + public AbstractAction visit(AccountNode eean) { return openChild(eean); } @Override - public AbstractAction visit(EmailExtractedFolderNode eefn) { + public AbstractAction visit(FolderNode eefn) { return openChild(eefn); } @@ -443,7 +441,7 @@ public class DataResultFilterNode extends FilterNode { } @Override - public AbstractAction visit(ArtifactTypeNode atn) { + public AbstractAction visit(TypeNode atn) { return openChild(atn); } @@ -516,12 +514,12 @@ public class DataResultFilterNode extends FilterNode { } @Override - public AbstractAction visit(KeywordHitsListNode khsn) { + public AbstractAction visit(ListNode khsn) { return openChild(khsn); } @Override - public AbstractAction visit(KeywordHitsKeywordNode khmln) { + public AbstractAction visit(TermNode khmln) { return openChild(khmln); } diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java index a03933abf6..f4ffbd3ee3 100644 --- a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java @@ -53,7 +53,7 @@ import org.sleuthkit.autopsy.corecomponentinterfaces.BlackboardResultViewer; import org.sleuthkit.autopsy.corecomponents.DataResultTopComponent; import org.sleuthkit.autopsy.corecomponents.TableFilterNode; import org.sleuthkit.autopsy.datamodel.BlackboardArtifactNode; -import org.sleuthkit.autopsy.datamodel.ExtractedContentNode; +import org.sleuthkit.autopsy.datamodel.ExtractedContent.RootNode; import org.sleuthkit.autopsy.datamodel.DataSources; import org.sleuthkit.autopsy.datamodel.DataSourcesNode; import org.sleuthkit.autopsy.datamodel.KeywordHits; @@ -73,6 +73,7 @@ import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.datamodel.TskException; import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; +import org.sleuthkit.autopsy.datamodel.ExtractedContent; /** * Top component which displays something. @@ -387,7 +388,7 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat Children resultsChilds = results.getChildren(); tree.expandNode(resultsChilds.findChild(KeywordHits.NAME)); - tree.expandNode(resultsChilds.findChild(ExtractedContentNode.NAME)); + tree.expandNode(resultsChilds.findChild(ExtractedContent.NAME)); Node views = childNodes.findChild(ViewsNode.NAME); @@ -587,7 +588,8 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat // change in node selection else if (changed.equals(ExplorerManager.PROP_SELECTED_NODES)) { respondSelection((Node[]) oldValue, (Node[]) newValue); - } else if (changed.equals(IngestEvent.DATA.toString())) { + } + else if (changed.equals(IngestEvent.DATA.toString())) { final ModuleDataEvent event = (ModuleDataEvent) oldValue; if (event.getArtifactType() == BlackboardArtifact.ARTIFACT_TYPE.TSK_GEN_INFO) { return; @@ -595,7 +597,7 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat SwingUtilities.invokeLater(new Runnable() { @Override public void run() { - refreshTree(event.getArtifactType()); + // @@@ refreshResultsTree(event.getArtifactType()); } }); } else if (changed.equals(IngestEvent.INGEST_JOB_COMPLETED.toString()) @@ -603,15 +605,15 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat SwingUtilities.invokeLater(new Runnable() { @Override public void run() { - refreshContentTree(); - refreshTree(); + refreshDataSourceTree(); + refreshResultsTree(); } }); } else if (changed.equals(IngestEvent.CONTENT_CHANGED.toString())) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { - refreshContentTree(); + refreshDataSourceTree(); } }); } @@ -768,7 +770,7 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat SwingUtilities.invokeLater(new Runnable() { @Override public void run() { - refreshContentTree(); + refreshDataSourceTree(); } }); } @@ -776,7 +778,7 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat /** * Refreshes changed content nodes */ - void refreshContentTree() { + private void refreshDataSourceTree() { Node selectedNode = getSelectedNode(); final String[] selectedPath = NodeOp.createPath(selectedNode, em.getRootContext()); @@ -809,7 +811,7 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat * Refreshes the nodes in the tree to reflect updates in the database should * be called in the gui thread */ - public void refreshTree(final BlackboardArtifact.ARTIFACT_TYPE... types) { + public void refreshResultsTree(final BlackboardArtifact.ARTIFACT_TYPE... types) { //save current selection Node selectedNode = getSelectedNode(); final String[] selectedPath = NodeOp.createPath(selectedNode, em.getRootContext()); @@ -820,44 +822,40 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat Children dirChilds = em.getRootContext().getChildren(); Node results = dirChilds.findChild(ResultsNode.NAME); - if (results == null) { logger.log(Level.SEVERE, "Cannot find Results filter node, won't refresh the bb tree"); //NON-NLS return; } + OriginalNode original = results.getLookup().lookup(OriginalNode.class); ResultsNode resultsNode = (ResultsNode) original.getNode(); RootContentChildren resultsNodeChilds = (RootContentChildren) resultsNode.getChildren(); resultsNodeChilds.refreshKeys(types); + final TreeView tree = getTree(); - - tree.expandNode(results); + // @@@ tree.expandNode(results); Children resultsChilds = results.getChildren(); - - if (resultsChilds == null) //intermediate state check - { + if (resultsChilds == null) { return; } Node childNode = resultsChilds.findChild(KeywordHits.NAME); - if (childNode == null) //intermediate state check - { + if (childNode == null) { return; } - tree.expandNode(childNode); + // @@@tree.expandNode(childNode); - childNode = resultsChilds.findChild(ExtractedContentNode.NAME); - if (childNode == null) //intermediate state check - { + childNode = resultsChilds.findChild(ExtractedContent.NAME); + if (childNode == null) { return; } tree.expandNode(childNode); //restores selection if it was under the Results node - setSelectedNode(selectedPath, ResultsNode.NAME); - + //@@@ setSelectedNode(selectedPath, ResultsNode.NAME); + } /** @@ -983,7 +981,7 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat logger.log(Level.WARNING, "Error retrieving attributes", ex); //NON-NLS } } else { - Node extractedContent = resultsChilds.findChild(ExtractedContentNode.NAME); + Node extractedContent = resultsChilds.findChild(ExtractedContent.NAME); Children extractedChilds = extractedContent.getChildren(); treeNode = extractedChilds.findChild(type.getLabel()); } diff --git a/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties b/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties index 28783ec7c0..76c162a96e 100644 --- a/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties +++ b/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties @@ -1,5 +1,5 @@ #Updated by build script -#Tue, 22 Apr 2014 16:06:14 -0400 +#Sat, 03 May 2014 22:45:39 -0400 LBL_splash_window_title=Starting Autopsy SPLASH_HEIGHT=288 SPLASH_WIDTH=538 diff --git a/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties b/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties index fe9124784d..8d4a5daefb 100644 --- a/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties +++ b/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties @@ -1,5 +1,5 @@ #Updated by build script -#Tue, 22 Apr 2014 16:06:14 -0400 +#Sat, 03 May 2014 22:45:39 -0400 CTL_MainWindow_Title=Autopsy 3.1.0_Beta CTL_MainWindow_Title_No_Project=Autopsy 3.1.0_Beta From c7bb600c1634f4b9ae22be82a52702e5111f7366 Mon Sep 17 00:00:00 2001 From: Brian Carrier Date: Mon, 5 May 2014 23:47:02 -0400 Subject: [PATCH 04/59] Added tags to refresh --- .../datamodel/AbstractContentChildren.java | 4 +- .../autopsy/datamodel/AutopsyItemVisitor.java | 4 +- .../autopsy/datamodel/Bundle.properties | 3 + .../autopsy/datamodel/Bundle_ja.properties | 491 +++++++++--------- .../autopsy/datamodel/ContentTagTypeNode.java | 112 ---- .../datamodel/DisplayableItemNodeVisitor.java | 17 +- .../autopsy/datamodel/ResultsNode.java | 2 +- .../datamodel/RootContentChildren.java | 4 +- .../autopsy/datamodel/TagNameNode.java | 143 ----- .../org/sleuthkit/autopsy/datamodel/Tags.java | 435 ++++++++++++++++ .../sleuthkit/autopsy/datamodel/TagsNode.java | 129 ----- .../autopsy/datamodel/TagsNodeKey.java | 34 -- .../BlackboardArtifactTagTypeNode.java | 119 ----- .../autopsy/directorytree/Bundle.properties | 3 - .../directorytree/Bundle_ja.properties | 151 +++--- .../directorytree/DataResultFilterNode.java | 9 +- 16 files changed, 778 insertions(+), 882 deletions(-) delete mode 100755 Core/src/org/sleuthkit/autopsy/datamodel/ContentTagTypeNode.java delete mode 100755 Core/src/org/sleuthkit/autopsy/datamodel/TagNameNode.java create mode 100755 Core/src/org/sleuthkit/autopsy/datamodel/Tags.java delete mode 100755 Core/src/org/sleuthkit/autopsy/datamodel/TagsNode.java delete mode 100755 Core/src/org/sleuthkit/autopsy/datamodel/TagsNodeKey.java delete mode 100755 Core/src/org/sleuthkit/autopsy/directorytree/BlackboardArtifactTagTypeNode.java diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/AbstractContentChildren.java b/Core/src/org/sleuthkit/autopsy/datamodel/AbstractContentChildren.java index cd066a0a64..409a9f6483 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/AbstractContentChildren.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/AbstractContentChildren.java @@ -163,8 +163,8 @@ abstract class AbstractContentChildren extends Keys { } @Override - public AbstractNode visit(TagsNodeKey tagsNodeKey) { - return new TagsNode(); + public AbstractNode visit(Tags tagsNodeKey) { + return tagsNodeKey.new RootNode(); } @Override diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/AutopsyItemVisitor.java b/Core/src/org/sleuthkit/autopsy/datamodel/AutopsyItemVisitor.java index 1f4ab0a94e..1f5cf9ae71 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/AutopsyItemVisitor.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/AutopsyItemVisitor.java @@ -50,7 +50,7 @@ package org.sleuthkit.autopsy.datamodel; T visit(EmailExtracted ee); - T visit(TagsNodeKey tagsNodeKey); + T visit(Tags tagsNodeKey); T visit(InterestingHits ih); @@ -139,7 +139,7 @@ package org.sleuthkit.autopsy.datamodel; } @Override - public T visit(TagsNodeKey tagsNodeKey) { + public T visit(Tags tagsNodeKey) { return defaultVisit(tagsNodeKey); } diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/Bundle.properties b/Core/src/org/sleuthkit/autopsy/datamodel/Bundle.properties index 9fccb340ce..45e8f78bd1 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/datamodel/Bundle.properties @@ -48,6 +48,9 @@ BlackboardArtifactTagNode.createSheet.unavail.text=Unavailable BlackboardArtifactTagNode.createSheet.srcFilePath.text=Source File Path BlackboardArtifactTagNode.createSheet.resultType.text=Result Type BlackboardArtifactTagNode.createSheet.comment.text=Comment +BlackboardArtifactTagTypeNode.displayName.text=Result Tags +BlackboardArtifactTagTypeNode.createSheet.name.name=Name +BlackboardArtifactTagTypeNode.createSheet.name.displayName=Name ContentTagNode.createSheet.file.name=File ContentTagNode.createSheet.file.displayName=File ContentTagNode.createSheet.unavail.path=Unavailable diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/datamodel/Bundle_ja.properties index 6e0bb7a032..99286125a3 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/Bundle_ja.properties +++ b/Core/src/org/sleuthkit/autopsy/datamodel/Bundle_ja.properties @@ -1,250 +1,253 @@ -OpenIDE-Module-Name=\u30C7\u30FC\u30BF\u30E2\u30C7\u30EB -AbstractAbstractFileNode.nameColLbl=\u540D\u524D -AbstractAbstractFileNode.locationColLbl=\u30ED\u30B1\u30FC\u30B7\u30E7\u30F3 -AbstractAbstractFileNode.modifiedTimeColLbl=\u4FEE\u6B63\u65E5\u6642 -AbstractAbstractFileNode.changeTimeColLbl=\u5909\u66F4\u65E5\u6642 -AbstractAbstractFileNode.accessTimeColLbl=\u30A2\u30AF\u30BB\u30B9\u65E5\u6642 -AbstractAbstractFileNode.createdTimeColLbl=\u4F5C\u6210\u65E5\u6642 -AbstractAbstractFileNode.sizeColLbl=\u30B5\u30A4\u30BA -AbstractAbstractFileNode.modeColLbl=\u30E2\u30FC\u30C9 -AbstractAbstractFileNode.useridColLbl=\u30E6\u30FC\u30B6ID -AbstractAbstractFileNode.groupidColLbl=\u30B0\u30EB\u30FC\u30D7ID -AbstractAbstractFileNode.knownColLbl=\u65E2\u77E5 -AbstractAbstractFileNode.inHashsetsColLbl=HashSet\u306B\u5B58\u5728 -AbstractAbstractFileNode.md5HashColLbl=MD5\u30CF\u30C3\u30B7\u30E5 -AbstractContentChildren.CreateTSKNodeVisitor.exception.noNodeMsg=\u6307\u5B9A\u3055\u308C\u305FSleuthkitItem\u306E\u30CE\u30FC\u30C9\u304C\u5B9A\u7FA9\u3055\u308C\u3066\u3044\u307E\u305B\u3093 -AbstractContentChildren.createAutopsyNodeVisitor.exception.noNodeMsg=\u6307\u5B9A\u3055\u308C\u305F\u8868\u793A\u53EF\u80FD\u306A\u30A2\u30A4\u30C6\u30E0\u306E\u30CE\u30FC\u30C9\u304C\u5B9A\u7FA9\u3055\u308C\u3066\u3044\u307E\u305B\u3093 -AbstractContentNode.exception.cannotChangeSysName.msg=\u30B7\u30B9\u30C6\u30E0\u540D\u3092\u5909\u66F4\u3067\u304D\u307E\u305B\u3093\u3002 -AbstractFsContentNode.noDesc.text=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093 -ArtifactStringContent.getStr.srcFilePath.text=\u30BD\u30FC\u30B9\u30D5\u30A1\u30A4\u30EB\u30D1\u30B9 -ArtifactStringContent.getStr.err=\u30B3\u30F3\u30C6\u30F3\u30C4\u53D6\u5F97\u30A8\u30E9\u30FC -ArtifactStringContent.exception.msg=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u304B\u3089\u30D5\u30A1\u30A4\u30EB\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F -ArtifactTypeNode.createSheet.artType.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093 -ArtifactTypeNode.createSheet.childCnt.name=\u30C1\u30E3\u30A4\u30EB\u30C9\u6570 -ArtifactTypeNode.createSheet.childCnt.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093 -BlackboardArtifactNode.noDesc.text=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093 -BlackboardArtifactNode.createSheet.srcFile.name=\u30BD\u30FC\u30B9\u30D5\u30A1\u30A4\u30EB -BlackboardArtifactNode.createSheet.srcFile.displayName=\u30BD\u30FC\u30B9\u30D5\u30A1\u30A4\u30EB -BlackboardArtifactNode.createSheet.ext.name=\u62E1\u5F35\u5B50 -BlackboardArtifactNode.createSheet.ext.displayName=\u62E1\u5F35\u5B50 -BlackboardArtifactNode.createSheet.mimeType.name=MIME\u30BF\u30A4\u30D7 -BlackboardArtifactNode.createSheet.mimeType.displayName=MIME\u30BF\u30A4\u30D7 -BlackboardArtifactNode.createSheet.filePath.name=\u30D5\u30A1\u30A4\u30EB\u30D1\u30B9 -BlackboardArtifactNode.createSheet.filePath.displayName=\u30D5\u30A1\u30A4\u30EB\u30D1\u30B9 -BlackboardArtifactNode.createSheet.dataSrc.name=\u30C7\u30FC\u30BF\u30BD\u30FC\u30B9 -BlackboardArtifactNode.createSheet.dataSrc.displayName=\u30C7\u30FC\u30BF\u30BD\u30FC\u30B9 -BlackboardArtifactNode.getAssocCont.exception.msg=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u304B\u3089\u30D5\u30A1\u30A4\u30EB\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F -BlackboardArtifactTagNode.createSheet.srcFile.text=\u30BD\u30FC\u30B9\u30D5\u30A1\u30A4\u30EB -BlackboardArtifactTagNode.createSheet.unavail.text=\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093 -BlackboardArtifactTagNode.createSheet.srcFilePath.text=\u30BD\u30FC\u30B9\u30D5\u30A1\u30A4\u30EB\u30D1\u30B9 -BlackboardArtifactTagNode.createSheet.resultType.text=\u7D50\u679C\u30BF\u30A4\u30D7 -BlackboardArtifactTagNode.createSheet.comment.text=\u30B3\u30E1\u30F3\u30C8 -ContentTagNode.createSheet.file.name=\u30D5\u30A1\u30A4\u30EB -ContentTagNode.createSheet.file.displayName=\u30D5\u30A1\u30A4\u30EB -ContentTagNode.createSheet.unavail.path=\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093 -ContentTagNode.createSheet.filePath.name=\u30D5\u30A1\u30A4\u30EB\u30D1\u30B9 -ContentTagNode.createSheet.filePath.displayName=\u30D5\u30A1\u30A4\u30EB\u30D1\u30B9 -ContentTagNode.createSheet.comment.name=\u30B3\u30E1\u30F3\u30C8 -ContentTagNode.createSheet.comment.displayName=\u30B3\u30E1\u30F3\u30C8 -ContentTagTypeNode.displayName.text=\u30D5\u30A1\u30A4\u30EB\u30BF\u30B0 -ContentTagTypeNode.createSheet.name.name=\u540D\u524D -ContentTagTypeNode.createSheet.name.displayName=\u540D\u524D -ContentUtils.exception.msg={0}\u3092\u62BD\u51FA\u3067\u304D\u307E\u305B\u3093 -DataModelActionsFactory.srcFileInDir.text=\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u5185\u306E\u30BD\u30FC\u30B9\u30D5\u30A1\u30A4\u30EB\u3092\u8868\u793A -DataModelActionsFactory.fileInDir.text=\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u5185\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u8868\u793A -DataModelActionsFactory.viewNewWin.text=\u65B0\u898F\u30A6\u30A3\u30F3\u30C9\u30A6\u306B\u8868\u793A -DataModelActionsFactory.openExtViewer.text=\u5916\u90E8\u30D3\u30E5\u30FC\u30A2\u306B\u8868\u793A -DataModelActionsFactory.srfFileSameMD5.text=\u540C\u3058MD5\u30CF\u30C3\u30B7\u30E5\u3092\u6301\u3064\u30D5\u30A1\u30A4\u30EB\u3092\u691C\u7D22 -DataSourcesNode.name=\u30C7\u30FC\u30BF\u30BD\u30FC\u30B9 -DataSourcesNode.createSheet.name.name=\u540D\u524D -DataSourcesNode.createSheet.name.displayName=\u540D\u524D -DataSourcesNode.createSheet.name.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093 -DeletedContent.fsDelFilter.text=\u30D5\u30A1\u30A4\u30EB\u30B7\u30B9\u30C6\u30E0 +OpenIDE-Module-Name=\u30c7\u30fc\u30bf\u30e2\u30c7\u30eb +AbstractAbstractFileNode.nameColLbl=\u540d\u524d +AbstractAbstractFileNode.locationColLbl=\u30ed\u30b1\u30fc\u30b7\u30e7\u30f3 +AbstractAbstractFileNode.modifiedTimeColLbl=\u4fee\u6b63\u65e5\u6642 +AbstractAbstractFileNode.changeTimeColLbl=\u5909\u66f4\u65e5\u6642 +AbstractAbstractFileNode.accessTimeColLbl=\u30a2\u30af\u30bb\u30b9\u65e5\u6642 +AbstractAbstractFileNode.createdTimeColLbl=\u4f5c\u6210\u65e5\u6642 +AbstractAbstractFileNode.sizeColLbl=\u30b5\u30a4\u30ba +AbstractAbstractFileNode.modeColLbl=\u30e2\u30fc\u30c9 +AbstractAbstractFileNode.useridColLbl=\u30e6\u30fc\u30b6ID +AbstractAbstractFileNode.groupidColLbl=\u30b0\u30eb\u30fc\u30d7ID +AbstractAbstractFileNode.knownColLbl=\u65e2\u77e5 +AbstractAbstractFileNode.inHashsetsColLbl=HashSet\u306b\u5b58\u5728 +AbstractAbstractFileNode.md5HashColLbl=MD5\u30cf\u30c3\u30b7\u30e5 +AbstractContentChildren.CreateTSKNodeVisitor.exception.noNodeMsg=\u6307\u5b9a\u3055\u308c\u305fSleuthkitItem\u306e\u30ce\u30fc\u30c9\u304c\u5b9a\u7fa9\u3055\u308c\u3066\u3044\u307e\u305b\u3093 +AbstractContentChildren.createAutopsyNodeVisitor.exception.noNodeMsg=\u6307\u5b9a\u3055\u308c\u305f\u8868\u793a\u53ef\u80fd\u306a\u30a2\u30a4\u30c6\u30e0\u306e\u30ce\u30fc\u30c9\u304c\u5b9a\u7fa9\u3055\u308c\u3066\u3044\u307e\u305b\u3093 +AbstractContentNode.exception.cannotChangeSysName.msg=\u30b7\u30b9\u30c6\u30e0\u540d\u3092\u5909\u66f4\u3067\u304d\u307e\u305b\u3093\u3002 +AbstractFsContentNode.noDesc.text=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093 +ArtifactStringContent.getStr.srcFilePath.text=\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9 +ArtifactStringContent.getStr.err=\u30b3\u30f3\u30c6\u30f3\u30c4\u53d6\u5f97\u30a8\u30e9\u30fc +ArtifactStringContent.exception.msg=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304b\u3089\u30d5\u30a1\u30a4\u30eb\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +ArtifactTypeNode.createSheet.artType.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093 +ArtifactTypeNode.createSheet.childCnt.name=\u30c1\u30e3\u30a4\u30eb\u30c9\u6570 +ArtifactTypeNode.createSheet.childCnt.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093 +BlackboardArtifactNode.noDesc.text=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093 +BlackboardArtifactNode.createSheet.srcFile.name=\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb +BlackboardArtifactNode.createSheet.srcFile.displayName=\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb +BlackboardArtifactNode.createSheet.ext.name=\u62e1\u5f35\u5b50 +BlackboardArtifactNode.createSheet.ext.displayName=\u62e1\u5f35\u5b50 +BlackboardArtifactNode.createSheet.mimeType.name=MIME\u30bf\u30a4\u30d7 +BlackboardArtifactNode.createSheet.mimeType.displayName=MIME\u30bf\u30a4\u30d7 +BlackboardArtifactNode.createSheet.filePath.name=\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9 +BlackboardArtifactNode.createSheet.filePath.displayName=\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9 +BlackboardArtifactNode.createSheet.dataSrc.name=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9 +BlackboardArtifactNode.createSheet.dataSrc.displayName=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9 +BlackboardArtifactNode.getAssocCont.exception.msg=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304b\u3089\u30d5\u30a1\u30a4\u30eb\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +BlackboardArtifactTagNode.createSheet.srcFile.text=\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb +BlackboardArtifactTagNode.createSheet.unavail.text=\u4f7f\u7528\u3067\u304d\u307e\u305b\u3093 +BlackboardArtifactTagNode.createSheet.srcFilePath.text=\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9 +BlackboardArtifactTagNode.createSheet.resultType.text=\u7d50\u679c\u30bf\u30a4\u30d7 +BlackboardArtifactTagNode.createSheet.comment.text=\u30b3\u30e1\u30f3\u30c8 +BlackboardArtifactTagTypeNode.displayName.text=\u7d50\u679c\u30bf\u30b0 +BlackboardArtifactTagTypeNode.createSheet.name.name=\u540d\u524d +BlackboardArtifactTagTypeNode.createSheet.name.displayName=\u540d\u524d +ContentTagNode.createSheet.file.name=\u30d5\u30a1\u30a4\u30eb +ContentTagNode.createSheet.file.displayName=\u30d5\u30a1\u30a4\u30eb +ContentTagNode.createSheet.unavail.path=\u4f7f\u7528\u3067\u304d\u307e\u305b\u3093 +ContentTagNode.createSheet.filePath.name=\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9 +ContentTagNode.createSheet.filePath.displayName=\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9 +ContentTagNode.createSheet.comment.name=\u30b3\u30e1\u30f3\u30c8 +ContentTagNode.createSheet.comment.displayName=\u30b3\u30e1\u30f3\u30c8 +ContentTagTypeNode.displayName.text=\u30d5\u30a1\u30a4\u30eb\u30bf\u30b0 +ContentTagTypeNode.createSheet.name.name=\u540d\u524d +ContentTagTypeNode.createSheet.name.displayName=\u540d\u524d +ContentUtils.exception.msg={0}\u3092\u62bd\u51fa\u3067\u304d\u307e\u305b\u3093 +DataModelActionsFactory.srcFileInDir.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u5185\u306e\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb\u3092\u8868\u793a +DataModelActionsFactory.fileInDir.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u5185\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u8868\u793a +DataModelActionsFactory.viewNewWin.text=\u65b0\u898f\u30a6\u30a3\u30f3\u30c9\u30a6\u306b\u8868\u793a +DataModelActionsFactory.openExtViewer.text=\u5916\u90e8\u30d3\u30e5\u30fc\u30a2\u306b\u8868\u793a +DataModelActionsFactory.srfFileSameMD5.text=\u540c\u3058MD5\u30cf\u30c3\u30b7\u30e5\u3092\u6301\u3064\u30d5\u30a1\u30a4\u30eb\u3092\u691c\u7d22 +DataSourcesNode.name=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9 +DataSourcesNode.createSheet.name.name=\u540d\u524d +DataSourcesNode.createSheet.name.displayName=\u540d\u524d +DataSourcesNode.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093 +DeletedContent.fsDelFilter.text=\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0 DeletedContent.allDelFilter.text=\u3059\u3079\u3066 -DeletedContent.deletedContentsNode.name=\u524A\u9664\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB -DeletedContent.createSheet.name.name=\u540D\u524D -DeletedContent.createSheet.name.displayName=\u540D\u524D -DeletedContent.createSheet.name.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093 -DeletedContent.createSheet.filterType.name=\u30D5\u30A1\u30A4\u30EB\u30BF\u30BF\u30A4\u30D7 -DeletedContent.createSheet.filterType.displayName=\u30D5\u30A3\u30EB\u30BF\u30BF\u30A4\u30D7 -DeletedContent.createSheet.filterType.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093 -DeletedContent.createKeys.maxObjects.msg=\u8868\u793A\u53EF\u80FD\u306A\u6570\u3088\u308A\u3082\u591A\u304F\u306E\u524A\u9664\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB\u304C\u5B58\u5728\u3057\u307E\u3059\u3002\u6700\u521D\u306E{0}\u306E\u524A\u9664\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002 -DeletedContent.createNodeForKey.typeNotSupported.msg=\u3053\u306E\u30BF\u30A4\u30D7\u306E\u8868\u793A\u53EF\u80FD\u306A\u30A2\u30A4\u30C6\u30E0\u306F\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093\uFF1A{0} -DirectoryNode.parFolder.text=[\u30DA\u30A2\u30EC\u30F3\u30C8\u30D5\u30A9\u30EB\u30C0] -DirectoryNode.curFolder.text=[\u73FE\u5728\u306E\u30D5\u30A9\u30EB\u30C0] -DirectoryNode.getActions.viewFileInDir.text=\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u5185\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u8868\u793A -DirectoryNode.viewInNewWin.text=\u65B0\u898F\u30A6\u30A3\u30F3\u30C9\u30A6\u306B\u8868\u793A -EmailExtracted.mailAccount.text=\u30A2\u30AB\u30A6\u30F3\u30C8 -EmailExtracted.mailFolder.text=\u30D5\u30A9\u30EB\u30C0 -EmailExtracted.defaultAcct.text=\u30C7\u30D5\u30A9\u30EB\u30C8 -EmailExtracted.defaultFolder.text=\u30C7\u30D5\u30A9\u30EB\u30C8 -EmailExtracted.createSheet.name.name=\u540D\u524D -EmailExtracted.createSheet.name.displayName=\u540D\u524D -EmailExtracted.createSheet.name.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093 -ExtractedContentNode.name.text=\u62BD\u51FA\u3055\u308C\u305F\u30B3\u30F3\u30C6\u30F3\u30C4 -ExtractedContentNode.createSheet.name.name=\u540D\u524D -ExtractedContentNode.createSheet.name.displayName=\u540D\u524D -ExtractedContentNode.createSheet.name.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093 -FileNode.viewFileInDir.text=\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u5185\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u8868\u793A -FileNode.getActions.viewInNewWin.text=\u65B0\u898F\u30A6\u30A3\u30F3\u30C9\u30A6\u306B\u8868\u793A -FileNode.getActions.openInExtViewer.text=\u5916\u90E8\u30D3\u30E5\u30FC\u30A2\u3067\u958B\u304F -FileNode.getActions.searchFilesSameMD5.text=\u540C\u3058MD5\u30CF\u30C3\u30B7\u30E5\u3092\u6301\u3064\u30D5\u30A1\u30A4\u30EB\u3092\u691C\u7D22 -FileSize.fileSizeRootNode.name=\u30D5\u30A1\u30A4\u30EB\u30B5\u30A4\u30BA -FileSize.createSheet.name.name=\u540D\u524D -FileSize.createSheet.name.displayName=\u540D\u524D -FileSize.createSheet.name.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093 -FileSize.createSheet.filterType.name=\u30D5\u30A3\u30EB\u30BF\u30BF\u30A4\u30D7 -FileSize.createSheet.filterType.displayName=\u30D5\u30A3\u30EB\u30BF\u30BF\u30A4\u30D7 -FileSize.createSheet.filterType.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093 -FileSize.exception.notSupported.msg=\u3053\u306E\u30BF\u30A4\u30D7\u306E\u8868\u793A\u53EF\u80FD\u306A\u30A2\u30A4\u30C6\u30E0\u306F\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093\uFF1A{0} -FileTypeChildren.exception.notSupported.msg=\u3053\u306E\u30BF\u30A4\u30D7\u306E\u8868\u793A\u53EF\u80FD\u306A\u30A2\u30A4\u30C6\u30E0\u306F\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093\uFF1A{0} -FileTypeExtensionFilters.tskImgFilter.text=\u30A4\u30E1\u30FC\u30B8 -FileTypeExtensionFilters.tskVideoFilter.text=\u30D3\u30C7\u30AA -FileTypeExtensionFilters.tskAudioFilter.text=\u30AA\u30FC\u30C7\u30A3\u30AA -FileTypeExtensionFilters.tskArchiveFilter.text=\u30A2\u30FC\u30AB\u30A4\u30D6 -FileTypeExtensionFilters.tskDocumentFilter.text=\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8 -FileTypeExtensionFilters.tskExecFilter.text=\u5B9F\u884C\u53EF\u80FD +DeletedContent.deletedContentsNode.name=\u524a\u9664\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb +DeletedContent.createSheet.name.name=\u540d\u524d +DeletedContent.createSheet.name.displayName=\u540d\u524d +DeletedContent.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093 +DeletedContent.createSheet.filterType.name=\u30d5\u30a1\u30a4\u30eb\u30bf\u30bf\u30a4\u30d7 +DeletedContent.createSheet.filterType.displayName=\u30d5\u30a3\u30eb\u30bf\u30bf\u30a4\u30d7 +DeletedContent.createSheet.filterType.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093 +DeletedContent.createKeys.maxObjects.msg=\u8868\u793a\u53ef\u80fd\u306a\u6570\u3088\u308a\u3082\u591a\u304f\u306e\u524a\u9664\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u304c\u5b58\u5728\u3057\u307e\u3059\u3002\u6700\u521d\u306e{0}\u306e\u524a\u9664\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002 +DeletedContent.createNodeForKey.typeNotSupported.msg=\u3053\u306e\u30bf\u30a4\u30d7\u306e\u8868\u793a\u53ef\u80fd\u306a\u30a2\u30a4\u30c6\u30e0\u306f\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093\uff1a{0} +DirectoryNode.parFolder.text=[\u30da\u30a2\u30ec\u30f3\u30c8\u30d5\u30a9\u30eb\u30c0] +DirectoryNode.curFolder.text=[\u73fe\u5728\u306e\u30d5\u30a9\u30eb\u30c0] +DirectoryNode.getActions.viewFileInDir.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u5185\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u8868\u793a +DirectoryNode.viewInNewWin.text=\u65b0\u898f\u30a6\u30a3\u30f3\u30c9\u30a6\u306b\u8868\u793a +EmailExtracted.mailAccount.text=\u30a2\u30ab\u30a6\u30f3\u30c8 +EmailExtracted.mailFolder.text=\u30d5\u30a9\u30eb\u30c0 +EmailExtracted.defaultAcct.text=\u30c7\u30d5\u30a9\u30eb\u30c8 +EmailExtracted.defaultFolder.text=\u30c7\u30d5\u30a9\u30eb\u30c8 +EmailExtracted.createSheet.name.name=\u540d\u524d +EmailExtracted.createSheet.name.displayName=\u540d\u524d +EmailExtracted.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093 +ExtractedContentNode.name.text=\u62bd\u51fa\u3055\u308c\u305f\u30b3\u30f3\u30c6\u30f3\u30c4 +ExtractedContentNode.createSheet.name.name=\u540d\u524d +ExtractedContentNode.createSheet.name.displayName=\u540d\u524d +ExtractedContentNode.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093 +FileNode.viewFileInDir.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u5185\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u8868\u793a +FileNode.getActions.viewInNewWin.text=\u65b0\u898f\u30a6\u30a3\u30f3\u30c9\u30a6\u306b\u8868\u793a +FileNode.getActions.openInExtViewer.text=\u5916\u90e8\u30d3\u30e5\u30fc\u30a2\u3067\u958b\u304f +FileNode.getActions.searchFilesSameMD5.text=\u540c\u3058MD5\u30cf\u30c3\u30b7\u30e5\u3092\u6301\u3064\u30d5\u30a1\u30a4\u30eb\u3092\u691c\u7d22 +FileSize.fileSizeRootNode.name=\u30d5\u30a1\u30a4\u30eb\u30b5\u30a4\u30ba +FileSize.createSheet.name.name=\u540d\u524d +FileSize.createSheet.name.displayName=\u540d\u524d +FileSize.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093 +FileSize.createSheet.filterType.name=\u30d5\u30a3\u30eb\u30bf\u30bf\u30a4\u30d7 +FileSize.createSheet.filterType.displayName=\u30d5\u30a3\u30eb\u30bf\u30bf\u30a4\u30d7 +FileSize.createSheet.filterType.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093 +FileSize.exception.notSupported.msg=\u3053\u306e\u30bf\u30a4\u30d7\u306e\u8868\u793a\u53ef\u80fd\u306a\u30a2\u30a4\u30c6\u30e0\u306f\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093\uff1a{0} +FileTypeChildren.exception.notSupported.msg=\u3053\u306e\u30bf\u30a4\u30d7\u306e\u8868\u793a\u53ef\u80fd\u306a\u30a2\u30a4\u30c6\u30e0\u306f\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093\uff1a{0} +FileTypeExtensionFilters.tskImgFilter.text=\u30a4\u30e1\u30fc\u30b8 +FileTypeExtensionFilters.tskVideoFilter.text=\u30d3\u30c7\u30aa +FileTypeExtensionFilters.tskAudioFilter.text=\u30aa\u30fc\u30c7\u30a3\u30aa +FileTypeExtensionFilters.tskArchiveFilter.text=\u30a2\u30fc\u30ab\u30a4\u30d6 +FileTypeExtensionFilters.tskDocumentFilter.text=\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8 +FileTypeExtensionFilters.tskExecFilter.text=\u5b9f\u884c\u53ef\u80fd FileTypeExtensionFilters.autDocHtmlFilter.text=HTML -FileTypeExtensionFilters.autDocOfficeFilter.text=\u30AA\u30D5\u30A3\u30B9 +FileTypeExtensionFilters.autDocOfficeFilter.text=\u30aa\u30d5\u30a3\u30b9 FileTypeExtensionFilters.autoDocPdfFilter.text=PDF -FileTypeExtensionFilters.autDocTxtFilter.text=\u30D7\u30EC\u30FC\u30F3\u30C6\u30AD\u30B9\u30C8 -FileTypeExtensionFilters.autDocRtfFilter.text=\u30EA\u30C3\u30C1\u30C6\u30AD\u30B9\u30C8 -FileTypeNode.createSheet.filterType.name=\u30D5\u30A3\u30EB\u30BF\u30BF\u30A4\u30D7 -FileTypeNode.createSheet.filterType.displayName=\u30D5\u30A3\u30EB\u30BF\u30BF\u30A4\u30D7 -FileTypeNode.createSheet.filterType.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093 -FileTypeNode.createSheet.fileExt.name=\u30D5\u30A1\u30A4\u30EB\u62E1\u5F35\u5B50 -FileTypeNode.createSheet.fileExt.displayName=\u30D5\u30A1\u30A4\u30EB\u62E1\u5F35\u5B50 -FileTypeNode.createSheet.fileExt.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093 -FileTypesNode.fname.text=\u30D5\u30A1\u30A4\u30EB\u30BF\u30A4\u30D7 -FileTypesNode.createSheet.name.name=\u540D\u524D -FileTypesNode.createSheet.name.displayName=\u540D\u524D -FileTypesNode.createSheet.name.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093 -HashsetHits.createSheet.name.name=\u540D\u524D -HashsetHits.createSheet.name.displayName=\u540D\u524D -HashsetHits.createSheet.name.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093 -ImageNode.getActions.viewInNewWin.text=\u65B0\u898F\u30A6\u30A3\u30F3\u30C9\u30A6\u306B\u8868\u793A -ImageNode.getActions.openFileSearchByAttr.text=\u5C5E\u6027\u306B\u3088\u308B\u30D5\u30A1\u30A4\u30EB\u691C\u7D22\u3092\u958B\u304F -ImageNode.createSheet.name.name=\u540D\u524D -ImageNode.createSheet.name.displayName=\u540D\u524D -ImageNode.createSheet.name.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093 -Installer.exception.tskVerStringNull.msg=Sleuth Kit JNI\u30C6\u30B9\u30C8\u30B3\u30FC\u30EB\u3067\u306F\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u305B\u3093\u3067\u3057\u305F\u304C\u3001\u30D0\u30FC\u30B8\u30E7\u30F3\u30B9\u30C8\u30EA\u30F3\u30B0\u306F\u30CC\u30EB\u3067\u3057\u305F\uFF01 -Installer.tskLibErr.msg=Sleuth Kit JNI\u306B\u554F\u984C\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\u30C6\u30B9\u30C8\u30B3\u30FC\u30EB\u304C\u5931\u6557\u3057\u307E\u3057\u305F\uFF1A\ +FileTypeExtensionFilters.autDocTxtFilter.text=\u30d7\u30ec\u30fc\u30f3\u30c6\u30ad\u30b9\u30c8 +FileTypeExtensionFilters.autDocRtfFilter.text=\u30ea\u30c3\u30c1\u30c6\u30ad\u30b9\u30c8 +FileTypeNode.createSheet.filterType.name=\u30d5\u30a3\u30eb\u30bf\u30bf\u30a4\u30d7 +FileTypeNode.createSheet.filterType.displayName=\u30d5\u30a3\u30eb\u30bf\u30bf\u30a4\u30d7 +FileTypeNode.createSheet.filterType.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093 +FileTypeNode.createSheet.fileExt.name=\u30d5\u30a1\u30a4\u30eb\u62e1\u5f35\u5b50 +FileTypeNode.createSheet.fileExt.displayName=\u30d5\u30a1\u30a4\u30eb\u62e1\u5f35\u5b50 +FileTypeNode.createSheet.fileExt.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093 +FileTypesNode.fname.text=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7 +FileTypesNode.createSheet.name.name=\u540d\u524d +FileTypesNode.createSheet.name.displayName=\u540d\u524d +FileTypesNode.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093 +HashsetHits.createSheet.name.name=\u540d\u524d +HashsetHits.createSheet.name.displayName=\u540d\u524d +HashsetHits.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093 +ImageNode.getActions.viewInNewWin.text=\u65b0\u898f\u30a6\u30a3\u30f3\u30c9\u30a6\u306b\u8868\u793a +ImageNode.getActions.openFileSearchByAttr.text=\u5c5e\u6027\u306b\u3088\u308b\u30d5\u30a1\u30a4\u30eb\u691c\u7d22\u3092\u958b\u304f +ImageNode.createSheet.name.name=\u540d\u524d +ImageNode.createSheet.name.displayName=\u540d\u524d +ImageNode.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093 +Installer.exception.tskVerStringNull.msg=Sleuth Kit JNI\u30c6\u30b9\u30c8\u30b3\u30fc\u30eb\u3067\u306f\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u305b\u3093\u3067\u3057\u305f\u304c\u3001\u30d0\u30fc\u30b8\u30e7\u30f3\u30b9\u30c8\u30ea\u30f3\u30b0\u306f\u30cc\u30eb\u3067\u3057\u305f\uff01 +Installer.tskLibErr.msg=Sleuth Kit JNI\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002\u30c6\u30b9\u30c8\u30b3\u30fc\u30eb\u304c\u5931\u6557\u3057\u307e\u3057\u305f\uff1a\ \ -\u8A73\u7D30\uFF1A {0} -Installer.tskLibErr.err=\u81F4\u547D\u7684\u30A8\u30E9\u30FC\uFF1A -InterestingHits.interestingItems.text=\u7591\u308F\u3057\u3044\u30A2\u30A4\u30C6\u30E0 -InterestingHits.displayName.text=\u7591\u308F\u3057\u3044\u30A2\u30A4\u30C6\u30E0 -InterestingHits.createSheet.name.name=\u540D\u524D -InterestingHits.createSheet.name.displayName=\u540D\u524D -InterestingHits.createSheet.name.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093 -KeyValueNode.createSheet.name.name=\u540D\u524D -KeyValueNode.createSheet.name.displayName=\u540D\u524D -KeyValueNode.createSheet.name.desc=\u8A72\u5F53\u306A\u3057 -KeyValueNode.createSheet.map.desc=\u8A72\u5F53\u306A\u3057 -KeywordHits.kwHits.text=\u30AD\u30FC\u30EF\u30FC\u30C9\u30D2\u30C3\u30C8 -KeywordHits.createSheet.name.name=\u540D\u524D -KeywordHits.createSheet.name.displayName=\u540D\u524D -KeywordHits.createSheet.name.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093 -KeywordHits.createSheet.listName.name=\u30EA\u30B9\u30C8\u540D -KeywordHits.createSheet.listName.displayName=\u30EA\u30B9\u30C8\u540D -KeywordHits.createSheet.listName.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093 -KeywordHits.createSheet.numChildren.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093 -KeywordHits.createSheet.filesWithHits.name=\u30D2\u30C3\u30C8\u3057\u305F\u30D5\u30A1\u30A4\u30EB -KeywordHits.createSheet.filesWithHits.displayName=\u30D2\u30C3\u30C8\u3057\u305F\u30D5\u30A1\u30A4\u30EB -KeywordHits.createSheet.filesWithHits.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093 -KeywordHits.createNodeForKey.modTime.displayName=\u4FEE\u6B63\u65E5\u6642 -KeywordHits.createNodeForKey.modTime.desc=\u4FEE\u6B63\u65E5\u6642 -KeywordHits.createNodeForKey.accessTime.displayName=\u30A2\u30AF\u30BB\u30B9\u65E5\u6642 -KeywordHits.createNodeForKey.accessTime.desc=\u30A2\u30AF\u30BB\u30B9\u65E5\u6642 -KeywordHits.createNodeForKey.chgTime.displayName=\u5909\u66F4\u65E5\u6642 -KeywordHits.createNodeForKey.chgTime.desc=\u5909\u66F4\u65E5\u6642 -KeywordHits.createNodeForKey.chgTime.name=\u5909\u66F4\u65E5\u6642 -KeywordHits.createNodeForKey.accessTime.name=\u30A2\u30AF\u30BB\u30B9\u65E5\u6642 -KeywordHits.createNodeForKey.modTime.name=\u4FEE\u6B63\u65E5\u6642 -KnownFileFilterNode.selectionContext.dataSources=\u30C7\u30FC\u30BF\u30BD\u30FC\u30B9 -KnownFileFilterNode.selectionContext.views=\u30D3\u30E5\u30FC -LayoutFileNode.propertyType.parts=\u30D1\u30FC\u30C4 -LayoutFileNode.createSheet.name.name=\u540D\u524D -LayoutFileNode.createSheet.name.displayName=\u540D\u524D -LayoutFileNode.createSheet.name.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093 -LayoutFileNode.createSheet.noDescr.text=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093 -LayoutFileNode.getActions.viewInNewWin.text=\u65B0\u898F\u30A6\u30A3\u30F3\u30C9\u30A6\u3067\u8868\u793A -LayoutFileNode.getActions.openInExtViewer.text=\u5916\u90E8\u30D3\u30E5\u30FC\u30A2\u3067\u958B\u304F -LocalFileNode.createSheet.name.name=\u540D\u524D -LocalFileNode.createSheet.name.displayName=\u540D\u524D -LocalFileNode.createSheet.name.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093 -LocalFileNode.createSheet.noDescr.text=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093 -LocalFileNode.getActions.viewInNewWin.text=\u65B0\u898F\u30A6\u30A3\u30F3\u30C9\u30A6\u306B\u8868\u793A -LocalFileNode.getActions.openInExtViewer.text=\u5916\u90E8\u30D3\u30E5\u30FC\u30A2\u3067\u958B\u304F -LocalFileNode.getActions.searchFilesSameMd5.text=\u540C\u3058MD5\u30CF\u30C3\u30B7\u30E5\u3092\u6301\u3064\u30D5\u30A1\u30A4\u30EB\u3092\u691C\u7D22 -RecentFiles.aut0DayFilter.displayName.text=\u6700\u7D42\u65E5 -RecentFiles.aut1dayFilter.displayName.text=\u6700\u7D42\u65E5 - 1 -RecentFiles.aut2dayFilter.displayName.text=\u6700\u7D42\u65E5 - \uFF12 -RecentFiles.aut3dayFilter.displayName.text=\u6700\u7D42\u65E5 - \uFF13 -RecentFiles.aut4dayFilter.displayName.text=\u6700\u7D42\u65E5 - \uFF14 -RecentFiles.aut5dayFilter.displayName.text=\u6700\u7D42\u65E5 - \uFF15 -RecentFiles.aut6dayFilter.displayName.text=\u6700\u7D42\u65E5 - \uFF16 -RecentFilesFilterChildren.exception.defaultVisit.msg=\u3053\u306E\u30BF\u30A4\u30D7\u306E\u8868\u793A\u3067\u304D\u308B\u30A2\u30A4\u30C6\u30E0 -Installer.exception.taskVerStringBang.msg=Sleuth Kit JNI\u30C6\u30B9\u30C8\u30B3\u30FC\u30EB\u3067\u306F\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u305B\u3093\u3067\u3057\u305F\u304C\u3001\u30D0\u30FC\u30B8\u30E7\u30F3\u30B9\u30C8\u30EA\u30F3\u30B0\u306F""\u3067\u3057\u305F\uFF01 -RecentFilesFilterNode.createSheet.filterType.name=\u30D5\u30A3\u30EB\u30BF\u30BF\u30A4\u30D7 -RecentFilesFilterNode.createSheet.filterType.displayName=\u30D5\u30A3\u30EB\u30BF\u30BF\u30A4\u30D7 -RecentFilesFilterNode.createSheet.filterType.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093 -RecentFilesNode.createSheet.name.name=\u540D\u524D -RecentFilesNode.createSheet.name.displayName=\u540D\u524D -RecentFilesNode.createSheet.name.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093 -RecentFilesNode.name.text=\u6700\u8FD1\u4F7F\u7528\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB -ResultsNode.name.text=\u7D50\u679C -ResultsNode.createSheet.name.name=\u540D\u524D -ResultsNode.createSheet.name.displayName=\u540D\u524D -ResultsNode.createSheet.name.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093 -TagNameNode.namePlusTags.text={0}\u30BF\u30B0 -TagNameNode.contentTagTypeNodeKey.text=\u30B3\u30F3\u30C6\u30F3\u30C4\u30BF\u30B0 -TagNameNode.bbArtTagTypeNodeKey.text=\u7D50\u679C\u30BF\u30B0 -TagNameNode.bookmark.text=\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF -TagNameNode.createSheet.name.name=\u540D\u524D -TagNameNode.createSheet.name.displayName=\u540D\u524D -TagsNode.displayName.text=\u30BF\u30B0 -TagsNode.createSheet.name.name=\u540D\u524D -AbstractAbstractFileNode.flagsDirColLbl=\u30D5\u30E9\u30B0\uFF08\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\uFF09 -AbstractAbstractFileNode.flagsMetaColLbl=\u30D5\u30E9\u30B0\uFF08\u30E1\u30BF\u30C7\u30FC\u30BF\uFF09 -AbstractAbstractFileNode.metaAddrColLbl=\u30E1\u30BF\u30C7\u30FC\u30BF\u30A2\u30C9\u30EC\u30B9 -AbstractAbstractFileNode.attrAddrColLbl=\u5C5E\u6027\u30A2\u30C9\u30EC\u30B9 -AbstractAbstractFileNode.typeDirColLbl=\u30BF\u30A4\u30D7\uFF08\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\uFF09 -AbstractAbstractFileNode.typeMetaColLbl=\u30BF\u30A4\u30D7\uFF08\u30E1\u30BF\u30C7\u30FC\u30BF\uFF09 -ArtifactTypeNode.createSheet.childCnt.displayName=\u30C1\u30E3\u30A4\u30EB\u30C9\u6570 -TagsNode.createSheet.name.displayName=\u540D\u524D -ViewsNode.name.text=\u30D3\u30E5\u30FC -ViewsNode.createSheet.name.name=\u540D\u524D -ViewsNode.createSheet.name.displayName=\u540D\u524D -ViewsNode.createSheet.name.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093 -VirtualDirectoryNode.getActions.viewInNewWin.text=\u65B0\u898F\u30A6\u30A3\u30F3\u30C9\u30A6\u306B\u8868\u793A -VirtualDirectoryNode.createSheet.name.name=\u540D\u524D -VirtualDirectoryNode.createSheet.name.displayName=\u540D\u524D -VirtualDirectoryNode.createSheet.name.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093 -VirtualDirectoryNode.createSheet.noDesc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093 -VolumeNode.getActions.viewInNewWin.text=\u65B0\u898F\u30A6\u30A3\u30F3\u30C9\u30A6\u306B\u8868\u793A -VolumeNode.createSheet.name.name=\u540D\u524D -VolumeNode.createSheet.name.displayName=\u540D\u524D -VolumeNode.createSheet.name.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093 +\u8a73\u7d30\uff1a {0} +Installer.tskLibErr.err=\u81f4\u547d\u7684\u30a8\u30e9\u30fc\uff1a +InterestingHits.interestingItems.text=\u7591\u308f\u3057\u3044\u30a2\u30a4\u30c6\u30e0 +InterestingHits.displayName.text=\u7591\u308f\u3057\u3044\u30a2\u30a4\u30c6\u30e0 +InterestingHits.createSheet.name.name=\u540d\u524d +InterestingHits.createSheet.name.displayName=\u540d\u524d +InterestingHits.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093 +KeyValueNode.createSheet.name.name=\u540d\u524d +KeyValueNode.createSheet.name.displayName=\u540d\u524d +KeyValueNode.createSheet.name.desc=\u8a72\u5f53\u306a\u3057 +KeyValueNode.createSheet.map.desc=\u8a72\u5f53\u306a\u3057 +KeywordHits.kwHits.text=\u30ad\u30fc\u30ef\u30fc\u30c9\u30d2\u30c3\u30c8 +KeywordHits.createSheet.name.name=\u540d\u524d +KeywordHits.createSheet.name.displayName=\u540d\u524d +KeywordHits.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093 +KeywordHits.createSheet.listName.name=\u30ea\u30b9\u30c8\u540d +KeywordHits.createSheet.listName.displayName=\u30ea\u30b9\u30c8\u540d +KeywordHits.createSheet.listName.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093 +KeywordHits.createSheet.numChildren.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093 +KeywordHits.createSheet.filesWithHits.name=\u30d2\u30c3\u30c8\u3057\u305f\u30d5\u30a1\u30a4\u30eb +KeywordHits.createSheet.filesWithHits.displayName=\u30d2\u30c3\u30c8\u3057\u305f\u30d5\u30a1\u30a4\u30eb +KeywordHits.createSheet.filesWithHits.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093 +KeywordHits.createNodeForKey.modTime.displayName=\u4fee\u6b63\u65e5\u6642 +KeywordHits.createNodeForKey.modTime.desc=\u4fee\u6b63\u65e5\u6642 +KeywordHits.createNodeForKey.accessTime.displayName=\u30a2\u30af\u30bb\u30b9\u65e5\u6642 +KeywordHits.createNodeForKey.accessTime.desc=\u30a2\u30af\u30bb\u30b9\u65e5\u6642 +KeywordHits.createNodeForKey.chgTime.displayName=\u5909\u66f4\u65e5\u6642 +KeywordHits.createNodeForKey.chgTime.desc=\u5909\u66f4\u65e5\u6642 +KeywordHits.createNodeForKey.chgTime.name=\u5909\u66f4\u65e5\u6642 +KeywordHits.createNodeForKey.accessTime.name=\u30a2\u30af\u30bb\u30b9\u65e5\u6642 +KeywordHits.createNodeForKey.modTime.name=\u4fee\u6b63\u65e5\u6642 +KnownFileFilterNode.selectionContext.dataSources=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9 +KnownFileFilterNode.selectionContext.views=\u30d3\u30e5\u30fc +LayoutFileNode.propertyType.parts=\u30d1\u30fc\u30c4 +LayoutFileNode.createSheet.name.name=\u540d\u524d +LayoutFileNode.createSheet.name.displayName=\u540d\u524d +LayoutFileNode.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093 +LayoutFileNode.createSheet.noDescr.text=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093 +LayoutFileNode.getActions.viewInNewWin.text=\u65b0\u898f\u30a6\u30a3\u30f3\u30c9\u30a6\u3067\u8868\u793a +LayoutFileNode.getActions.openInExtViewer.text=\u5916\u90e8\u30d3\u30e5\u30fc\u30a2\u3067\u958b\u304f +LocalFileNode.createSheet.name.name=\u540d\u524d +LocalFileNode.createSheet.name.displayName=\u540d\u524d +LocalFileNode.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093 +LocalFileNode.createSheet.noDescr.text=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093 +LocalFileNode.getActions.viewInNewWin.text=\u65b0\u898f\u30a6\u30a3\u30f3\u30c9\u30a6\u306b\u8868\u793a +LocalFileNode.getActions.openInExtViewer.text=\u5916\u90e8\u30d3\u30e5\u30fc\u30a2\u3067\u958b\u304f +LocalFileNode.getActions.searchFilesSameMd5.text=\u540c\u3058MD5\u30cf\u30c3\u30b7\u30e5\u3092\u6301\u3064\u30d5\u30a1\u30a4\u30eb\u3092\u691c\u7d22 +RecentFiles.aut0DayFilter.displayName.text=\u6700\u7d42\u65e5 +RecentFiles.aut1dayFilter.displayName.text=\u6700\u7d42\u65e5 - 1 +RecentFiles.aut2dayFilter.displayName.text=\u6700\u7d42\u65e5 - \uff12 +RecentFiles.aut3dayFilter.displayName.text=\u6700\u7d42\u65e5 - \uff13 +RecentFiles.aut4dayFilter.displayName.text=\u6700\u7d42\u65e5 - \uff14 +RecentFiles.aut5dayFilter.displayName.text=\u6700\u7d42\u65e5 - \uff15 +RecentFiles.aut6dayFilter.displayName.text=\u6700\u7d42\u65e5 - \uff16 +RecentFilesFilterChildren.exception.defaultVisit.msg=\u3053\u306e\u30bf\u30a4\u30d7\u306e\u8868\u793a\u3067\u304d\u308b\u30a2\u30a4\u30c6\u30e0 +Installer.exception.taskVerStringBang.msg=Sleuth Kit JNI\u30c6\u30b9\u30c8\u30b3\u30fc\u30eb\u3067\u306f\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u305b\u3093\u3067\u3057\u305f\u304c\u3001\u30d0\u30fc\u30b8\u30e7\u30f3\u30b9\u30c8\u30ea\u30f3\u30b0\u306f""\u3067\u3057\u305f\uff01 +RecentFilesFilterNode.createSheet.filterType.name=\u30d5\u30a3\u30eb\u30bf\u30bf\u30a4\u30d7 +RecentFilesFilterNode.createSheet.filterType.displayName=\u30d5\u30a3\u30eb\u30bf\u30bf\u30a4\u30d7 +RecentFilesFilterNode.createSheet.filterType.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093 +RecentFilesNode.createSheet.name.name=\u540d\u524d +RecentFilesNode.createSheet.name.displayName=\u540d\u524d +RecentFilesNode.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093 +RecentFilesNode.name.text=\u6700\u8fd1\u4f7f\u7528\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb +ResultsNode.name.text=\u7d50\u679c +ResultsNode.createSheet.name.name=\u540d\u524d +ResultsNode.createSheet.name.displayName=\u540d\u524d +ResultsNode.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093 +TagNameNode.namePlusTags.text={0}\u30bf\u30b0 +TagNameNode.contentTagTypeNodeKey.text=\u30b3\u30f3\u30c6\u30f3\u30c4\u30bf\u30b0 +TagNameNode.bbArtTagTypeNodeKey.text=\u7d50\u679c\u30bf\u30b0 +TagNameNode.bookmark.text=\u30d6\u30c3\u30af\u30de\u30fc\u30af +TagNameNode.createSheet.name.name=\u540d\u524d +TagNameNode.createSheet.name.displayName=\u540d\u524d +TagsNode.displayName.text=\u30bf\u30b0 +TagsNode.createSheet.name.name=\u540d\u524d +AbstractAbstractFileNode.flagsDirColLbl=\u30d5\u30e9\u30b0\uff08\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\uff09 +AbstractAbstractFileNode.flagsMetaColLbl=\u30d5\u30e9\u30b0\uff08\u30e1\u30bf\u30c7\u30fc\u30bf\uff09 +AbstractAbstractFileNode.metaAddrColLbl=\u30e1\u30bf\u30c7\u30fc\u30bf\u30a2\u30c9\u30ec\u30b9 +AbstractAbstractFileNode.attrAddrColLbl=\u5c5e\u6027\u30a2\u30c9\u30ec\u30b9 +AbstractAbstractFileNode.typeDirColLbl=\u30bf\u30a4\u30d7\uff08\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\uff09 +AbstractAbstractFileNode.typeMetaColLbl=\u30bf\u30a4\u30d7\uff08\u30e1\u30bf\u30c7\u30fc\u30bf\uff09 +ArtifactTypeNode.createSheet.childCnt.displayName=\u30c1\u30e3\u30a4\u30eb\u30c9\u6570 +TagsNode.createSheet.name.displayName=\u540d\u524d +ViewsNode.name.text=\u30d3\u30e5\u30fc +ViewsNode.createSheet.name.name=\u540d\u524d +ViewsNode.createSheet.name.displayName=\u540d\u524d +ViewsNode.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093 +VirtualDirectoryNode.getActions.viewInNewWin.text=\u65b0\u898f\u30a6\u30a3\u30f3\u30c9\u30a6\u306b\u8868\u793a +VirtualDirectoryNode.createSheet.name.name=\u540d\u524d +VirtualDirectoryNode.createSheet.name.displayName=\u540d\u524d +VirtualDirectoryNode.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093 +VirtualDirectoryNode.createSheet.noDesc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093 +VolumeNode.getActions.viewInNewWin.text=\u65b0\u898f\u30a6\u30a3\u30f3\u30c9\u30a6\u306b\u8868\u793a +VolumeNode.createSheet.name.name=\u540d\u524d +VolumeNode.createSheet.name.displayName=\u540d\u524d +VolumeNode.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093 VolumeNode.createSheet.id.name=ID VolumeNode.createSheet.id.displayName=ID -VolumeNode.createSheet.id.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093 -VolumeNode.createSheet.startSector.name=\u6700\u521D\u306E\u30BB\u30AF\u30BF\u30FC -VolumeNode.createSheet.startSector.displayName=\u6700\u521D\u306E\u30BB\u30AF\u30BF\u30FC -VolumeNode.createSheet.startSector.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093 -VolumeNode.createSheet.lenSectors.name=\u30BB\u30AF\u30BF\u30FC\u306E\u9577\u3055 -VolumeNode.createSheet.lenSectors.displayName=\u30BB\u30AF\u30BF\u30FC\u306E\u9577\u3055 -VolumeNode.createSheet.lenSectors.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093 -VolumeNode.createSheet.description.name=\u8AAC\u660E -VolumeNode.createSheet.description.displayName=\u8AAC\u660E -VolumeNode.createSheet.description.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093 -VolumeNode.createSheet.flags.name=\u30D5\u30E9\u30B0 -VolumeNode.createSheet.flags.displayName=\u30D5\u30E9\u30B0 -VolumeNode.createSheet.flags.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093 -ArtifactTypeNode.createSheet.artType.name=\u30A2\u30FC\u30C6\u30A3\u30D5\u30A1\u30AF\u30C8\u30BF\u30A4\u30D7 -ArtifactTypeNode.createSheet.artType.displayName=\u30A2\u30FC\u30C6\u30A3\u30D5\u30A1\u30AF\u30C8\u30BF\u30A4\u30D7 -KeywordHits.createSheet.numChildren.name=\u30C1\u30E3\u30A4\u30EB\u30C9\u6570 -KeywordHits.createSheet.numChildren.displayName=\u30C1\u30E3\u30A4\u30EB\u30C9\u6570 -KeywordHits.simpleLiteralSearch.text=\u30B7\u30F3\u30B0\u30EB\u30EA\u30C6\u30E9\u30EB\u691C\u7D22 -KeywordHits.singleRegexSearch.text=\u30B7\u30F3\u30B0\u30EB\u6B63\u898F\u8868\u73FE\u691C\u7D22 -AbstractAbstractFileNode.objectId=\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8ID \ No newline at end of file +VolumeNode.createSheet.id.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093 +VolumeNode.createSheet.startSector.name=\u6700\u521d\u306e\u30bb\u30af\u30bf\u30fc +VolumeNode.createSheet.startSector.displayName=\u6700\u521d\u306e\u30bb\u30af\u30bf\u30fc +VolumeNode.createSheet.startSector.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093 +VolumeNode.createSheet.lenSectors.name=\u30bb\u30af\u30bf\u30fc\u306e\u9577\u3055 +VolumeNode.createSheet.lenSectors.displayName=\u30bb\u30af\u30bf\u30fc\u306e\u9577\u3055 +VolumeNode.createSheet.lenSectors.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093 +VolumeNode.createSheet.description.name=\u8aac\u660e +VolumeNode.createSheet.description.displayName=\u8aac\u660e +VolumeNode.createSheet.description.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093 +VolumeNode.createSheet.flags.name=\u30d5\u30e9\u30b0 +VolumeNode.createSheet.flags.displayName=\u30d5\u30e9\u30b0 +VolumeNode.createSheet.flags.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093 +ArtifactTypeNode.createSheet.artType.name=\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u30bf\u30a4\u30d7 +ArtifactTypeNode.createSheet.artType.displayName=\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u30bf\u30a4\u30d7 +KeywordHits.createSheet.numChildren.name=\u30c1\u30e3\u30a4\u30eb\u30c9\u6570 +KeywordHits.createSheet.numChildren.displayName=\u30c1\u30e3\u30a4\u30eb\u30c9\u6570 +KeywordHits.simpleLiteralSearch.text=\u30b7\u30f3\u30b0\u30eb\u30ea\u30c6\u30e9\u30eb\u691c\u7d22 +KeywordHits.singleRegexSearch.text=\u30b7\u30f3\u30b0\u30eb\u6b63\u898f\u8868\u73fe\u691c\u7d22 +AbstractAbstractFileNode.objectId=\u30aa\u30d6\u30b8\u30a7\u30af\u30c8ID \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/ContentTagTypeNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/ContentTagTypeNode.java deleted file mode 100755 index 661365827c..0000000000 --- a/Core/src/org/sleuthkit/autopsy/datamodel/ContentTagTypeNode.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Autopsy Forensic Browser - * - * Copyright 2013 Basis Technology Corp. - * Contact: carrier sleuthkit 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.nodes.ChildFactory; -import org.openide.nodes.Children; -import org.openide.nodes.Node; -import org.openide.nodes.Sheet; -import org.openide.util.NbBundle; -import org.openide.util.lookup.Lookups; -import org.sleuthkit.autopsy.casemodule.Case; -import org.sleuthkit.autopsy.coreutils.Logger; -import org.sleuthkit.datamodel.ContentTag; -import org.sleuthkit.datamodel.TagName; -import org.sleuthkit.datamodel.TskCoreException; - -/** - * Instances of this class are are elements of a directory tree sub-tree - * consisting of content and blackboard artifact tags, grouped first by tag - * type, then by tag name. - */ -public class ContentTagTypeNode extends DisplayableItemNode { - - private static final String DISPLAY_NAME = NbBundle.getMessage(ContentTagTypeNode.class, "ContentTagTypeNode.displayName.text"); - private static final String ICON_PATH = "org/sleuthkit/autopsy/images/tag-folder-blue-icon-16.png"; //NON-NLS - - public ContentTagTypeNode(TagName tagName) { - super(Children.create(new ContentTagNodeFactory(tagName), true), Lookups.singleton(tagName.getDisplayName() + " " + DISPLAY_NAME)); - - long tagsCount = 0; - try { - tagsCount = Case.getCurrentCase().getServices().getTagsManager().getContentTagsCountByTagName(tagName); - } catch (TskCoreException ex) { - Logger.getLogger(ContentTagTypeNode.class.getName()).log(Level.SEVERE, "Failed to get content tags count for " + tagName.getDisplayName() + " tag name", ex); //NON-NLS - } - - super.setName(DISPLAY_NAME); - super.setDisplayName(DISPLAY_NAME + " (" + tagsCount + ")"); - this.setIconBaseWithExtension(ICON_PATH); - } - - @Override - protected Sheet createSheet() { - Sheet propertySheet = super.createSheet(); - Sheet.Set properties = propertySheet.get(Sheet.PROPERTIES); - if (properties == null) { - properties = Sheet.createPropertiesSet(); - propertySheet.put(properties); - } - - properties.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "ContentTagTypeNode.createSheet.name.name"), - NbBundle.getMessage(this.getClass(), "ContentTagTypeNode.createSheet.name.displayName"), - "", - getName())); - - return propertySheet; - } - - @Override - public T accept(DisplayableItemNodeVisitor v) { - return v.visit(this); - } - - @Override - public boolean isLeafTypeNode() { - return true; - } - - private static class ContentTagNodeFactory extends ChildFactory { - - private final TagName tagName; - - ContentTagNodeFactory(TagName tagName) { - this.tagName = tagName; - } - - @Override - protected boolean createKeys(List keys) { - // Use the content tags bearing the specified tag name as the keys. - try { - keys.addAll(Case.getCurrentCase().getServices().getTagsManager().getContentTagsByTagName(tagName)); - } catch (TskCoreException ex) { - Logger.getLogger(ContentTagTypeNode.ContentTagNodeFactory.class.getName()).log(Level.SEVERE, "Failed to get tag names", ex); //NON-NLS - } - return true; - } - - @Override - protected Node createNodeForKey(ContentTag key) { - // The content tags to be wrapped are used as the keys. - return new ContentTagNode(key); - } - } -} \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/DisplayableItemNodeVisitor.java b/Core/src/org/sleuthkit/autopsy/datamodel/DisplayableItemNodeVisitor.java index 60b2a50e48..dd93eb24ab 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/DisplayableItemNodeVisitor.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/DisplayableItemNodeVisitor.java @@ -22,7 +22,6 @@ import org.sleuthkit.autopsy.datamodel.DeletedContent.DeletedContentsChildren.De import org.sleuthkit.autopsy.datamodel.DeletedContent.DeletedContentsNode; import org.sleuthkit.autopsy.datamodel.FileSize.FileSizeRootChildren.FileSizeNode; import org.sleuthkit.autopsy.datamodel.FileSize.FileSizeRootNode; -import org.sleuthkit.autopsy.directorytree.BlackboardArtifactTagTypeNode; /** * Visitor pattern implementation for DisplayableItemNodes @@ -75,19 +74,19 @@ public interface DisplayableItemNodeVisitor { T visit(EmailExtracted.FolderNode eefn); - T visit(TagsNode node); + T visit(Tags.RootNode node); T visit(InterestingHits.RootNode ihrn); T visit(InterestingHits.SetNameNode ihsn); - T visit(TagNameNode node); + T visit(Tags.TagNameNode node); - T visit(ContentTagTypeNode node); + T visit(Tags.ContentTagTypeNode node); T visit(ContentTagNode node); - T visit(BlackboardArtifactTagTypeNode node); + T visit(Tags.BlackboardArtifactTagTypeNode node); T visit(BlackboardArtifactTagNode node); @@ -275,17 +274,17 @@ public interface DisplayableItemNodeVisitor { } @Override - public T visit(TagsNode node) { + public T visit(Tags.RootNode node) { return defaultVisit(node); } @Override - public T visit(TagNameNode node) { + public T visit(Tags.TagNameNode node) { return defaultVisit(node); } @Override - public T visit(ContentTagTypeNode node) { + public T visit(Tags.ContentTagTypeNode node) { return defaultVisit(node); } @@ -295,7 +294,7 @@ public interface DisplayableItemNodeVisitor { } @Override - public T visit(BlackboardArtifactTagTypeNode node) { + public T visit(Tags.BlackboardArtifactTagTypeNode node) { return defaultVisit(node); } diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/ResultsNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/ResultsNode.java index 832d7c7b09..bc89511bc6 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/ResultsNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/ResultsNode.java @@ -37,7 +37,7 @@ public class ResultsNode extends DisplayableItemNode { new HashsetHits(sleuthkitCase), new EmailExtracted(sleuthkitCase), new InterestingHits(sleuthkitCase), - new TagsNodeKey())), Lookups.singleton(NAME)); + new Tags())), Lookups.singleton(NAME)); setName(NAME); setDisplayName(NAME); this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/results.png"); //NON-NLS diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/RootContentChildren.java b/Core/src/org/sleuthkit/autopsy/datamodel/RootContentChildren.java index ffc00fe367..cffca4b7f0 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/RootContentChildren.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/RootContentChildren.java @@ -84,7 +84,7 @@ public class RootContentChildren extends AbstractContentChildren { break; case TSK_TAG_FILE: case TSK_TAG_ARTIFACT: - if (o instanceof TagsNodeKey) + if (o instanceof Tags) this.refreshKey(o); break; case TSK_INTERESTING_FILE_HIT: @@ -105,7 +105,7 @@ public class RootContentChildren extends AbstractContentChildren { this.refreshKey(o); else if (o instanceof KeywordHits) this.refreshKey(o); - else if (o instanceof TagsNodeKey) + else if (o instanceof Tags) this.refreshKey(o); else if (o instanceof EmailExtracted) this.refreshKey(o); diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/TagNameNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/TagNameNode.java deleted file mode 100755 index 8949671495..0000000000 --- a/Core/src/org/sleuthkit/autopsy/datamodel/TagNameNode.java +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Autopsy Forensic Browser - * - * Copyright 2013 Basis Technology Corp. - * Contact: carrier sleuthkit 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.nodes.ChildFactory; -import org.openide.nodes.Children; -import org.openide.nodes.Node; -import org.openide.nodes.Sheet; -import org.openide.util.NbBundle; -import org.openide.util.lookup.Lookups; -import org.sleuthkit.autopsy.casemodule.Case; -import org.sleuthkit.autopsy.casemodule.services.TagsManager; -import org.sleuthkit.autopsy.coreutils.Logger; -import org.sleuthkit.autopsy.directorytree.BlackboardArtifactTagTypeNode; -import org.sleuthkit.datamodel.TagName; -import org.sleuthkit.datamodel.TskCoreException; - -/** - * Instances of this class are elements of Node hierarchies consisting of - * content and blackboard artifact tags, grouped first by tag type, then by tag - * name. - */ -public class TagNameNode extends DisplayableItemNode { - - private static final String ICON_PATH = "org/sleuthkit/autopsy/images/tag-folder-blue-icon-16.png"; //NON-NLS - private static final String BOOKMARK_TAG_ICON_PATH = "org/sleuthkit/autopsy/images/star-bookmark-icon-16.png"; //NON-NLS - private final TagName tagName; - private static final String CONTENT_TAG_TYPE_NODE_KEY = NbBundle.getMessage(TagNameNode.class, - "TagNameNode.contentTagTypeNodeKey.text"); - private static final String BLACKBOARD_ARTIFACT_TAG_TYPE_NODE_KEY = NbBundle.getMessage(TagNameNode.class, - "TagNameNode.bbArtTagTypeNodeKey.text"); - - public TagNameNode(TagName tagName) { - super(Children.create(new TagTypeNodeFactory(tagName), true), Lookups.singleton( - NbBundle.getMessage(TagNameNode.class, "TagNameNode.namePlusTags.text", tagName.getDisplayName()))); - this.tagName = tagName; - - setName(tagName.getDisplayName()); - updateDisplayName(); - if (tagName.getDisplayName().equals(NbBundle.getMessage(this.getClass(), "TagNameNode.bookmark.text"))) { - setIconBaseWithExtension(BOOKMARK_TAG_ICON_PATH); - } else { - setIconBaseWithExtension(ICON_PATH); - } - } - - private void updateDisplayName() { - long tagsCount = 0; - try { - TagsManager tm = Case.getCurrentCase().getServices().getTagsManager(); - tagsCount = tm.getContentTagsCountByTagName(tagName); - tagsCount += tm.getBlackboardArtifactTagsCountByTagName(tagName); - } catch (TskCoreException ex) { - Logger.getLogger(TagNameNode.class.getName()).log(Level.SEVERE, "Failed to get tags count for " + tagName.getDisplayName() + " tag name", ex); //NON-NLS - } - setDisplayName(tagName.getDisplayName() + " (" + tagsCount + ")"); - } - - @Override - protected Sheet createSheet() { - Sheet propertySheet = super.createSheet(); - Sheet.Set properties = propertySheet.get(Sheet.PROPERTIES); - if (properties == null) { - properties = Sheet.createPropertiesSet(); - propertySheet.put(properties); - } - - properties.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "TagNameNode.createSheet.name.name"), - NbBundle.getMessage(this.getClass(), "TagNameNode.createSheet.name.displayName"), - tagName.getDescription(), - getName())); - - return propertySheet; - } - - @Override - public T accept(DisplayableItemNodeVisitor v) { - // See classes derived from DisplayableItemNodeVisitor - // for behavior added using the Visitor pattern. - return v.visit(this); - } - - @Override - public boolean isLeafTypeNode() { - return false; - } - - private static class TagTypeNodeFactory extends ChildFactory { - - private final TagName tagName; - - TagTypeNodeFactory(TagName tagName) { - this.tagName = tagName; - } - - @Override - protected boolean createKeys(List keys) { - keys.add(CONTENT_TAG_TYPE_NODE_KEY); - keys.add(BLACKBOARD_ARTIFACT_TAG_TYPE_NODE_KEY); - return true; - } - - @Override - protected Node createNodeForKey(String key) { -// switch (key) { -// case CONTENT_TAG_TYPE_NODE_KEY: -// return new ContentTagTypeNode(tagName); -// case BLACKBOARD_ARTIFACT_TAG_TYPE_NODE_KEY: -// return new BlackboardArtifactTagTypeNode(tagName); -// default: -// Logger.getLogger(TagNameNode.class.getName()).log(Level.SEVERE, "{0} not a recognized key", key); -// return null; -// } - // converted switch to if/else due to non-constant strings in case key - if (CONTENT_TAG_TYPE_NODE_KEY.equals(key)) { - return new ContentTagTypeNode(tagName); - } else if (BLACKBOARD_ARTIFACT_TAG_TYPE_NODE_KEY.equals(key)) { - return new BlackboardArtifactTagTypeNode(tagName); - } else { - Logger.getLogger(TagNameNode.class.getName()).log(Level.SEVERE, "{0} not a recognized key", key); //NON-NLS - return null; - } - } - } -} diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/Tags.java b/Core/src/org/sleuthkit/autopsy/datamodel/Tags.java new file mode 100755 index 0000000000..801a66e49a --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/datamodel/Tags.java @@ -0,0 +1,435 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2013 Basis Technology Corp. + * Contact: carrier sleuthkit 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.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.List; +import java.util.Observable; +import java.util.Observer; +import java.util.logging.Level; +import org.openide.nodes.ChildFactory; +import org.openide.nodes.Children; +import org.openide.nodes.Node; +import org.openide.nodes.Sheet; +import org.openide.util.NbBundle; +import org.openide.util.lookup.Lookups; +import org.sleuthkit.autopsy.casemodule.Case; +import org.sleuthkit.autopsy.casemodule.services.TagsManager; +import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.autopsy.ingest.IngestManager; +import org.sleuthkit.autopsy.ingest.ModuleDataEvent; +import org.sleuthkit.datamodel.BlackboardArtifact; +import org.sleuthkit.datamodel.BlackboardArtifactTag; +import org.sleuthkit.datamodel.ContentTag; +import org.sleuthkit.datamodel.TagName; +import org.sleuthkit.datamodel.TskCoreException; + +/** + * Instances of this class act as keys for use by instances of the + * RootContentChildren class. RootContentChildren is a NetBeans child node + * factory built on top of the NetBeans Children.Keys class. + */ +public class Tags implements AutopsyVisitableItem { + // Creation of a RootNode object corresponding to a Tags object is done + // by a CreateAutopsyNodeVisitor dispatched from the AbstractContentChildren + // override of Children.Keys.createNodes(). + + private TagResults tagResults = new TagResults(); + private final String DISPLAY_NAME = NbBundle.getMessage(RootNode.class, "TagsNode.displayName.text"); + private final String ICON_PATH = "org/sleuthkit/autopsy/images/tag-folder-blue-icon-16.png"; //NON-NLS + + + @Override + public T accept(AutopsyItemVisitor v) { + return v.visit(this); + } + + + + + /** + * This class largely does nothing except act as a top-level object that + * the other nodes can listen to. This mimics what other nodes have (keword search, etc.), + * but theirs stores data. + */ + private class TagResults extends Observable { + public void update() { + setChanged(); + notifyObservers(); + } + } + + /** + * Instances of this class are the root nodes of tree that is a sub-tree of + * the Autopsy presentation of the SleuthKit data model. The sub-tree + * consists of content and blackboard artifact tags, grouped first by tag + * type, then by tag name. + */ + public class RootNode extends DisplayableItemNode { + + public RootNode() { + super(Children.create(new TagNameNodeFactory(), true), Lookups.singleton(DISPLAY_NAME)); + super.setName(DISPLAY_NAME); + super.setDisplayName(DISPLAY_NAME); + this.setIconBaseWithExtension(ICON_PATH); + } + + @Override + public boolean isLeafTypeNode() { + return false; + } + + @Override + public T accept(DisplayableItemNodeVisitor v) { + return v.visit(this); + } + + @Override + protected Sheet createSheet() { + Sheet propertySheet = super.createSheet(); + Sheet.Set properties = propertySheet.get(Sheet.PROPERTIES); + if (properties == null) { + properties = Sheet.createPropertiesSet(); + propertySheet.put(properties); + } + properties.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "TagsNode.createSheet.name.name"), NbBundle.getMessage(this.getClass(), "TagsNode.createSheet.name.displayName"), "", getName())); + return propertySheet; + } + } + + private class TagNameNodeFactory extends ChildFactory.Detachable { + + private final PropertyChangeListener pcl = new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + String eventType = evt.getPropertyName(); + if (eventType.equals(IngestManager.IngestEvent.DATA.toString())) { + if ((((ModuleDataEvent) evt.getOldValue()).getArtifactType() == BlackboardArtifact.ARTIFACT_TYPE.TSK_TAG_ARTIFACT) || ((ModuleDataEvent) evt.getOldValue()).getArtifactType() == BlackboardArtifact.ARTIFACT_TYPE.TSK_TAG_FILE) { + refresh(true); + tagResults.update(); + } + } else if (eventType.equals(IngestManager.IngestEvent.INGEST_JOB_COMPLETED.toString()) || eventType.equals(IngestManager.IngestEvent.INGEST_JOB_CANCELLED.toString())) { + refresh(true); + tagResults.update(); + } + } + }; + + @Override + protected void addNotify() { + IngestManager.addPropertyChangeListener(pcl); + } + + @Override + protected void removeNotify() { + IngestManager.removePropertyChangeListener(pcl); + } + + @Override + protected boolean createKeys(List keys) { + try { + keys.addAll(Case.getCurrentCase().getServices().getTagsManager().getTagNamesInUse()); + } catch (TskCoreException ex) { + Logger.getLogger(TagNameNodeFactory.class.getName()).log(Level.SEVERE, "Failed to get tag names", ex); //NON-NLS + } + return true; + } + + @Override + protected Node createNodeForKey(TagName key) { + return new TagNameNode(key); + } + } + + /** + * Instances of this class are elements of Node hierarchies consisting of + * content and blackboard artifact tags, grouped first by tag type, then by tag + * name. + */ + public class TagNameNode extends DisplayableItemNode implements Observer { + + private final String ICON_PATH = "org/sleuthkit/autopsy/images/tag-folder-blue-icon-16.png"; //NON-NLS + private final String BOOKMARK_TAG_ICON_PATH = "org/sleuthkit/autopsy/images/star-bookmark-icon-16.png"; //NON-NLS + private final TagName tagName; + + public TagNameNode(TagName tagName) { + super(Children.create(new TagTypeNodeFactory(tagName), true), Lookups.singleton(NbBundle.getMessage(TagNameNode.class, "TagNameNode.namePlusTags.text", tagName.getDisplayName()))); + this.tagName = tagName; + setName(tagName.getDisplayName()); + updateDisplayName(); + if (tagName.getDisplayName().equals(NbBundle.getMessage(this.getClass(), "TagNameNode.bookmark.text"))) { + setIconBaseWithExtension(BOOKMARK_TAG_ICON_PATH); + } else { + setIconBaseWithExtension(ICON_PATH); + } + tagResults.addObserver(this); + } + + private void updateDisplayName() { + long tagsCount = 0; + try { + TagsManager tm = Case.getCurrentCase().getServices().getTagsManager(); + tagsCount = tm.getContentTagsCountByTagName(tagName); + tagsCount += tm.getBlackboardArtifactTagsCountByTagName(tagName); + } catch (TskCoreException ex) { + Logger.getLogger(TagNameNode.class.getName()).log(Level.SEVERE, "Failed to get tags count for " + tagName.getDisplayName() + " tag name", ex); //NON-NLS + } + setDisplayName(tagName.getDisplayName() + " (" + tagsCount + ")"); + } + + @Override + protected Sheet createSheet() { + Sheet propertySheet = super.createSheet(); + Sheet.Set properties = propertySheet.get(Sheet.PROPERTIES); + if (properties == null) { + properties = Sheet.createPropertiesSet(); + propertySheet.put(properties); + } + properties.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "TagNameNode.createSheet.name.name"), NbBundle.getMessage(this.getClass(), "TagNameNode.createSheet.name.displayName"), tagName.getDescription(), getName())); + return propertySheet; + } + + @Override + public T accept(DisplayableItemNodeVisitor v) { + // See classes derived from DisplayableItemNodeVisitor + // for behavior added using the Visitor pattern. + return v.visit(this); + } + + @Override + public boolean isLeafTypeNode() { + return false; + } + + @Override + public void update(Observable o, Object arg) { + updateDisplayName(); + } + } + + /** + * Creates nodes for the two types of tags: file and artifact. + * Does not need observer / messages since it always has the same children + */ + private class TagTypeNodeFactory extends ChildFactory { + private final TagName tagName; + private final String CONTENT_TAG_TYPE_NODE_KEY = NbBundle.getMessage(TagNameNode.class, "TagNameNode.contentTagTypeNodeKey.text"); + private final String BLACKBOARD_ARTIFACT_TAG_TYPE_NODE_KEY = NbBundle.getMessage(TagNameNode.class, "TagNameNode.bbArtTagTypeNodeKey.text"); + + TagTypeNodeFactory(TagName tagName) { + super(); + this.tagName = tagName; + } + + @Override + protected boolean createKeys(List keys) { + keys.add(CONTENT_TAG_TYPE_NODE_KEY); + keys.add(BLACKBOARD_ARTIFACT_TAG_TYPE_NODE_KEY); + return true; + } + + @Override + protected Node createNodeForKey(String key) { + if (CONTENT_TAG_TYPE_NODE_KEY.equals(key)) { + return new ContentTagTypeNode(tagName); + } else if (BLACKBOARD_ARTIFACT_TAG_TYPE_NODE_KEY.equals(key)) { + return new BlackboardArtifactTagTypeNode(tagName); + } else { + Logger.getLogger(TagNameNode.class.getName()).log(Level.SEVERE, "{0} not a recognized key", key); //NON-NLS + return null; + } + } + } + + private final String CONTENT_DISPLAY_NAME = NbBundle.getMessage(ContentTagTypeNode.class, "ContentTagTypeNode.displayName.text"); + + /** + * Node for the content tags. Children are specific tags. + * Instances of this class are are elements of a directory tree sub-tree + * consisting of content and blackboard artifact tags, grouped first by tag + * type, then by tag name. + */ + public class ContentTagTypeNode extends DisplayableItemNode implements Observer { + + private final String ICON_PATH = "org/sleuthkit/autopsy/images/tag-folder-blue-icon-16.png"; //NON-NLS + private TagName tagName; + public ContentTagTypeNode(TagName tagName) { + super(Children.create(new ContentTagNodeFactory(tagName), true), Lookups.singleton(tagName.getDisplayName() + " " + CONTENT_DISPLAY_NAME)); + this.tagName = tagName; + super.setName(CONTENT_DISPLAY_NAME); + updateDisplayName(); + this.setIconBaseWithExtension(ICON_PATH); + tagResults.addObserver(this); + } + + private void updateDisplayName() { + long tagsCount = 0; + try { + tagsCount = Case.getCurrentCase().getServices().getTagsManager().getContentTagsCountByTagName(tagName); + } catch (TskCoreException ex) { + Logger.getLogger(ContentTagTypeNode.class.getName()).log(Level.SEVERE, "Failed to get content tags count for " + tagName.getDisplayName() + " tag name", ex); //NON-NLS + } + super.setDisplayName(CONTENT_DISPLAY_NAME + " (" + tagsCount + ")"); + } + + @Override + protected Sheet createSheet() { + Sheet propertySheet = super.createSheet(); + Sheet.Set properties = propertySheet.get(Sheet.PROPERTIES); + if (properties == null) { + properties = Sheet.createPropertiesSet(); + propertySheet.put(properties); + } + properties.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "ContentTagTypeNode.createSheet.name.name"), NbBundle.getMessage(this.getClass(), "ContentTagTypeNode.createSheet.name.displayName"), "", getName())); + return propertySheet; + } + + @Override + public T accept(DisplayableItemNodeVisitor v) { + return v.visit(this); + } + + @Override + public boolean isLeafTypeNode() { + return true; + } + + @Override + public void update(Observable o, Object arg) { + updateDisplayName(); + } + } + + private class ContentTagNodeFactory extends ChildFactory implements Observer { + private final TagName tagName; + + ContentTagNodeFactory(TagName tagName) { + super(); + this.tagName = tagName; + tagResults.addObserver(this); + } + + @Override + protected boolean createKeys(List keys) { + // Use the content tags bearing the specified tag name as the keys. + try { + keys.addAll(Case.getCurrentCase().getServices().getTagsManager().getContentTagsByTagName(tagName)); + } catch (TskCoreException ex) { + Logger.getLogger(ContentTagNodeFactory.class.getName()).log(Level.SEVERE, "Failed to get tag names", ex); //NON-NLS + } + return true; + } + + @Override + protected Node createNodeForKey(ContentTag key) { + // The content tags to be wrapped are used as the keys. + return new ContentTagNode(key); + } + + @Override + public void update(Observable o, Object arg) { + refresh(true); + } + } + + private final String ARTIFACT_DISPLAY_NAME = NbBundle.getMessage(BlackboardArtifactTagTypeNode.class, "BlackboardArtifactTagTypeNode.displayName.text"); + + /** + * Instances of this class are elements in a sub-tree of the Autopsy + * presentation of the SleuthKit data model. The sub-tree consists of content + * and blackboard artifact tags, grouped first by tag type, then by tag name. + */ + public class BlackboardArtifactTagTypeNode extends DisplayableItemNode implements Observer { + private TagName tagName; + private final String ICON_PATH = "org/sleuthkit/autopsy/images/tag-folder-blue-icon-16.png"; //NON-NLS + + public BlackboardArtifactTagTypeNode(TagName tagName) { + super(Children.create(new BlackboardArtifactTagNodeFactory(tagName), true), Lookups.singleton(tagName.getDisplayName() + " " + ARTIFACT_DISPLAY_NAME)); + this.tagName = tagName; + super.setName(ARTIFACT_DISPLAY_NAME); + this.setIconBaseWithExtension(ICON_PATH); + updateDisplayName(); + tagResults.addObserver(this); + } + + private void updateDisplayName() { + long tagsCount = 0; + try { + tagsCount = Case.getCurrentCase().getServices().getTagsManager().getBlackboardArtifactTagsCountByTagName(tagName); + } catch (TskCoreException ex) { + Logger.getLogger(BlackboardArtifactTagTypeNode.class.getName()).log(Level.SEVERE, "Failed to get blackboard artifact tags count for " + tagName.getDisplayName() + " tag name", ex); //NON-NLS + } + super.setDisplayName(ARTIFACT_DISPLAY_NAME + " (" + tagsCount + ")"); + } + + @Override + protected Sheet createSheet() { + Sheet propertySheet = super.createSheet(); + Sheet.Set properties = propertySheet.get(Sheet.PROPERTIES); + if (properties == null) { + properties = Sheet.createPropertiesSet(); + propertySheet.put(properties); + } + properties.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "BlackboardArtifactTagTypeNode.createSheet.name.name"), NbBundle.getMessage(this.getClass(), "BlackboardArtifactTagTypeNode.createSheet.name.displayName"), "", getName())); + return propertySheet; + } + + @Override + public T accept(DisplayableItemNodeVisitor v) { + return v.visit(this); + } + + @Override + public boolean isLeafTypeNode() { + return true; + } + + @Override + public void update(Observable o, Object arg) { + updateDisplayName(); + } + } + + private class BlackboardArtifactTagNodeFactory extends ChildFactory { + private final TagName tagName; + + BlackboardArtifactTagNodeFactory(TagName tagName) { + super(); + this.tagName = tagName; + } + + @Override + protected boolean createKeys(List keys) { + try { + // Use the blackboard artifact tags bearing the specified tag name as the keys. + keys.addAll(Case.getCurrentCase().getServices().getTagsManager().getBlackboardArtifactTagsByTagName(tagName)); + } catch (TskCoreException ex) { + Logger.getLogger(BlackboardArtifactTagNodeFactory.class.getName()).log(Level.SEVERE, "Failed to get tag names", ex); //NON-NLS + } + return true; + } + + @Override + protected Node createNodeForKey(BlackboardArtifactTag key) { + // The blackboard artifact tags to be wrapped are used as the keys. + return new BlackboardArtifactTagNode(key); + } + } +} diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/TagsNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/TagsNode.java deleted file mode 100755 index d6ceff425c..0000000000 --- a/Core/src/org/sleuthkit/autopsy/datamodel/TagsNode.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Autopsy Forensic Browser - * - * Copyright 2013 Basis Technology Corp. - * Contact: carrier sleuthkit 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.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import java.util.List; -import java.util.logging.Level; -import org.openide.nodes.ChildFactory; -import org.openide.nodes.Children; -import org.openide.nodes.Node; -import org.openide.nodes.Sheet; -import org.openide.util.NbBundle; -import org.openide.util.lookup.Lookups; -import org.sleuthkit.autopsy.casemodule.Case; -import org.sleuthkit.autopsy.coreutils.Logger; -import org.sleuthkit.autopsy.ingest.IngestManager; -import org.sleuthkit.autopsy.ingest.ModuleDataEvent; -import org.sleuthkit.datamodel.BlackboardArtifact; -import org.sleuthkit.datamodel.TagName; -import org.sleuthkit.datamodel.TskCoreException; - -/** - * Instances of this class are the root nodes of tree that is a sub-tree of the - * Autopsy presentation of the SleuthKit data model. The sub-tree consists of - * content and blackboard artifact tags, grouped first by tag type, then by tag - * name. - */ -class TagsNode extends DisplayableItemNode { - - private static final String DISPLAY_NAME = NbBundle.getMessage(TagsNode.class, "TagsNode.displayName.text"); - private static final String ICON_PATH = "org/sleuthkit/autopsy/images/tag-folder-blue-icon-16.png"; //NON-NLS - - public TagsNode() { - super(Children.create(new TagNameNodeFactory(), true), Lookups.singleton(DISPLAY_NAME)); - super.setName(DISPLAY_NAME); - super.setDisplayName(DISPLAY_NAME); - this.setIconBaseWithExtension(ICON_PATH); - } - - @Override - public boolean isLeafTypeNode() { - return false; - } - - @Override - public T accept(DisplayableItemNodeVisitor v) { - return v.visit(this); - } - - @Override - protected Sheet createSheet() { - Sheet propertySheet = super.createSheet(); - Sheet.Set properties = propertySheet.get(Sheet.PROPERTIES); - if (properties == null) { - properties = Sheet.createPropertiesSet(); - propertySheet.put(properties); - } - - properties.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "TagsNode.createSheet.name.name"), - NbBundle.getMessage(this.getClass(), "TagsNode.createSheet.name.displayName"), - "", - getName())); - - return propertySheet; - } - - private static class TagNameNodeFactory extends ChildFactory.Detachable { - - private final PropertyChangeListener pcl = new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - String eventType = evt.getPropertyName(); - - if (eventType.equals(IngestManager.IngestEvent.DATA.toString())) { - if ((((ModuleDataEvent) evt.getOldValue()).getArtifactType() == BlackboardArtifact.ARTIFACT_TYPE.TSK_TAG_ARTIFACT) || - ((ModuleDataEvent) evt.getOldValue()).getArtifactType() == BlackboardArtifact.ARTIFACT_TYPE.TSK_TAG_FILE) { - refresh(true); - } - } - else if (eventType.equals(IngestManager.IngestEvent.INGEST_JOB_COMPLETED.toString()) - || eventType.equals(IngestManager.IngestEvent.INGEST_JOB_CANCELLED.toString())) { - refresh(true); - } - } - }; - - @Override - protected void addNotify() { - IngestManager.addPropertyChangeListener(pcl); - } - - @Override - protected void removeNotify() { - IngestManager.removePropertyChangeListener(pcl); - } - - @Override - protected boolean createKeys(List keys) { - try { - keys.addAll(Case.getCurrentCase().getServices().getTagsManager().getTagNamesInUse()); - } catch (TskCoreException ex) { - Logger.getLogger(TagNameNodeFactory.class.getName()).log(Level.SEVERE, "Failed to get tag names", ex); //NON-NLS - } - return true; - } - - @Override - protected Node createNodeForKey(TagName key) { - return new TagNameNode(key); - } - } -} diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/TagsNodeKey.java b/Core/src/org/sleuthkit/autopsy/datamodel/TagsNodeKey.java deleted file mode 100755 index dad36cfa34..0000000000 --- a/Core/src/org/sleuthkit/autopsy/datamodel/TagsNodeKey.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Autopsy Forensic Browser - * - * Copyright 2013 Basis Technology Corp. - * Contact: carrier sleuthkit 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; - -/** - * Instances of this class act as keys for use by instances of the - * RootContentChildren class. RootContentChildren is a NetBeans child node - * factory built on top of the NetBeans Children.Keys class. - */ - class TagsNodeKey implements AutopsyVisitableItem { - // Creation of a TagsNode object corresponding to a TagsNodeKey object is done - // by a CreateAutopsyNodeVisitor dispatched from the AbstractContentChildren - // override of Children.Keys.createNodes(). - @Override - public T accept(AutopsyItemVisitor v) { - return v.visit(this); - } -} diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/BlackboardArtifactTagTypeNode.java b/Core/src/org/sleuthkit/autopsy/directorytree/BlackboardArtifactTagTypeNode.java deleted file mode 100755 index efc7cadca9..0000000000 --- a/Core/src/org/sleuthkit/autopsy/directorytree/BlackboardArtifactTagTypeNode.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Autopsy Forensic Browser - * - * Copyright 2013 Basis Technology Corp. - * Contact: carrier sleuthkit 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.directorytree; - -import java.util.List; -import java.util.logging.Level; -import org.openide.nodes.ChildFactory; -import org.openide.nodes.Children; -import org.openide.nodes.Node; -import org.openide.nodes.Sheet; -import org.openide.util.NbBundle; -import org.openide.util.lookup.Lookups; -import org.sleuthkit.autopsy.casemodule.Case; -import org.sleuthkit.autopsy.coreutils.Logger; -import org.sleuthkit.autopsy.datamodel.BlackboardArtifactTagNode; -import org.sleuthkit.autopsy.datamodel.ContentTagTypeNode; -import org.sleuthkit.autopsy.datamodel.DisplayableItemNode; -import org.sleuthkit.autopsy.datamodel.DisplayableItemNodeVisitor; -import org.sleuthkit.autopsy.datamodel.NodeProperty; -import org.sleuthkit.datamodel.BlackboardArtifactTag; -import org.sleuthkit.datamodel.TagName; -import org.sleuthkit.datamodel.TskCoreException; - -/** - * Instances of this class are elements in a sub-tree of the Autopsy - * presentation of the SleuthKit data model. The sub-tree consists of content - * and blackboard artifact tags, grouped first by tag type, then by tag name. - */ -public class BlackboardArtifactTagTypeNode extends DisplayableItemNode { - private static final String DISPLAY_NAME = NbBundle.getMessage(BlackboardArtifactTagTypeNode.class, - "BlackboardArtifactTagTypeNode.displayName.text"); - private static final String ICON_PATH = "org/sleuthkit/autopsy/images/tag-folder-blue-icon-16.png"; //NON-NLS - - public BlackboardArtifactTagTypeNode(TagName tagName) { - super(Children.create(new BlackboardArtifactTagNodeFactory(tagName), true), Lookups.singleton(tagName.getDisplayName() + " " + DISPLAY_NAME)); - - long tagsCount = 0; - try { - tagsCount = Case.getCurrentCase().getServices().getTagsManager().getBlackboardArtifactTagsCountByTagName(tagName); - } - catch (TskCoreException ex) { - Logger.getLogger(BlackboardArtifactTagTypeNode.class.getName()).log(Level.SEVERE, "Failed to get blackboard artifact tags count for " + tagName.getDisplayName() + " tag name", ex); //NON-NLS - } - - super.setName(DISPLAY_NAME); - super.setDisplayName(DISPLAY_NAME + " (" + tagsCount + ")"); - this.setIconBaseWithExtension(ICON_PATH); - } - - @Override - protected Sheet createSheet() { - Sheet propertySheet = super.createSheet(); - Sheet.Set properties = propertySheet.get(Sheet.PROPERTIES); - if (properties == null) { - properties = Sheet.createPropertiesSet(); - propertySheet.put(properties); - } - - properties.put(new NodeProperty<>( - NbBundle.getMessage(this.getClass(), "BlackboardArtifactTagTypeNode.createSheet.name.name"), - NbBundle.getMessage(this.getClass(), "BlackboardArtifactTagTypeNode.createSheet.name.displayName"), - "", - getName())); - - return propertySheet; - } - - @Override - public T accept(DisplayableItemNodeVisitor v) { - return v.visit(this); - } - - @Override - public boolean isLeafTypeNode() { - return true; - } - - private static class BlackboardArtifactTagNodeFactory extends ChildFactory { - private final TagName tagName; - - BlackboardArtifactTagNodeFactory(TagName tagName) { - this.tagName = tagName; - } - - @Override - protected boolean createKeys(List keys) { - try { - // Use the blackboard artifact tags bearing the specified tag name as the keys. - keys.addAll(Case.getCurrentCase().getServices().getTagsManager().getBlackboardArtifactTagsByTagName(tagName)); - } - catch (TskCoreException ex) { - Logger.getLogger(BlackboardArtifactTagTypeNode.BlackboardArtifactTagNodeFactory.class.getName()).log(Level.SEVERE, "Failed to get tag names", ex); //NON-NLS - } - return true; - } - - @Override - protected Node createNodeForKey(BlackboardArtifactTag key) { - // The blackboard artifact tags to be wrapped are used as the keys. - return new BlackboardArtifactTagNode(key); - } - } -} \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/Bundle.properties b/Core/src/org/sleuthkit/autopsy/directorytree/Bundle.properties index 015449821b..941cdbc7dd 100644 --- a/Core/src/org/sleuthkit/autopsy/directorytree/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/directorytree/Bundle.properties @@ -50,9 +50,6 @@ ImageDetailsPanel.imgTotalSizeValue.text=... ImageDetailsPanel.imgTotalSizeLabel.text=Total Size: ImageDetailsPanel.imgHashValue.text=... ImageDetailsPanel.imgHashLabel.text=Hash Value: -BlackboardArtifactTagTypeNode.displayName.text=Result Tags -BlackboardArtifactTagTypeNode.createSheet.name.name=Name -BlackboardArtifactTagTypeNode.createSheet.name.displayName=Name ChangeViewAction.menuItem.view=View ChangeViewAction.menuItem.view.hex=Hex ChangeViewAction.menuItem.view.string=String diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/directorytree/Bundle_ja.properties index 009c7356ff..620bb06ae3 100644 --- a/Core/src/org/sleuthkit/autopsy/directorytree/Bundle_ja.properties +++ b/Core/src/org/sleuthkit/autopsy/directorytree/Bundle_ja.properties @@ -1,11 +1,11 @@ -CTL_DirectoryTreeTopComponent=\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u30C4\u30EA\u30FC -HINT_DirectoryTreeTopComponent=\u3053\u308C\u306F\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u30C4\u30EA\u30FC\u306E\u30A6\u30A3\u30F3\u30C9\u30A6\u3067\u3059 -OpenIDE-Module-Name=\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u30C4\u30EA\u30FC -FileSystemDetailsPanel.imgOffsetLabel.text=\u30A4\u30E1\u30FC\u30B8\u30AA\u30D5\u30BB\u30C3\u30C8\uFF1A -FileSystemDetailsPanel.fsTypeLabel.text=\u30D5\u30A1\u30A4\u30EB\u30B7\u30B9\u30C6\u30E0\u30BF\u30A4\u30D7\uFF1A -FileSystemDetailsPanel.genInfoLabel.text=\u30D5\u30A1\u30A4\u30EB\u4E00\u822C\u60C5\u5831 -FileSystemDetailsPanel.jLabel2.text=\u30D0\u30A4\u30C8 -FileSystemDetailsPanel.jLabel3.text=\u30D0\u30A4\u30C8 +CTL_DirectoryTreeTopComponent=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30c4\u30ea\u30fc +HINT_DirectoryTreeTopComponent=\u3053\u308c\u306f\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30c4\u30ea\u30fc\u306e\u30a6\u30a3\u30f3\u30c9\u30a6\u3067\u3059 +OpenIDE-Module-Name=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30c4\u30ea\u30fc +FileSystemDetailsPanel.imgOffsetLabel.text=\u30a4\u30e1\u30fc\u30b8\u30aa\u30d5\u30bb\u30c3\u30c8\uff1a +FileSystemDetailsPanel.fsTypeLabel.text=\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u30bf\u30a4\u30d7\uff1a +FileSystemDetailsPanel.genInfoLabel.text=\u30d5\u30a1\u30a4\u30eb\u4e00\u822c\u60c5\u5831 +FileSystemDetailsPanel.jLabel2.text=\u30d0\u30a4\u30c8 +FileSystemDetailsPanel.jLabel3.text=\u30d0\u30a4\u30c8 FileSystemDetailsPanel.fsTypeValue.text=... FileSystemDetailsPanel.imgOffsetValue.text=... FileSystemDetailsPanel.volumeIDValue.text=... @@ -14,86 +14,83 @@ FileSystemDetailsPanel.blockCountValue.text=... FileSystemDetailsPanel.rootInumValue.text=... FileSystemDetailsPanel.firstInumValue.text=... FileSystemDetailsPanel.lastInumValue.text=... -FileSystemDetailsPanel.jLabel1.text=\u30D5\u30A1\u30A4\u30EB\u8A73\u7D30\u60C5\u5831 -FileSystemDetailsPanel.volumeIDLabel.text=\u30DC\u30EA\u30E5\u30FC\u30E0ID\uFF1A -FileSystemDetailsPanel.blockSizeLabel.text=\u30D6\u30ED\u30C3\u30AF\u30B5\u30A4\u30BA\uFF1A -FileSystemDetailsPanel.blockCountLabel.text=\u30D6\u30ED\u30C3\u30AF\u6570\uFF1A -FileSystemDetailsPanel.rootInumLabel.text=\u30EB\u30FC\u30C8\u30E1\u30BF\u30C7\u30FC\u30BF\u30A8\u30F3\u30C8\u30EA\u30FC\uFF1A -FileSystemDetailsPanel.firstInumLabel.text=\u6700\u521D\u306E\u30E1\u30BF\u30C7\u30FC\u30BF\u30A8\u30F3\u30C8\u30EA\u30FC\uFF1A -FileSystemDetailsPanel.lastInumLabel.text=\u6700\u5F8C\u306E\u30E1\u30BF\u30C7\u30FC\u30BF\u30A8\u30F3\u30C8\u30EA\u30FC\uFF1A +FileSystemDetailsPanel.jLabel1.text=\u30d5\u30a1\u30a4\u30eb\u8a73\u7d30\u60c5\u5831 +FileSystemDetailsPanel.volumeIDLabel.text=\u30dc\u30ea\u30e5\u30fc\u30e0ID\uff1a +FileSystemDetailsPanel.blockSizeLabel.text=\u30d6\u30ed\u30c3\u30af\u30b5\u30a4\u30ba\uff1a +FileSystemDetailsPanel.blockCountLabel.text=\u30d6\u30ed\u30c3\u30af\u6570\uff1a +FileSystemDetailsPanel.rootInumLabel.text=\u30eb\u30fc\u30c8\u30e1\u30bf\u30c7\u30fc\u30bf\u30a8\u30f3\u30c8\u30ea\u30fc\uff1a +FileSystemDetailsPanel.firstInumLabel.text=\u6700\u521d\u306e\u30e1\u30bf\u30c7\u30fc\u30bf\u30a8\u30f3\u30c8\u30ea\u30fc\uff1a +FileSystemDetailsPanel.lastInumLabel.text=\u6700\u5f8c\u306e\u30e1\u30bf\u30c7\u30fc\u30bf\u30a8\u30f3\u30c8\u30ea\u30fc\uff1a FileSystemDetailsPanel.OKButton.text=OK -VolumeDetailsPanel.volumeIDLabel.text=\u30DC\u30EA\u30E5\u30FC\u30E0ID\uFF1A +VolumeDetailsPanel.volumeIDLabel.text=\u30dc\u30ea\u30e5\u30fc\u30e0ID\uff1a VolumeDetailsPanel.volumeIDValue.text=... VolumeDetailsPanel.startValue.text=... VolumeDetailsPanel.lengthValue.text=... VolumeDetailsPanel.descValue.text=... VolumeDetailsPanel.flagsValue.text=... -VolumeDetailsPanel.startLabel.text=\u6700\u521D\u306E\u30BB\u30AF\u30BF\u30FC\uFF1A -VolumeDetailsPanel.lengthLabel.text=\u30BB\u30AF\u30BF\u30FC\u306E\u9577\u3055\uFF1A -VolumeDetailsPanel.descLabel.text=\u8AAC\u660E\uFF1A -VolumeDetailsPanel.flagsLabel.text=\u30D5\u30E9\u30B0\uFF1A -VolumeDetailsPanel.jLabel1.text=\u30DC\u30EA\u30E5\u30FC\u30E0\u4E00\u822C\u60C5\u5831 +VolumeDetailsPanel.startLabel.text=\u6700\u521d\u306e\u30bb\u30af\u30bf\u30fc\uff1a +VolumeDetailsPanel.lengthLabel.text=\u30bb\u30af\u30bf\u30fc\u306e\u9577\u3055\uff1a +VolumeDetailsPanel.descLabel.text=\u8aac\u660e\uff1a +VolumeDetailsPanel.flagsLabel.text=\u30d5\u30e9\u30b0\uff1a +VolumeDetailsPanel.jLabel1.text=\u30dc\u30ea\u30e5\u30fc\u30e0\u4e00\u822c\u60c5\u5831 VolumeDetailsPanel.OKButton.text=OK -ImageDetailsPanel.imageInfoLabel.text=\u30A4\u30E1\u30FC\u30B8\u60C5\u5831 -ImageDetailsPanel.imgNameLabel.text=\u540D\u524D\uFF1A +ImageDetailsPanel.imageInfoLabel.text=\u30a4\u30e1\u30fc\u30b8\u60c5\u5831 +ImageDetailsPanel.imgNameLabel.text=\u540d\u524d\uff1a ImageDetailsPanel.imgNameValue.text=... -ImageDetailsPanel.imgTypeLabel.text=\u30BF\u30A4\u30D7\uFF1A +ImageDetailsPanel.imgTypeLabel.text=\u30bf\u30a4\u30d7\uff1a ImageDetailsPanel.imgTypeValue.text=... ImageDetailsPanel.OKButton.text=OK -ImageDetailsPanel.imgSectorSizeLabel.text=\u30BB\u30AF\u30BF\u30FC\u30B5\u30A4\u30BA\uFF1A +ImageDetailsPanel.imgSectorSizeLabel.text=\u30bb\u30af\u30bf\u30fc\u30b5\u30a4\u30ba\uff1a ImageDetailsPanel.imgSectorSizeValue.text=... ImageDetailsPanel.imgTotalSizeValue.text=... -ImageDetailsPanel.imgTotalSizeLabel.text=\u5408\u8A08\u30B5\u30A4\u30BA\uFF1A +ImageDetailsPanel.imgTotalSizeLabel.text=\u5408\u8a08\u30b5\u30a4\u30ba\uff1a ImageDetailsPanel.imgHashValue.text=... -ImageDetailsPanel.imgHashLabel.text=\u30CF\u30C3\u30B7\u30E5\u5024\uFF1A -BlackboardArtifactTagTypeNode.displayName.text=\u7D50\u679C\u30BF\u30B0 -BlackboardArtifactTagTypeNode.createSheet.name.name=\u540D\u524D -BlackboardArtifactTagTypeNode.createSheet.name.displayName=\u540D\u524D -ChangeViewAction.menuItem.view=\u30D3\u30E5\u30FC +ImageDetailsPanel.imgHashLabel.text=\u30cf\u30c3\u30b7\u30e5\u5024\uff1a +ChangeViewAction.menuItem.view=\u30d3\u30e5\u30fc ChangeViewAction.menuItem.view.hex=HEX -ChangeViewAction.menuItem.view.string=\u30B9\u30C8\u30EA\u30F3\u30B0 -DataResultFilterNode.action.viewFileInDir.text=\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u5185\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u8868\u793A -DataResultFilterNode.action.viewSrcFileInDir.text=\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u5185\u306E\u30BD\u30FC\u30B9\u30D5\u30A1\u30A4\u30EB\u3092\u8868\u793A -DataResultFilterNode.action.viewInNewWin.text=\u65B0\u898F\u30A6\u30A3\u30F3\u30C9\u30A6\u306B\u8868\u793A -DataResultFilterNode.action.openInExtViewer.text=\u5916\u90E8\u30D3\u30E5\u30FC\u30A2\u3067\u958B\u304F -DataResultFilterNode.action.searchFilesSameMd5.text=\u540C\u3058MD5\u30CF\u30C3\u30B7\u30E5\u3092\u6301\u3064\u30D5\u30A1\u30A4\u30EB\u3092\u691C\u7D22 -DataResultFilterNode.action.viewInDir.text=\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u30FC\u306B\u8868\u793A -DirectoryTreeFilterNode.action.openFileSrcByAttr.text=\u5C5E\u6027\u306B\u3088\u308B\u30D5\u30A1\u30A4\u30EB\u691C\u7D22\u3092\u958B\u304F -DirectoryTreeFilterNode.action.runIngestMods.text=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30E2\u30B8\u30E5\u30FC\u30EB\u3092\u5B9F\u884C -DirectoryTreeTopComponent.title.text=\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u30EA\u30B9\u30C6\u30A3\u30F3\u30B0 -DirectoryTreeTopComponent.action.viewArtContent.text=\u30A2\u30FC\u30C6\u30A3\u30D5\u30A1\u30AF\u30C8\u30B3\u30F3\u30C6\u30F3\u30C4\u3092\u8868\u793A -DirectoryTreeTopComponent.moduleErr=\u30E2\u30B8\u30E5\u30FC\u30EB\u30A8\u30E9\u30FC -DirectoryTreeTopComponent.moduleErr.msg=DirectoryTreeTopComponent\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8\u3092\u78BA\u8A8D\u4E2D\u306B\u30E2\u30B8\u30E5\u30FC\u30EB\u304C\u30A8\u30E9\u30FC\u3092\u8D77\u3053\u3057\u307E\u3057\u305F\u3002\u3069\u306E\u30E2\u30B8\u30E5\u30FC\u30EB\u304B\u30ED\u30B0\u3067\u78BA\u8A8D\u3057\u3066\u4E0B\u3055\u3044\u3002\u4E00\u90E8\u306E\u30C7\u30FC\u30BF\u304C\u4E0D\u5B8C\u5168\u304B\u3082\u3057\u308C\u307E\u305B\u3093\u3002 -ExplorerNodeActionVisitor.action.imgDetails.title=\u30A4\u30E1\u30FC\u30B8\u8A73\u7D30 -ExplorerNodeActionVisitor.action.extUnallocToSingleFiles=\u672A\u5272\u308A\u5F53\u3066\u9818\u57DF\u5185\u306E\u30C7\u30FC\u30BF\u3092\u8907\u6570\u306E\u30B7\u30F3\u30B0\u30EB\u30D5\u30A1\u30A4\u30EB\u306B\u62BD\u51FA -ExplorerNodeActionVisitor.action.fileSystemDetails.title=\u30D5\u30A1\u30A4\u30EB\u30B7\u30B9\u30C6\u30E0\u8A73\u7D30 -ExplorerNodeActionVisitor.action.volumeDetails.title=\u30DC\u30EA\u30E5\u30FC\u30E0\u8A73\u7D30 -ExplorerNodeActionVisitor.action.extUnallocToSingleFile=\u672A\u5272\u308A\u5F53\u3066\u9818\u57DF\u5185\u306E\u30C7\u30FC\u30BF\u3092\u4E00\u3064\u306E\u30B7\u30F3\u30B0\u30EB\u30D5\u30A1\u30A4\u30EB\u306B\u62BD\u51FA -ExplorerNodeActionVisitor.volDetail.noVolMatchErr=\u30A8\u30E9\u30FC\uFF1A\u4E00\u81F4\u3059\u308B\u30DC\u30EA\u30E5\u30FC\u30E0\u304C\u3042\u308A\u307E\u305B\u3093\u3002 -ExplorerNodeActionVisitor.imgDetail.noVolMatchesErr=\u30A8\u30E9\u30FC\uFF1A\u4E00\u81F4\u3059\u308B\u30DC\u30EA\u30E5\u30FC\u30E0\u304C\u3042\u308A\u307E\u305B\u3093\u3002 -ExplorerNodeActionVisitor.exception.probGetParent.text={0}\: {1}\u304B\u3089\u30DA\u30A2\u30EC\u30F3\u30C8\u3092\u53D6\u5F97\u3059\u308B\u969B\u306B\u554F\u984C\u304C\u767A\u751F\u3057\u307E\u3057\u305F -ExtractAction.title.extractFiles.text=\u30D5\u30A1\u30A4\u30EB\u3092\u62BD\u51FA -ExtractAction.extractFiles.cantCreateFolderErr.msg=\u6307\u5B9A\u3055\u308C\u305F\u30D5\u30A9\u30EB\u30C0\u3092\u4F5C\u6210\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002 -ExtractAction.confDlg.destFileExist.msg=\u4FDD\u5B58\u5148\u306E\u30D5\u30A1\u30A4\u30EB{0}\u306F\u65E2\u306B\u5B58\u5728\u3057\u307E\u3059\u3001\u4E0A\u66F8\u304D\u3057\u307E\u3059\u304B\uFF1F -ExtractAction.confDlg.destFileExist.title=\u30D5\u30A1\u30A4\u30EB\u304C\u5B58\u5728\u3057\u307E\u3059 -ExtractAction.msgDlg.cantOverwriteFile.msg=\u65E2\u5B58\u30D5\u30A1\u30A4\u30EB{0}\u3092\u4E0A\u66F8\u304D\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F -ExtractAction.notifyDlg.noFileToExtr.msg=\u62BD\u51FA\u3067\u304D\u308B\u30D5\u30A1\u30A4\u30EB\u304C\u3042\u308A\u307E\u305B\u3093\u3002 -ExtractAction.progress.extracting=\u62BD\u51FA\u4E2D -ExtractAction.progress.cancellingExtraction={0}\uFF08\u30AD\u30E3\u30F3\u30BB\u30EB\u4E2D\u2026\uFF09 -ExtractAction.done.notifyMsg.fileExtr.text=\u30D5\u30A1\u30A4\u30EB\u304C\u62BD\u51FA\u3055\u308C\u307E\u3057\u305F\u3002 -ExtractUnallocAction.notifyMsg.unallocAlreadyBeingExtr.msg=\u3053\u306E\u30A4\u30E1\u30FC\u30B8\u306E\u672A\u5272\u308A\u5F53\u3066\u9818\u57DF\u306E\u30C7\u30FC\u30BF\u306F\u65E2\u306B\u62BD\u51FA\u4E2D\u3067\u3059\u3002\u5225\u306E\u30A4\u30E1\u30FC\u30B8\u3092\u9078\u629E\u3057\u3066\u4E0B\u3055\u3044\u3002 -ExtractUnallocAction.msgDlg.folderDoesntExist.msg=\u30D5\u30A9\u30EB\u30C0\u306F\u5B58\u5728\u3057\u307E\u305B\u3093\u3002\u7D9A\u884C\u3059\u308B\u524D\u306B\u6709\u52B9\u306A\u30D5\u30A9\u30EB\u30C0\u3092\u9078\u629E\u3057\u3066\u4E0B\u3055\u3044\u3002 -ExtractUnallocAction.dlgTitle.selectDirToSaveTo.msg=\u4FDD\u5B58\u5148\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u9078\u629E\u3057\u3066\u4E0B\u3055\u3044 -ExtractUnallocAction.confDlg.unallocFileAlreadyExist.msg=\u3053\u306E\u30DC\u30EA\u30E5\u30FC\u30E0\u306E\u672A\u5272\u308A\u5F53\u3066\u9818\u57DF\u306E\u30D5\u30A1\u30A4\u30EB{0}\u306F\u65E2\u306B\u5B58\u5728\u3057\u307E\u3059\u3002\u65E2\u5B58\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u7F6E\u304D\u63DB\u3048\u307E\u3059\u304B\uFF1F -ExtractUnallocAction.progress.extractUnalloc.title=\u672A\u5272\u308A\u5F53\u3066\u9818\u57DF\u306E\u30C7\u30FC\u30BF\u3092\u62BD\u51FA\u4E2D -ExtractUnallocAction.progress.displayName.cancelling.text=\u672A\u5272\u308A\u5F53\u3066\u9818\u57DF\u306E\u30C7\u30FC\u30BF\u3092\u62BD\u51FA\u4E2D\uFF08\u30AD\u30E3\u30F3\u30BB\u30EB\u4E2D\u2026\uFF09 -ExtractUnallocAction.processing.counter.msg=\u51E6\u7406\u4E2D\u3000{0}\uFF0F{1} MBs -ExtractUnallocAction.done.notifyMsg.completedExtract.title=\u672A\u5272\u308A\u5F53\u3066\u9818\u57DF\u306E\u62BD\u51FA\u304C\u5B8C\u4E86\u3057\u307E\u3057\u305F\u3002 -ExtractUnallocAction.done.notifyMsg.completedExtract.msg=\u30D5\u30A1\u30A4\u30EB\u306F{0}\u3078\u62BD\u51FA\u3055\u308C\u307E\u3057\u305F -ResultDeleteAction.actionPerf.confDlg.delAllResults.msg={0}\u306E\u7D50\u679C\u5168\u3066\u3092\u672C\u5F53\u306B\u524A\u9664\u3057\u307E\u3059\u304B\uFF1F -ResultDeleteAction.actoinPerf.confDlg.delAllresults.details={0}\u7D50\u679C\u524A\u9664 -ResultDeleteAction.exception.invalidAction.msg=\u7121\u52B9\u306A\u30A2\u30AF\u30B7\u30E7\u30F3\u30BF\u30A4\u30D7\uFF1A{0} -ExtractUnallocAction.done.errMsg.title=\u62BD\u51FA\u30A8\u30E9\u30FC -ExtractUnallocAction.done.errMsg.msg=\u672A\u5272\u308A\u5F53\u3066\u9818\u57DF\u306E\u62BD\u51FA\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\uFF1A{0} -DirectoryTreeFilterNode.action.collapseAll.text=\u3059\u3079\u3066\u30B3\u30E9\u30D7\u30B9 -ExtractAction.done.notifyMsg.extractErr=\u4E0B\u8A18\u306E\u30D5\u30A1\u30A4\u30EB\u306E\u62BD\u51FA\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\uFF1A {0} \ No newline at end of file +ChangeViewAction.menuItem.view.string=\u30b9\u30c8\u30ea\u30f3\u30b0 +DataResultFilterNode.action.viewFileInDir.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u5185\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u8868\u793a +DataResultFilterNode.action.viewSrcFileInDir.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u5185\u306e\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb\u3092\u8868\u793a +DataResultFilterNode.action.viewInNewWin.text=\u65b0\u898f\u30a6\u30a3\u30f3\u30c9\u30a6\u306b\u8868\u793a +DataResultFilterNode.action.openInExtViewer.text=\u5916\u90e8\u30d3\u30e5\u30fc\u30a2\u3067\u958b\u304f +DataResultFilterNode.action.searchFilesSameMd5.text=\u540c\u3058MD5\u30cf\u30c3\u30b7\u30e5\u3092\u6301\u3064\u30d5\u30a1\u30a4\u30eb\u3092\u691c\u7d22 +DataResultFilterNode.action.viewInDir.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc\u306b\u8868\u793a +DirectoryTreeFilterNode.action.openFileSrcByAttr.text=\u5c5e\u6027\u306b\u3088\u308b\u30d5\u30a1\u30a4\u30eb\u691c\u7d22\u3092\u958b\u304f +DirectoryTreeFilterNode.action.runIngestMods.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u5b9f\u884c +DirectoryTreeTopComponent.title.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30ea\u30b9\u30c6\u30a3\u30f3\u30b0 +DirectoryTreeTopComponent.action.viewArtContent.text=\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u8868\u793a +DirectoryTreeTopComponent.moduleErr=\u30e2\u30b8\u30e5\u30fc\u30eb\u30a8\u30e9\u30fc +DirectoryTreeTopComponent.moduleErr.msg=DirectoryTreeTopComponent\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u3092\u78ba\u8a8d\u4e2d\u306b\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u30a8\u30e9\u30fc\u3092\u8d77\u3053\u3057\u307e\u3057\u305f\u3002\u3069\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u304b\u30ed\u30b0\u3067\u78ba\u8a8d\u3057\u3066\u4e0b\u3055\u3044\u3002\u4e00\u90e8\u306e\u30c7\u30fc\u30bf\u304c\u4e0d\u5b8c\u5168\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002 +ExplorerNodeActionVisitor.action.imgDetails.title=\u30a4\u30e1\u30fc\u30b8\u8a73\u7d30 +ExplorerNodeActionVisitor.action.extUnallocToSingleFiles=\u672a\u5272\u308a\u5f53\u3066\u9818\u57df\u5185\u306e\u30c7\u30fc\u30bf\u3092\u8907\u6570\u306e\u30b7\u30f3\u30b0\u30eb\u30d5\u30a1\u30a4\u30eb\u306b\u62bd\u51fa +ExplorerNodeActionVisitor.action.fileSystemDetails.title=\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u8a73\u7d30 +ExplorerNodeActionVisitor.action.volumeDetails.title=\u30dc\u30ea\u30e5\u30fc\u30e0\u8a73\u7d30 +ExplorerNodeActionVisitor.action.extUnallocToSingleFile=\u672a\u5272\u308a\u5f53\u3066\u9818\u57df\u5185\u306e\u30c7\u30fc\u30bf\u3092\u4e00\u3064\u306e\u30b7\u30f3\u30b0\u30eb\u30d5\u30a1\u30a4\u30eb\u306b\u62bd\u51fa +ExplorerNodeActionVisitor.volDetail.noVolMatchErr=\u30a8\u30e9\u30fc\uff1a\u4e00\u81f4\u3059\u308b\u30dc\u30ea\u30e5\u30fc\u30e0\u304c\u3042\u308a\u307e\u305b\u3093\u3002 +ExplorerNodeActionVisitor.imgDetail.noVolMatchesErr=\u30a8\u30e9\u30fc\uff1a\u4e00\u81f4\u3059\u308b\u30dc\u30ea\u30e5\u30fc\u30e0\u304c\u3042\u308a\u307e\u305b\u3093\u3002 +ExplorerNodeActionVisitor.exception.probGetParent.text={0}\: {1}\u304b\u3089\u30da\u30a2\u30ec\u30f3\u30c8\u3092\u53d6\u5f97\u3059\u308b\u969b\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f +ExtractAction.title.extractFiles.text=\u30d5\u30a1\u30a4\u30eb\u3092\u62bd\u51fa +ExtractAction.extractFiles.cantCreateFolderErr.msg=\u6307\u5b9a\u3055\u308c\u305f\u30d5\u30a9\u30eb\u30c0\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +ExtractAction.confDlg.destFileExist.msg=\u4fdd\u5b58\u5148\u306e\u30d5\u30a1\u30a4\u30eb{0}\u306f\u65e2\u306b\u5b58\u5728\u3057\u307e\u3059\u3001\u4e0a\u66f8\u304d\u3057\u307e\u3059\u304b\uff1f +ExtractAction.confDlg.destFileExist.title=\u30d5\u30a1\u30a4\u30eb\u304c\u5b58\u5728\u3057\u307e\u3059 +ExtractAction.msgDlg.cantOverwriteFile.msg=\u65e2\u5b58\u30d5\u30a1\u30a4\u30eb{0}\u3092\u4e0a\u66f8\u304d\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +ExtractAction.notifyDlg.noFileToExtr.msg=\u62bd\u51fa\u3067\u304d\u308b\u30d5\u30a1\u30a4\u30eb\u304c\u3042\u308a\u307e\u305b\u3093\u3002 +ExtractAction.progress.extracting=\u62bd\u51fa\u4e2d +ExtractAction.progress.cancellingExtraction={0}\uff08\u30ad\u30e3\u30f3\u30bb\u30eb\u4e2d\u2026\uff09 +ExtractAction.done.notifyMsg.fileExtr.text=\u30d5\u30a1\u30a4\u30eb\u304c\u62bd\u51fa\u3055\u308c\u307e\u3057\u305f\u3002 +ExtractUnallocAction.notifyMsg.unallocAlreadyBeingExtr.msg=\u3053\u306e\u30a4\u30e1\u30fc\u30b8\u306e\u672a\u5272\u308a\u5f53\u3066\u9818\u57df\u306e\u30c7\u30fc\u30bf\u306f\u65e2\u306b\u62bd\u51fa\u4e2d\u3067\u3059\u3002\u5225\u306e\u30a4\u30e1\u30fc\u30b8\u3092\u9078\u629e\u3057\u3066\u4e0b\u3055\u3044\u3002 +ExtractUnallocAction.msgDlg.folderDoesntExist.msg=\u30d5\u30a9\u30eb\u30c0\u306f\u5b58\u5728\u3057\u307e\u305b\u3093\u3002\u7d9a\u884c\u3059\u308b\u524d\u306b\u6709\u52b9\u306a\u30d5\u30a9\u30eb\u30c0\u3092\u9078\u629e\u3057\u3066\u4e0b\u3055\u3044\u3002 +ExtractUnallocAction.dlgTitle.selectDirToSaveTo.msg=\u4fdd\u5b58\u5148\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u9078\u629e\u3057\u3066\u4e0b\u3055\u3044 +ExtractUnallocAction.confDlg.unallocFileAlreadyExist.msg=\u3053\u306e\u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u672a\u5272\u308a\u5f53\u3066\u9818\u57df\u306e\u30d5\u30a1\u30a4\u30eb{0}\u306f\u65e2\u306b\u5b58\u5728\u3057\u307e\u3059\u3002\u65e2\u5b58\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u7f6e\u304d\u63db\u3048\u307e\u3059\u304b\uff1f +ExtractUnallocAction.progress.extractUnalloc.title=\u672a\u5272\u308a\u5f53\u3066\u9818\u57df\u306e\u30c7\u30fc\u30bf\u3092\u62bd\u51fa\u4e2d +ExtractUnallocAction.progress.displayName.cancelling.text=\u672a\u5272\u308a\u5f53\u3066\u9818\u57df\u306e\u30c7\u30fc\u30bf\u3092\u62bd\u51fa\u4e2d\uff08\u30ad\u30e3\u30f3\u30bb\u30eb\u4e2d\u2026\uff09 +ExtractUnallocAction.processing.counter.msg=\u51e6\u7406\u4e2d\u3000{0}\uff0f{1} MBs +ExtractUnallocAction.done.notifyMsg.completedExtract.title=\u672a\u5272\u308a\u5f53\u3066\u9818\u57df\u306e\u62bd\u51fa\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f\u3002 +ExtractUnallocAction.done.notifyMsg.completedExtract.msg=\u30d5\u30a1\u30a4\u30eb\u306f{0}\u3078\u62bd\u51fa\u3055\u308c\u307e\u3057\u305f +ResultDeleteAction.actionPerf.confDlg.delAllResults.msg={0}\u306e\u7d50\u679c\u5168\u3066\u3092\u672c\u5f53\u306b\u524a\u9664\u3057\u307e\u3059\u304b\uff1f +ResultDeleteAction.actoinPerf.confDlg.delAllresults.details={0}\u7d50\u679c\u524a\u9664 +ResultDeleteAction.exception.invalidAction.msg=\u7121\u52b9\u306a\u30a2\u30af\u30b7\u30e7\u30f3\u30bf\u30a4\u30d7\uff1a{0} +ExtractUnallocAction.done.errMsg.title=\u62bd\u51fa\u30a8\u30e9\u30fc +ExtractUnallocAction.done.errMsg.msg=\u672a\u5272\u308a\u5f53\u3066\u9818\u57df\u306e\u62bd\u51fa\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\uff1a{0} +DirectoryTreeFilterNode.action.collapseAll.text=\u3059\u3079\u3066\u30b3\u30e9\u30d7\u30b9 +ExtractAction.done.notifyMsg.extractErr=\u4e0b\u8a18\u306e\u30d5\u30a1\u30a4\u30eb\u306e\u62bd\u51fa\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\uff1a {0} \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/DataResultFilterNode.java b/Core/src/org/sleuthkit/autopsy/directorytree/DataResultFilterNode.java index fe0f34f2a1..c564a73502 100755 --- a/Core/src/org/sleuthkit/autopsy/directorytree/DataResultFilterNode.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/DataResultFilterNode.java @@ -40,7 +40,6 @@ import org.sleuthkit.autopsy.coreutils.ContextMenuExtensionPoint; import org.sleuthkit.autopsy.datamodel.AbstractAbstractFileNode.AbstractFilePropertyType; import org.sleuthkit.autopsy.datamodel.AbstractFsContentNode; import org.sleuthkit.autopsy.datamodel.BlackboardArtifactNode; -import org.sleuthkit.autopsy.datamodel.ContentTagTypeNode; import org.sleuthkit.autopsy.datamodel.LocalFileNode; import org.sleuthkit.autopsy.datamodel.DeletedContent.DeletedContentsChildren.DeletedContentNode; import org.sleuthkit.autopsy.datamodel.DeletedContent.DeletedContentsNode; @@ -67,7 +66,7 @@ import org.sleuthkit.autopsy.datamodel.RecentFilesFilterNode; import org.sleuthkit.autopsy.datamodel.RecentFilesNode; import org.sleuthkit.autopsy.datamodel.FileTypesNode; import org.sleuthkit.autopsy.datamodel.KeywordHits; -import org.sleuthkit.autopsy.datamodel.TagNameNode; +import org.sleuthkit.autopsy.datamodel.Tags; import org.sleuthkit.datamodel.AbstractFile; import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.BlackboardAttribute; @@ -446,17 +445,17 @@ public class DataResultFilterNode extends FilterNode { } @Override - public AbstractAction visit(TagNameNode node) { + public AbstractAction visit(Tags.TagNameNode node) { return openChild(node); } @Override - public AbstractAction visit(ContentTagTypeNode node) { + public AbstractAction visit(Tags.ContentTagTypeNode node) { return openChild(node); } @Override - public AbstractAction visit(BlackboardArtifactTagTypeNode node) { + public AbstractAction visit(Tags.BlackboardArtifactTagTypeNode node) { return openChild(node); } From eb3f9bbbf316ee6593bf0eabcd7ba8561a2b2a17 Mon Sep 17 00:00:00 2001 From: alexjacks92 Date: Tue, 6 May 2014 14:09:02 -0400 Subject: [PATCH 05/59] Reimplemented object ID replacement in a more sane way. --- test/script/tskdbdiff.py | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/test/script/tskdbdiff.py b/test/script/tskdbdiff.py index c6f5d46d65..3dec5e1579 100755 --- a/test/script/tskdbdiff.py +++ b/test/script/tskdbdiff.py @@ -283,29 +283,32 @@ def replace_id(line, table): files_index = line.find('INSERT INTO "tsk_files"') path_index = line.find('INSERT INTO "tsk_files_path"') object_index = line.find('INSERT INTO "tsk_objects"') + parens = line[line.find('(') + 1 : line.find(')')] + fields_list = parens.replace(" ", "").split(',') - if (files_index != -1 or path_index != -1): - # take the portion of the string between the open parenthesis and the first comma (ie, the object id) - obj_id = int(line[line.find('(') + 1 : line.find(',')]) - # takes everything from the beginning of the string up to the opening - # parenthesis, the path associated with the object id, and everything after - # the first comma, and concactenate it - newLine = (line[:line.find('('):] + '(' + table[obj_id] + line[line.find(','):]) + if (files_index != -1): + obj_id = fields_list[0] + path = table[int(obj_id)] + newLine = ('INSERT INTO "tsk_files" VALUES(' + path + ', '.join(fields_list[1:]) + ');') + return newLine + + elif (path_index != -1): + obj_id = fields_list[0] + path = table[int(obj_id)] + newLine = ('INSERT INTO "tsk_files_path" VALUES(' + path + ', '.join(fields_list[1:]) + ');') return newLine elif (object_index != -1): - # take the portion of the string between the open parenthesis and the first comma (ie, the object id) - obj_id = line[line.find('(') + 1 : line.find(',')] - parent_id = line[line.find(',') + 2 : line.find(',', line.find(',') + 1)] + obj_id = fields_list[0] + parent_id = fields_list[1] try: - path = table[int(obj_id)] - parent_path = table[int(parent_id)] - no_ID = (line[:line.find('('):] + '(' + path + line[line.find(','):]) - newLine = (no_ID[:no_ID.find(',') + 1] + " " + parent_path + no_ID[no_ID.find(parent_id) + 1:]) - return newLine + path = table[int(obj_id)] + parent_path = table[int(parent_id)] + newLine = ('INSERT INTO "tsk_objects" VALUES(' + path + ', ' + parent_path + ', '.join(fields_list[2:]) + ');') + return newLine except Exception as e: - # objects table has things that aren't files. if lookup fails, don't replace the object id. + # objects table has things that aren't files. if lookup fails, don't replace anything. return line else: From 45aa584f2aeb160edb34f91feee3294afe61493d Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Tue, 6 May 2014 17:43:37 -0400 Subject: [PATCH 06/59] Added UserPreferences class --- .../autopsy/core/UserPreferences.java | 80 +++++++ Core/src/org/sleuthkit/autopsy/core/layer.xml | 7 + ...ralPanel.form => AutopsyOptionsPanel.form} | 27 ++- ...ralPanel.java => AutopsyOptionsPanel.java} | 74 ++---- ...ava => AutopsyOptionsPanelController.java} | 10 +- .../autopsy/corecomponents/Bundle.properties | 24 +- .../corecomponents/Bundle_ja.properties | 221 +++++++++--------- .../corecomponents/DataContentPanel.java | 30 ++- .../autopsy/datamodel/ContentUtils.java | 41 ++-- .../autopsy/datamodel/FileTypeChildren.java | 73 +++--- .../datamodel/KnownFileFilterNode.java | 79 ++----- .../DirectoryTreeTopComponent.java | 31 ++- .../sleuthkit/autopsy/timeline/Timeline.java | 2 +- 13 files changed, 381 insertions(+), 318 deletions(-) create mode 100755 Core/src/org/sleuthkit/autopsy/core/UserPreferences.java rename Core/src/org/sleuthkit/autopsy/corecomponents/{GeneralPanel.form => AutopsyOptionsPanel.form} (85%) rename Core/src/org/sleuthkit/autopsy/corecomponents/{GeneralPanel.java => AutopsyOptionsPanel.java} (70%) rename Core/src/org/sleuthkit/autopsy/corecomponents/{GeneralOptionsPanelController.java => AutopsyOptionsPanelController.java} (92%) diff --git a/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java b/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java new file mode 100755 index 0000000000..ea2604ba89 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java @@ -0,0 +1,80 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2014 Basis Technology Corp. + * Contact: carrier sleuthkit 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.core; + +import java.util.prefs.PreferenceChangeListener; +import java.util.prefs.Preferences; +import org.openide.util.NbPreferences; + +/** + * Provides convenient access to a Preferences node for user preferences with + * default values. + */ +public final class UserPreferences { + + private static final Preferences preferences = NbPreferences.forModule(UserPreferences.class); + public static final String KEEP_PREFERRED_VIEWER = "KeepPreferredViewer"; // NON-NLS + public static final String HIDE_KNOWN_FILES_IN_DATA_SOURCES_TREE = "HideKnownFilesInDataSourcesTree"; //NON-NLS + public static final String HIDE_KNOWN_FILES_IN_VIEWS_TREE = "HideKnownFilesInViewsTree"; //NON-NLS + public static final String DISPLAY_TIMES_IN_LOCAL_TIME = "DisplayTimesInLocalTime"; //NON-NLS + + // Prevent instantiation. + private UserPreferences() { + } + + public static void addChangeListener(PreferenceChangeListener listener) { + preferences.addPreferenceChangeListener(listener); + } + + public static void removeChangeListener(PreferenceChangeListener listener) { + preferences.removePreferenceChangeListener(listener); + } + + public static boolean keepPreferredContentViewer() { + return preferences.getBoolean(KEEP_PREFERRED_VIEWER, false); + } + + public static void setKeepPreferredContentViewer(boolean value) { + preferences.putBoolean(KEEP_PREFERRED_VIEWER, value); + } + + public static boolean hideKnownFilesInDataSourcesTree() { + return preferences.getBoolean(HIDE_KNOWN_FILES_IN_DATA_SOURCES_TREE, false); + } + + public static void setHideKnownFilesInDataSourcesTree(boolean value) { + preferences.putBoolean(HIDE_KNOWN_FILES_IN_DATA_SOURCES_TREE, value); + } + + public static boolean hideKnownFilesInViewsTree() { + return preferences.getBoolean(HIDE_KNOWN_FILES_IN_VIEWS_TREE, true); + } + + public static void setHideKnownFilesInViewsTree(boolean value) { + preferences.putBoolean(HIDE_KNOWN_FILES_IN_VIEWS_TREE, value); + } + + public static boolean displayTimesInLocalTime() { + return preferences.getBoolean(DISPLAY_TIMES_IN_LOCAL_TIME, true); + } + + public static void setDisplayTimesInLocalTime(boolean value) { + preferences.putBoolean(DISPLAY_TIMES_IN_LOCAL_TIME, value); + } +} diff --git a/Core/src/org/sleuthkit/autopsy/core/layer.xml b/Core/src/org/sleuthkit/autopsy/core/layer.xml index 0a0d481991..4553e5d146 100644 --- a/Core/src/org/sleuthkit/autopsy/core/layer.xml +++ b/Core/src/org/sleuthkit/autopsy/core/layer.xml @@ -18,6 +18,13 @@ + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/GeneralPanel.form b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.form similarity index 85% rename from Core/src/org/sleuthkit/autopsy/corecomponents/GeneralPanel.form rename to Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.form index 2c0bbd1ee6..6f2a24b8b0 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/GeneralPanel.form +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.form @@ -96,10 +96,10 @@ - + - + @@ -112,24 +112,27 @@ - + - + + + + - + - + @@ -140,7 +143,7 @@ - + @@ -150,7 +153,7 @@ - + @@ -160,28 +163,28 @@ - + - + - + - + diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/GeneralPanel.java b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.java similarity index 70% rename from Core/src/org/sleuthkit/autopsy/corecomponents/GeneralPanel.java rename to Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.java index d34a49b16a..ae46e94cce 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/GeneralPanel.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.java @@ -18,44 +18,35 @@ */ package org.sleuthkit.autopsy.corecomponents; -import java.util.prefs.Preferences; import javax.swing.DefaultComboBoxModel; -import org.openide.util.NbPreferences; -import org.sleuthkit.autopsy.datamodel.ContentUtils; +import org.sleuthkit.autopsy.core.UserPreferences; import org.sleuthkit.autopsy.ingest.IngestManager; -final class GeneralPanel extends javax.swing.JPanel { - - private static final String KEEP_PREFERRED_VIEWER = "keepPreferredViewer"; //NON-NLS - private static final String USE_LOCAL_TIME = "useLocalTime"; //NON-NLS - private static final String DS_HIDE_KNOWN = "dataSourcesHideKnown"; // Default false NON-NLS - private static final String VIEWS_HIDE_KNOWN = "viewsHideKnown"; // Default true NON-NLS - private final Preferences prefs = NbPreferences.forModule(this.getClass()); - - GeneralPanel(GeneralOptionsPanelController controller) { +final class AutopsyOptionsPanel extends javax.swing.JPanel { + + AutopsyOptionsPanel(AutopsyOptionsPanelController controller) { initComponents(); numberOfFileIngestThreadsComboBox.setModel(new DefaultComboBoxModel<>(new Integer[]{1, 2, 4, 8, 16})); - ContentUtils.setDisplayInLocalTime(useLocalTimeRB.isSelected()); // TODO listen to changes in form fields and call controller.changed() } void load() { - boolean keepPreferredViewer = prefs.getBoolean(KEEP_PREFERRED_VIEWER, false); + boolean keepPreferredViewer = UserPreferences.keepPreferredContentViewer(); keepCurrentViewerRB.setSelected(keepPreferredViewer); useBestViewerRB.setSelected(!keepPreferredViewer); - boolean useLocalTime = prefs.getBoolean(USE_LOCAL_TIME, true); + dataSourcesHideKnownCB.setSelected(UserPreferences.hideKnownFilesInDataSourcesTree()); + viewsHideKnownCB.setSelected(UserPreferences.hideKnownFilesInViewsTree()); + boolean useLocalTime = UserPreferences.displayTimesInLocalTime(); useLocalTimeRB.setSelected(useLocalTime); useGMTTimeRB.setSelected(!useLocalTime); - dataSourcesHideKnownCB.setSelected(prefs.getBoolean(DS_HIDE_KNOWN, false)); - viewsHideKnownCB.setSelected(prefs.getBoolean(VIEWS_HIDE_KNOWN, true)); numberOfFileIngestThreadsComboBox.setSelectedItem(IngestManager.getNumberOfFileIngestThreads()); } void store() { - prefs.putBoolean(KEEP_PREFERRED_VIEWER, keepCurrentViewerRB.isSelected()); - prefs.putBoolean(USE_LOCAL_TIME, useLocalTimeRB.isSelected()); - prefs.putBoolean(DS_HIDE_KNOWN, dataSourcesHideKnownCB.isSelected()); - prefs.putBoolean(VIEWS_HIDE_KNOWN, viewsHideKnownCB.isSelected()); + UserPreferences.setKeepPreferredContentViewer(keepCurrentViewerRB.isSelected()); + UserPreferences.setHideKnownFilesInDataSourcesTree(dataSourcesHideKnownCB.isSelected()); + UserPreferences.setHideKnownFilesInViewsTree(viewsHideKnownCB.isSelected()); + UserPreferences.setDisplayTimesInLocalTime(useLocalTimeRB.isSelected()); IngestManager.setNumberOfFileIngestThreads((Integer) numberOfFileIngestThreadsComboBox.getSelectedItem()); } @@ -87,41 +78,31 @@ final class GeneralPanel extends javax.swing.JPanel { buttonGroup1.add(useBestViewerRB); useBestViewerRB.setSelected(true); - org.openide.awt.Mnemonics.setLocalizedText(useBestViewerRB, org.openide.util.NbBundle.getMessage(GeneralPanel.class, "GeneralPanel.useBestViewerRB.text")); // NOI18N - useBestViewerRB.setToolTipText(org.openide.util.NbBundle.getMessage(GeneralPanel.class, "GeneralPanel.useBestViewerRB.toolTipText")); // NOI18N - useBestViewerRB.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - useBestViewerRBActionPerformed(evt); - } - }); + org.openide.awt.Mnemonics.setLocalizedText(useBestViewerRB, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.useBestViewerRB.text")); // NOI18N + useBestViewerRB.setToolTipText(org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.useBestViewerRB.toolTipText")); // NOI18N buttonGroup1.add(keepCurrentViewerRB); - org.openide.awt.Mnemonics.setLocalizedText(keepCurrentViewerRB, org.openide.util.NbBundle.getMessage(GeneralPanel.class, "GeneralPanel.keepCurrentViewerRB.text")); // NOI18N - keepCurrentViewerRB.setToolTipText(org.openide.util.NbBundle.getMessage(GeneralPanel.class, "GeneralPanel.keepCurrentViewerRB.toolTipText")); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(keepCurrentViewerRB, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.keepCurrentViewerRB.text")); // NOI18N + keepCurrentViewerRB.setToolTipText(org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.keepCurrentViewerRB.toolTipText")); // NOI18N - org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(GeneralPanel.class, "GeneralPanel.jLabel1.text")); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.jLabel1.text")); // NOI18N - org.openide.awt.Mnemonics.setLocalizedText(jLabel2, org.openide.util.NbBundle.getMessage(GeneralPanel.class, "GeneralPanel.jLabel2.text")); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(jLabel2, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.jLabel2.text")); // NOI18N buttonGroup3.add(useLocalTimeRB); useLocalTimeRB.setSelected(true); - org.openide.awt.Mnemonics.setLocalizedText(useLocalTimeRB, org.openide.util.NbBundle.getMessage(GeneralPanel.class, "GeneralPanel.useLocalTimeRB.text")); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(useLocalTimeRB, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.useLocalTimeRB.text")); // NOI18N buttonGroup3.add(useGMTTimeRB); - org.openide.awt.Mnemonics.setLocalizedText(useGMTTimeRB, org.openide.util.NbBundle.getMessage(GeneralPanel.class, "GeneralPanel.useGMTTimeRB.text")); // NOI18N - useGMTTimeRB.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - useGMTTimeRBActionPerformed(evt); - } - }); + org.openide.awt.Mnemonics.setLocalizedText(useGMTTimeRB, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.useGMTTimeRB.text")); // NOI18N - org.openide.awt.Mnemonics.setLocalizedText(jLabel3, org.openide.util.NbBundle.getMessage(GeneralPanel.class, "GeneralPanel.jLabel3.text")); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(jLabel3, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.jLabel3.text")); // NOI18N - org.openide.awt.Mnemonics.setLocalizedText(dataSourcesHideKnownCB, org.openide.util.NbBundle.getMessage(GeneralPanel.class, "GeneralPanel.dataSourcesHideKnownCB.text")); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(dataSourcesHideKnownCB, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.dataSourcesHideKnownCB.text")); // NOI18N - org.openide.awt.Mnemonics.setLocalizedText(viewsHideKnownCB, org.openide.util.NbBundle.getMessage(GeneralPanel.class, "GeneralPanel.viewsHideKnownCB.text")); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(viewsHideKnownCB, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.viewsHideKnownCB.text")); // NOI18N - org.openide.awt.Mnemonics.setLocalizedText(jLabel4, org.openide.util.NbBundle.getMessage(GeneralPanel.class, "GeneralPanel.jLabel4.text")); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(jLabel4, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.jLabel4.text")); // NOI18N javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); @@ -181,13 +162,6 @@ final class GeneralPanel extends javax.swing.JPanel { ); }// //GEN-END:initComponents - private void useBestViewerRBActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_useBestViewerRBActionPerformed - // TODO add your handling code here: - }//GEN-LAST:event_useBestViewerRBActionPerformed - - private void useGMTTimeRBActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_useGMTTimeRBActionPerformed - ContentUtils.setDisplayInLocalTime(useLocalTimeRB.isSelected()); - }//GEN-LAST:event_useGMTTimeRBActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.ButtonGroup buttonGroup1; private javax.swing.ButtonGroup buttonGroup3; diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/GeneralOptionsPanelController.java b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanelController.java similarity index 92% rename from Core/src/org/sleuthkit/autopsy/corecomponents/GeneralOptionsPanelController.java rename to Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanelController.java index 990576ea0c..c0de3942ea 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/GeneralOptionsPanelController.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanelController.java @@ -34,12 +34,12 @@ import org.sleuthkit.autopsy.coreutils.Logger; position = 1, keywords = "#OptionsCategory_Keywords_General", keywordsCategory = "General") -public final class GeneralOptionsPanelController extends OptionsPanelController { +public final class AutopsyOptionsPanelController extends OptionsPanelController { - private GeneralPanel panel; + private AutopsyOptionsPanel panel; private final PropertyChangeSupport pcs = new PropertyChangeSupport(this); private boolean changed; - private static final Logger logger = Logger.getLogger(GeneralOptionsPanelController.class.getName()); + private static final Logger logger = Logger.getLogger(AutopsyOptionsPanelController.class.getName()); @Override public void update() { @@ -87,9 +87,9 @@ public final class GeneralOptionsPanelController extends OptionsPanelController pcs.removePropertyChangeListener(l); } - private GeneralPanel getPanel() { + private AutopsyOptionsPanel getPanel() { if (panel == null) { - panel = new GeneralPanel(this); + panel = new AutopsyOptionsPanel(this); } return panel; } diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties b/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties index 4eb9d18d40..b5cef39ee8 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties @@ -60,11 +60,6 @@ DataResultViewerThumbnail.pageNumLabel.text=- DataResultViewerThumbnail.filePathLabel.text=\ \ \ DataResultViewerThumbnail.goToPageLabel.text=Go to Page: DataResultViewerThumbnail.goToPageField.text= -GeneralPanel.jLabel1.text=When selecting a file: -GeneralPanel.useBestViewerRB.text=Change to the most specific file viewer -GeneralPanel.keepCurrentViewerRB.text=Stay on the same file viewer -GeneralPanel.useBestViewerRB.toolTipText=For example, change from Hex to Media when a JPEG is selected. -GeneralPanel.keepCurrentViewerRB.toolTipText=For example, stay in Hex view when a JPEG is selected. AdvancedConfigurationDialog.cancelButton.text=Cancel DataResultPanel.directoryTablePath.text=directoryPath DataResultPanel.numberMatchLabel.text=0 @@ -73,12 +68,6 @@ MediaViewVideoPanel.pauseButton.text=\u25ba MediaViewVideoPanel.progressLabel.text=00:00 DataContentViewerMedia.AccessibleContext.accessibleDescription= MediaViewVideoPanel.infoLabel.text=info -GeneralPanel.jLabel2.text=When displaying times: -GeneralPanel.useLocalTimeRB.text=Use local time zone -GeneralPanel.useGMTTimeRB.text=Use GMT -GeneralPanel.jLabel3.text=Hide known files (i.e. those in the NIST NSRL) in the: -GeneralPanel.viewsHideKnownCB.text= Views area -GeneralPanel.dataSourcesHideKnownCB.text=Data Sources area (the directory hierarchy) DataContentViewerArtifact.waitText=Retrieving and preparing data, please wait... DataContentViewerArtifact.errorText=Error retrieving result DataContentViewerArtifact.title=Results @@ -137,5 +126,16 @@ DataResultViewerThumbnail.switchPage.done.errMsg=Error making thumbnails\: {0} FXVideoPanel.pauseButton.infoLabel.playbackErr=Playback error. GstVideoPanel.progress.infoLabel.updateErr=Error updating video progress\: {0} GstVideoPanel.ExtractMedia.progress.buffering=Buffering {0} -GeneralPanel.jLabel4.text=Number of threads to use for file ingest: AboutWindowPanel.actVerboseLogging.text=Activate verbose logging +AutopsyOptionsPanel.jLabel4.text=Number of threads to use for file ingest: +AutopsyOptionsPanel.viewsHideKnownCB.text=Views area +AutopsyOptionsPanel.dataSourcesHideKnownCB.text=Data Sources area (the directory hierarchy) +AutopsyOptionsPanel.jLabel3.text=Hide known files (i.e. those in the NIST NSRL) in the: +AutopsyOptionsPanel.useBestViewerRB.toolTipText=For example, change from Hex to Media when a JPEG is selected. +AutopsyOptionsPanel.useBestViewerRB.text=Change to the most specific file viewer +AutopsyOptionsPanel.useGMTTimeRB.text=Use GMT +AutopsyOptionsPanel.useLocalTimeRB.text=Use local time zone +AutopsyOptionsPanel.keepCurrentViewerRB.toolTipText=For example, stay in Hex view when a JPEG is selected. +AutopsyOptionsPanel.keepCurrentViewerRB.text=Stay on the same file viewer +AutopsyOptionsPanel.jLabel1.text=When selecting a file: +AutopsyOptionsPanel.jLabel2.text=When displaying times: diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle_ja.properties index 01f91dc4d8..d111a9c60a 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle_ja.properties +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle_ja.properties @@ -1,123 +1,134 @@ -CTL_DataContentAction=\u30C7\u30FC\u30BF\u30B3\u30F3\u30C6\u30F3\u30C4 +CTL_DataContentAction=\u30c7\u30fc\u30bf\u30b3\u30f3\u30c6\u30f3\u30c4 OptionsCategory_Name_General=Autopsy -OptionsCategory_Keywords_General=Autopsy\u30AA\u30D7\u30B7\u30E7\u30F3 -CTL_CustomAboutAction=Autopsy\u306B\u3064\u3044\u3066 -CTL_DataContentTopComponent=\u30C7\u30FC\u30BF\u30B3\u30F3\u30C6\u30F3\u30C4 -HINT_DataContentTopComponent=\u3053\u308C\u306F\u30C7\u30FC\u30BF\u30B3\u30F3\u30C6\u30F3\u30C4\u306E\u30A6\u30A3\u30F3\u30C9\u30A6\u3067\u3059 -HINT_NodeTableTopComponent=\u3053\u308C\u306F\u30C7\u30FC\u30BF\u7D50\u679C\u306E\u30A6\u30A3\u30F3\u30C9\u30A6\u3067\u3059 -OpenIDE-Module-Name=\u4E3B\u8981\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8 -DataContentViewerHex.pageLabel.text_1=\u30DA\u30FC\u30B8\uFF1A +OptionsCategory_Keywords_General=Autopsy\u30aa\u30d7\u30b7\u30e7\u30f3 +CTL_CustomAboutAction=Autopsy\u306b\u3064\u3044\u3066 +CTL_DataContentTopComponent=\u30c7\u30fc\u30bf\u30b3\u30f3\u30c6\u30f3\u30c4 +HINT_DataContentTopComponent=\u3053\u308c\u306f\u30c7\u30fc\u30bf\u30b3\u30f3\u30c6\u30f3\u30c4\u306e\u30a6\u30a3\u30f3\u30c9\u30a6\u3067\u3059 +HINT_NodeTableTopComponent=\u3053\u308c\u306f\u30c7\u30fc\u30bf\u7d50\u679c\u306e\u30a6\u30a3\u30f3\u30c9\u30a6\u3067\u3059 +OpenIDE-Module-Name=\u4e3b\u8981\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8 +DataContentViewerHex.pageLabel.text_1=\u30da\u30fc\u30b8\uff1a DataContentViewerHex.currentPageLabel.text_1=1 DataContentViewerHex.totalPageLabel.text_1=100 -DataContentViewerString.pageLabel.text_1=\u30DA\u30FC\u30B8\uFF1A +DataContentViewerString.pageLabel.text_1=\u30da\u30fc\u30b8\uff1a DataContentViewerString.currentPageLabel.text_1=1 DataContentViewerString.totalPageLabel.text_1=100 -DataContentViewerHex.pageLabel2.text=\u30DA\u30FC\u30B8 -DataContentViewerString.pageLabel2.text=\u30DA\u30FC\u30B8 -Format_OperatingSystem_Value={0} \u30D0\u30FC\u30B8\u30E7\u30F3 {1} \u30A2\u30FC\u30AD\u30C6\u30AF\u30C1\u30E3 {2} +DataContentViewerHex.pageLabel2.text=\u30da\u30fc\u30b8 +DataContentViewerString.pageLabel2.text=\u30da\u30fc\u30b8 +Format_OperatingSystem_Value={0} \u30d0\u30fc\u30b8\u30e7\u30f3 {1} \u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3 {2} URL_ON_IMG=http\://www.sleuthkit.org/ -LBL_Close=\u9589\u3058\u308B -DataContentViewerString.copyMenuItem.text=\u30B3\u30D4\u30FC -DataContentViewerHex.copyMenuItem.text=\u30B3\u30D4\u30FC -DataContentViewerString.selectAllMenuItem.text=\u3059\u3079\u3066\u9078\u629E -DataContentViewerHex.selectAllMenuItem.text=\u3059\u3079\u3066\u9078\u629E +LBL_Close=\u9589\u3058\u308b +DataContentViewerString.copyMenuItem.text=\u30b3\u30d4\u30fc +DataContentViewerHex.copyMenuItem.text=\u30b3\u30d4\u30fc +DataContentViewerString.selectAllMenuItem.text=\u3059\u3079\u3066\u9078\u629e +DataContentViewerHex.selectAllMenuItem.text=\u3059\u3079\u3066\u9078\u629e DataContentViewerArtifact.totalPageLabel.text=100 -DataContentViewerArtifact.pageLabel2.text=\u7D50\u679C +DataContentViewerArtifact.pageLabel2.text=\u7d50\u679c DataContentViewerArtifact.currentPageLabel.text=1 -DataContentViewerArtifact.copyMenuItem.text=\u30B3\u30D4\u30FC -DataContentViewerArtifact.selectAllMenuItem.text=\u3059\u3079\u3066\u9078\u629E -DataContentViewerArtifact.pageLabel.text=\u7D50\u679C\uFF1A +DataContentViewerArtifact.copyMenuItem.text=\u30b3\u30d4\u30fc +DataContentViewerArtifact.selectAllMenuItem.text=\u3059\u3079\u3066\u9078\u629e +DataContentViewerArtifact.pageLabel.text=\u7d50\u679c\uff1a AdvancedConfigurationDialog.applyButton.text=OK -DataContentViewerString.goToPageLabel.text=\u4E0B\u8A18\u306E\u30DA\u30FC\u30B8\u3078\u79FB\u52D5\uFF1A -DataContentViewerHex.goToPageLabel.text=\u4E0B\u8A18\u306E\u30DA\u30FC\u30B8\u3078\u79FB\u52D5\uFF1A -DataContentViewerString.languageLabel.text=\u30B9\u30AF\u30EA\u30D7\u30C8\uFF1A -DataContentViewerString.languageCombo.toolTipText=\u30D0\u30A4\u30CA\u30EA\u30B9\u30C8\u30EA\u30F3\u30B0\u306E\u51E6\u7406\uFF08\u62BD\u51FA\u304A\u3088\u3073\u30C7\u30B3\u30FC\u30C9\uFF09\u306B\u4F7F\u7528\u3059\u308B\u8A00\u8A9E -DataResultViewerThumbnail.pageLabel.text=\u30DA\u30FC\u30B8\uFF1A -DataResultViewerThumbnail.pagesLabel.text=\u30DA\u30FC\u30B8\uFF1A -DataResultViewerThumbnail.imagesLabel.text=\u30A4\u30E1\u30FC\u30B8\uFF1A +DataContentViewerString.goToPageLabel.text=\u4e0b\u8a18\u306e\u30da\u30fc\u30b8\u3078\u79fb\u52d5\uff1a +DataContentViewerHex.goToPageLabel.text=\u4e0b\u8a18\u306e\u30da\u30fc\u30b8\u3078\u79fb\u52d5\uff1a +DataContentViewerString.languageLabel.text=\u30b9\u30af\u30ea\u30d7\u30c8\uff1a +DataContentViewerString.languageCombo.toolTipText=\u30d0\u30a4\u30ca\u30ea\u30b9\u30c8\u30ea\u30f3\u30b0\u306e\u51e6\u7406\uff08\u62bd\u51fa\u304a\u3088\u3073\u30c7\u30b3\u30fc\u30c9\uff09\u306b\u4f7f\u7528\u3059\u308b\u8a00\u8a9e +DataResultViewerThumbnail.pageLabel.text=\u30da\u30fc\u30b8\uff1a +DataResultViewerThumbnail.pagesLabel.text=\u30da\u30fc\u30b8\uff1a +DataResultViewerThumbnail.imagesLabel.text=\u30a4\u30e1\u30fc\u30b8\uff1a DataResultViewerThumbnail.imagesRangeLabel.text=- DataResultViewerThumbnail.pageNumLabel.text=- -DataResultViewerThumbnail.goToPageLabel.text=\u4E0B\u8A18\u306E\u30DA\u30FC\u30B8\u306B\u79FB\u52D5\uFF1A -GeneralPanel.jLabel1.text=\u30D5\u30A1\u30A4\u30EB\u3092\u9078\u629E\u3059\u308B\u5834\u5408\uFF1A -GeneralPanel.useBestViewerRB.text=\u6700\u3082\u5C02\u9580\u7684\u306A\u30D5\u30A1\u30A4\u30EB\u30D3\u30E5\u30FC\u30A2\u306B\u5909\u66F4 -GeneralPanel.keepCurrentViewerRB.text=\u305D\u306E\u307E\u307E\u540C\u3058\u30D5\u30A1\u30A4\u30EB\u30D3\u30E5\u30FC\u30A2\u3092\u4F7F\u7528 -GeneralPanel.useBestViewerRB.toolTipText=\u4F8B\u3048\u3070\u3001JPEG\u304C\u9078\u629E\u3055\u308C\u305F\u5834\u5408\u306B\u306FHEX\u304B\u3089\u30E1\u30C7\u30A3\u30A2\u306B\u5909\u66F4\u3059\u308B\u3002 -GeneralPanel.keepCurrentViewerRB.toolTipText=\u4F8B\u3048\u3070\u3001JPEG\u304C\u9078\u629E\u3055\u308C\u305F\u5834\u5408\u306B\u305D\u306E\u307E\u307EHEX\u30D3\u30E5\u30FC\u3092\u4F7F\u7528\u3002 -AdvancedConfigurationDialog.cancelButton.text=\u30AD\u30E3\u30F3\u30BB\u30EB -DataResultPanel.directoryTablePath.text=\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u30D1\u30B9 +DataResultViewerThumbnail.goToPageLabel.text=\u4e0b\u8a18\u306e\u30da\u30fc\u30b8\u306b\u79fb\u52d5\uff1a +AdvancedConfigurationDialog.cancelButton.text=\u30ad\u30e3\u30f3\u30bb\u30eb +DataResultPanel.directoryTablePath.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30d1\u30b9 DataResultPanel.numberMatchLabel.text=0 -DataResultPanel.matchLabel.text=\u7D50\u679C -MediaViewVideoPanel.pauseButton.text=\u25BA +DataResultPanel.matchLabel.text=\u7d50\u679c +MediaViewVideoPanel.pauseButton.text=\u25ba MediaViewVideoPanel.progressLabel.text=00\:00 -MediaViewVideoPanel.infoLabel.text=\u60C5\u5831 -GeneralPanel.jLabel2.text=\u30A2\u30A4\u30C6\u30E0\u3092\u8868\u793A\u3059\u308B\u5834\u5408\uFF1A -GeneralPanel.useLocalTimeRB.text=\u30ED\u30FC\u30AB\u30EB\u30BF\u30A4\u30E0\u30BE\u30FC\u30F3\u3092\u4F7F\u7528 -GeneralPanel.useGMTTimeRB.text=GMT\u3092\u4F7F\u7528 -GeneralPanel.jLabel3.text=\u65E2\u77E5\u30D5\u30A1\u30A4\u30EB\uFF08NIST NSRL\u5185\u306E\uFF09\u3092\u4E0B\u8A18\u306B\u96A0\u3059\uFF1A -GeneralPanel.viewsHideKnownCB.text=\u30D3\u30E5\u30FC\u304B\u3089\u9078\u629E\u3057\u3066\u3044\u308B\u5834\u5408 -GeneralPanel.dataSourcesHideKnownCB.text=\u30C7\u30FC\u30BF\u30BD\u30FC\u30B9\u30A8\u30EA\u30A2\uFF08\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u968E\u5C64\uFF09 -DataContentViewerArtifact.waitText=\u30C7\u30FC\u30BF\u3092\u53D6\u8FBC\u307F\u304A\u3088\u3073\u6E96\u5099\u4E2D\u3002\u3057\u3070\u3089\u304F\u304A\u5F85\u3061\u4E0B\u3055\u3044\u2026 -DataContentViewerArtifact.errorText=\u7D50\u679C\u306E\u53D6\u8FBC\u307F\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F -DataContentViewerArtifact.title=\u7D50\u679C -DataContentViewerArtifact.toolTip=\u30D5\u30A1\u30A4\u30EB\u306B\u95A2\u9023\u3059\u308B\u7D50\u679C\u3092\u8868\u793A\u3057\u307E\u3059 -DataContentViewerHex.goToPageTextField.msgDlg=\uFF11\u304B\u3089 {0}\u306E\u9593\u306E\u6709\u52B9\u306A\u30DA\u30FC\u30B8\u6570\u3092\u5165\u529B\u3057\u3066\u4E0B\u3055\u3044 -DataContentViewerHex.goToPageTextField.err=\u7121\u52B9\u306A\u30DA\u30FC\u30B8\u6570 -DataContentViewerHex.setDataView.errorText=\uFF08\u30AA\u30D5\u30BB\u30C3\u30C8{0}-{1}\u306F\u8AAD\u307F\u53D6\u308C\u307E\u305B\u3093\u3067\u3057\u305F\uFF09 +MediaViewVideoPanel.infoLabel.text=\u60c5\u5831 +DataContentViewerArtifact.waitText=\u30c7\u30fc\u30bf\u3092\u53d6\u8fbc\u307f\u304a\u3088\u3073\u6e96\u5099\u4e2d\u3002\u3057\u3070\u3089\u304f\u304a\u5f85\u3061\u4e0b\u3055\u3044\u2026 +DataContentViewerArtifact.errorText=\u7d50\u679c\u306e\u53d6\u8fbc\u307f\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f +DataContentViewerArtifact.title=\u7d50\u679c +DataContentViewerArtifact.toolTip=\u30d5\u30a1\u30a4\u30eb\u306b\u95a2\u9023\u3059\u308b\u7d50\u679c\u3092\u8868\u793a\u3057\u307e\u3059 +DataContentViewerHex.goToPageTextField.msgDlg=\uff11\u304b\u3089 {0}\u306e\u9593\u306e\u6709\u52b9\u306a\u30da\u30fc\u30b8\u6570\u3092\u5165\u529b\u3057\u3066\u4e0b\u3055\u3044 +DataContentViewerHex.goToPageTextField.err=\u7121\u52b9\u306a\u30da\u30fc\u30b8\u6570 +DataContentViewerHex.setDataView.errorText=\uff08\u30aa\u30d5\u30bb\u30c3\u30c8{0}-{1}\u306f\u8aad\u307f\u53d6\u308c\u307e\u305b\u3093\u3067\u3057\u305f\uff09 DataContentViewerHex.title=HEX -DataContentViewerHex.toolTip=\u30D0\u30A4\u30CA\u30EA\u30B3\u30F3\u30C6\u30F3\u30C4\u3092HEX\u30D5\u30A1\u30A4\u30EB\u3068\u3057\u3066\u8868\u793A\u3057\u3001ASCII\u3068\u3057\u3066\u8868\u793A\u3067\u304D\u308B\u30D0\u30A4\u30C8\u306F\u53F3\u5074\u306B\u8868\u793A\u3057\u307E\u3059\u3002 -DataContentViewerMedia.title=\u30E1\u30C7\u30A3\u30A2 -DataContentViewerMedia.toolTip=\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u308B\u30DE\u30EB\u30C1\u30E1\u30C7\u30A3\u30A2\u30D5\u30A1\u30A4\u30EB\uFF08\u30A4\u30E1\u30FC\u30B8\u3001\u30D3\u30C7\u30AA\u3001\u30AA\u30FC\u30C7\u30A3\u30AA\uFF09\u3092\u8868\u793A\u3057\u307E\u3059\u3002 -DataContentViewerString.goToPageTextField.msgDlg=\uFF11\u304B\u3089{0}\u306E\u9593\u306E\u6709\u52B9\u306A\u30DA\u30FC\u30B8\u6570\u3092\u5165\u529B\u3057\u3066\u4E0B\u3055\u3044 -DataContentViewerString.goToPageTextField.err=\u7121\u52B9\u306A\u30DA\u30FC\u30B8\u6570 -DataContentViewerString.setDataView.errorText=\uFF08\u30AA\u30D5\u30BB\u30C3\u30C8{0}-{1}\u306F\u8AAD\u307F\u53D6\u308C\u307E\u305B\u3093\u3067\u3057\u305F\uFF09 -DataContentViewerString.title=\u30B9\u30C8\u30EA\u30F3\u30B0 -DataContentViewerString.toolTip=\u30D5\u30A1\u30A4\u30EB\u304B\u3089\u62BD\u51FA\u3055\u308C\u305FASCII\u304A\u3088\u3073\u30E6\u30CB\u30B3\u30FC\u30C9\u306E\u30B9\u30C8\u30EA\u30F3\u30B0\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002 -DataResultPanel.dummyNodeDisplayName=\u3057\u3070\u3089\u304F\u304A\u5F85\u3061\u304F\u3060\u3055\u3044\u2026 -DataResultViewerTable.firstColLbl=\u540D\u524D -DataResultViewerTable.illegalArgExc.noChildFromParent=\u6307\u5B9A\u3055\u308C\u305F\u30DA\u30A2\u30EC\u30F3\u30C8\u304B\u3089\u30C1\u30E3\u30A4\u30EB\u30C9\u30CE\u30FC\u30C9\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002 -DataResultViewerTable.illegalArgExc.childWithoutPropertySet=\u30C1\u30E3\u30A4\u30EB\u30C9\u30CE\u30FC\u30C9\u306F\u901A\u5E38\u306EPropertySet\u3092\u6301\u3063\u3066\u3044\u307E\u305B\u3093\u3002 -DataResultViewerTable.title=\u30C6\u30FC\u30D6\u30EB -DataResultViewerTable.dummyNodeDisplayName=\u3057\u3070\u3089\u304F\u304A\u5F85\u3061\u304F\u3060\u3055\u3044\u2026 -DataResultViewerThumbnail.title=\u30B5\u30E0\u30CD\u30A4\u30EB -DataResultViewerThumbnail.goToPageTextField.msgDlg=\uFF11\u304B\u3089{0}\u306E\u9593\u306E\u6709\u52B9\u306A\u30DA\u30FC\u30B8\u6570\u3092\u5165\u529B\u3057\u3066\u4E0B\u3055\u3044 -DataResultViewerThumbnail.goToPageTextField.err=\u7121\u52B9\u306A\u30DA\u30FC\u30B8\u6570 -DataResultViewerThumbnail.genThumbs=\u30B5\u30E0\u30CD\u30A4\u30EB\u3092\u4F5C\u6210\u4E2D\u2026 -DataResultViewerThumbnail.pageNumbers.curOfTotal={0}\uFF0F{1}\u3064\u76EE -FXVideoPanel.mediaPane.infoLabel=\u524A\u9664\u3055\u308C\u305F\u30D3\u30C7\u30AA\u306E\u518D\u751F\u306F\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002\u5916\u90E8\u30D7\u30EC\u30FC\u30E4\u30FC\u3092\u4F7F\u7528\u3057\u3066\u4E0B\u3055\u3044\u3002 -FXVideoPanel.progress.bufferingFile={0}\u3092\u30D0\u30C3\u30D5\u30A1\u30EA\u30F3\u30B0 -FXVideoPanel.progressLabel.buffering=\u30D0\u30C3\u30D5\u30A1\u30EA\u30F3\u30B0\u4E2D\u2026 -FXVideoPanel.media.unsupportedFormat=\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u306A\u3044\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u3067\u3059\u3002 -GeneralOptionsPanelController.moduleErr=\u30E2\u30B8\u30E5\u30FC\u30EB\u30A8\u30E9\u30FC -GeneralOptionsPanelController.moduleErr.msg=GeneralOptionsPanelController\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8\u3092\u78BA\u8A8D\u4E2D\u306B\u30E2\u30B8\u30E5\u30FC\u30EB\u304C\u30A8\u30E9\u30FC\u3092\u8D77\u3053\u3057\u307E\u3057\u305F\u3002\u3069\u306E\u30E2\u30B8\u30E5\u30FC\u30EB\u304B\u30ED\u30B0\u3067\u78BA\u8A8D\u3057\u3066\u4E0B\u3055\u3044\u3002\u4E00\u90E8\u306E\u30C7\u30FC\u30BF\u304C\u4E0D\u5B8C\u5168\u304B\u3082\u3057\u308C\u307E\u305B\u3093\u3002 -GstVideoPanel.cannotProcFile.err=\u30E1\u30C7\u30A4\u30A2\u30D7\u30EC\u30FC\u30E4\u30FC\u304C\u3053\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u51E6\u7406\u3067\u304D\u307E\u305B\u3093\u3002 -GstVideoPanel.initGst.gstException.msg=\u30AA\u30FC\u30C7\u30A3\u30AA\uFF0F\u30D3\u30C7\u30AA\u306E\u518D\u751F\u304A\u3088\u3073\u30D5\u30EC\u30FC\u30E0\u306E\u62BD\u51FA\u306B\u4F7F\u7528\u3059\u308BGStreamer\u306E\u521D\u671F\u5316\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\u30D3\u30C7\u30AA\u304A\u3088\u3073\u30AA\u30FC\u30C7\u30A3\u30AA\u518D\u751F\u304C\u7121\u52B9\u5316\u3055\u308C\u307E\u3059\u3002 -GstVideoPanel.initGst.otherException.msg=\u30AA\u30FC\u30C7\u30A3\u30AA\uFF0F\u30D3\u30C7\u30AA\u306E\u518D\u751F\u304A\u3088\u3073\u30D5\u30EC\u30FC\u30E0\u306E\u62BD\u51FA\u306B\u4F7F\u7528\u3059\u308BGStreamer\u306E\u521D\u671F\u5316\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\u30D3\u30C7\u30AA\u304A\u3088\u3073\u30AA\u30FC\u30C7\u30A3\u30AA\u518D\u751F\u304C\u7121\u52B9\u5316\u3055\u308C\u307E\u3059\u3002 -GstVideoPanel.setupVideo.infoLabel.text=\u524A\u9664\u3055\u308C\u305F\u30D3\u30C7\u30AA\u306E\u518D\u751F\u306F\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002\u5916\u90E8\u30D7\u30EC\u30FC\u30E4\u30FC\u3092\u4F7F\u7528\u3057\u3066\u4E0B\u3055\u3044\u3002 -GstVideoPanel.exception.problemFile.msg=\u30D5\u30A1\u30A4\u30EB({0})\u304B\u3089\u306F\u30D5\u30EC\u30FC\u30E0\u3092\u62BD\u51FA\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002 -GstVideoPanel.exception.problemPlay.msg=\u30D3\u30C7\u30AA\u30D5\u30A1\u30A4\u30EB\u306B\u554F\u984C\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\u9577\u3055\u3092\u78BA\u8A8D\u4E2D\u306B\u518D\u751F\u3092\u3057\u3088\u3046\u3068\u3057\u305F\u969B\u306B\u554F\u984C\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002 -LBL_Description=
\n \u88FD\u54C1\u30D0\u30FC\u30B8\u30E7\u30F3\uFF1A {0} ({9})
Sleuth Kit\u30D0\u30FC\u30B8\u30E7\u30F3\uFF1A {7}
Netbeans RCP\u30D3\u30EB\u30C9\: {8}
Java\: {1}; {2}
\u30B7\u30B9\u30C6\u30E0\uFF1A {3}; {4}; {5}
\u30E6\u30FC\u30B6\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u540D {6}
-LBL_Copyright=
Autopsy™\u306FSleuth Kit™\u3084\u305D\u306E\u4ED6\u30C4\u30FC\u30EB\u3092\u57FA\u306B\u3057\u305F\u30C7\u30B8\u30BF\u30EB\u30FB\u30D5\u30A9\u30EC\u30F3\u30B8\u30C3\u30AF\u30FB\u30D7\u30E9\u30C3\u30C8\u30D5\u30A9\u30FC\u30E0\u3067\u3059\u3002

Copyright © 2003-2013. \u8A73\u7D30\u306F\u4E0B\u8A18\u3092\u3054\u89A7\u4E0B\u3055\u3044\u3002 http\://www.sleuthkit.org.
-GstVideoPanel.exception.problemPause.msg=\u30D3\u30C7\u30AA\u30D5\u30A1\u30A4\u30EB\u306B\u554F\u984C\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\u9577\u3055\u3092\u78BA\u8A8D\u4E2D\u306B\u4E00\u6642\u505C\u6B62\u3092\u3057\u3088\u3046\u3068\u3057\u305F\u969B\u306B\u554F\u984C\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002 -GstVideoPanel.exception.problemPauseCaptFrame.msg=\u30D3\u30C7\u30AA\u30D5\u30A1\u30A4\u30EB\u306B\u554F\u984C\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\u30D5\u30EC\u30FC\u30E0\u306E\u62BD\u51FA\u4E2D\u306B\u4E00\u6642\u505C\u6B62\u3092\u3057\u3088\u3046\u3068\u3057\u305F\u969B\u306B\u554F\u984C\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002 -GstVideoPanel.exception.problemPlayCaptFrame.msg=\u30D3\u30C7\u30AA\u30D5\u30A1\u30A4\u30EB\u306B\u554F\u984C\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\u30D5\u30EC\u30FC\u30E0\u306E\u62BD\u51FA\u4E2D\u306B\u518D\u751F\u3057\u3088\u3046\u3068\u3057\u305F\u969B\u306B\u554F\u984C\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002 -GstVideoPanel.exception.problemStopCaptFrame.msg=\u30D3\u30C7\u30AA\u30D5\u30A1\u30A4\u30EB\u306B\u554F\u984C\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\u30D5\u30EC\u30FC\u30E0\u306E\u62BD\u51FA\u4E2D\u306B\u505C\u6B62\u3057\u3088\u3046\u3068\u3057\u305F\u969B\u306B\u554F\u984C\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002 -GstVideoPanel.progress.buffering=\u30D0\u30C3\u30D5\u30A1\u30EA\u30F3\u30B0\u4E2D\u2026 -GstVideoPanel.progressLabel.bufferingErr=\u30D5\u30A1\u30A4\u30EB\u306E\u30D0\u30C3\u30D5\u30A1\u30EA\u30F3\u30B0\u30A8\u30E9\u30FC -MediaViewImagePanel.imgFileTooLarge.msg=\u30A4\u30E1\u30FC\u30B8\u30D5\u30A1\u30A4\u30EB\u3092\u8AAD\u307F\u8FBC\u3081\u307E\u305B\u3093\u3067\u3057\u305F\uFF08\u5927\u304D\u3059\u304E\u3067\u3059\uFF09\uFF1A {0} -ProductInformationPanel.verbLoggingEnabled.text=Verbose\u30ED\u30B0\u304C\u6709\u52B9\u3067\u3059 -ProductInformationPanel.propertyUnknown.text=\u4E0D\u660E +DataContentViewerHex.toolTip=\u30d0\u30a4\u30ca\u30ea\u30b3\u30f3\u30c6\u30f3\u30c4\u3092HEX\u30d5\u30a1\u30a4\u30eb\u3068\u3057\u3066\u8868\u793a\u3057\u3001ASCII\u3068\u3057\u3066\u8868\u793a\u3067\u304d\u308b\u30d0\u30a4\u30c8\u306f\u53f3\u5074\u306b\u8868\u793a\u3057\u307e\u3059\u3002 +DataContentViewerMedia.title=\u30e1\u30c7\u30a3\u30a2 +DataContentViewerMedia.toolTip=\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u308b\u30de\u30eb\u30c1\u30e1\u30c7\u30a3\u30a2\u30d5\u30a1\u30a4\u30eb\uff08\u30a4\u30e1\u30fc\u30b8\u3001\u30d3\u30c7\u30aa\u3001\u30aa\u30fc\u30c7\u30a3\u30aa\uff09\u3092\u8868\u793a\u3057\u307e\u3059\u3002 +DataContentViewerString.goToPageTextField.msgDlg=\uff11\u304b\u3089{0}\u306e\u9593\u306e\u6709\u52b9\u306a\u30da\u30fc\u30b8\u6570\u3092\u5165\u529b\u3057\u3066\u4e0b\u3055\u3044 +DataContentViewerString.goToPageTextField.err=\u7121\u52b9\u306a\u30da\u30fc\u30b8\u6570 +DataContentViewerString.setDataView.errorText=\uff08\u30aa\u30d5\u30bb\u30c3\u30c8{0}-{1}\u306f\u8aad\u307f\u53d6\u308c\u307e\u305b\u3093\u3067\u3057\u305f\uff09 +DataContentViewerString.title=\u30b9\u30c8\u30ea\u30f3\u30b0 +DataContentViewerString.toolTip=\u30d5\u30a1\u30a4\u30eb\u304b\u3089\u62bd\u51fa\u3055\u308c\u305fASCII\u304a\u3088\u3073\u30e6\u30cb\u30b3\u30fc\u30c9\u306e\u30b9\u30c8\u30ea\u30f3\u30b0\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002 +DataResultPanel.dummyNodeDisplayName=\u3057\u3070\u3089\u304f\u304a\u5f85\u3061\u304f\u3060\u3055\u3044\u2026 +DataResultViewerTable.firstColLbl=\u540d\u524d +DataResultViewerTable.illegalArgExc.noChildFromParent=\u6307\u5b9a\u3055\u308c\u305f\u30da\u30a2\u30ec\u30f3\u30c8\u304b\u3089\u30c1\u30e3\u30a4\u30eb\u30c9\u30ce\u30fc\u30c9\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +DataResultViewerTable.illegalArgExc.childWithoutPropertySet=\u30c1\u30e3\u30a4\u30eb\u30c9\u30ce\u30fc\u30c9\u306f\u901a\u5e38\u306ePropertySet\u3092\u6301\u3063\u3066\u3044\u307e\u305b\u3093\u3002 +DataResultViewerTable.title=\u30c6\u30fc\u30d6\u30eb +DataResultViewerTable.dummyNodeDisplayName=\u3057\u3070\u3089\u304f\u304a\u5f85\u3061\u304f\u3060\u3055\u3044\u2026 +DataResultViewerThumbnail.title=\u30b5\u30e0\u30cd\u30a4\u30eb +DataResultViewerThumbnail.goToPageTextField.msgDlg=\uff11\u304b\u3089{0}\u306e\u9593\u306e\u6709\u52b9\u306a\u30da\u30fc\u30b8\u6570\u3092\u5165\u529b\u3057\u3066\u4e0b\u3055\u3044 +DataResultViewerThumbnail.goToPageTextField.err=\u7121\u52b9\u306a\u30da\u30fc\u30b8\u6570 +DataResultViewerThumbnail.genThumbs=\u30b5\u30e0\u30cd\u30a4\u30eb\u3092\u4f5c\u6210\u4e2d\u2026 +DataResultViewerThumbnail.pageNumbers.curOfTotal={0}\uff0f{1}\u3064\u76ee +FXVideoPanel.mediaPane.infoLabel=\u524a\u9664\u3055\u308c\u305f\u30d3\u30c7\u30aa\u306e\u518d\u751f\u306f\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\u5916\u90e8\u30d7\u30ec\u30fc\u30e4\u30fc\u3092\u4f7f\u7528\u3057\u3066\u4e0b\u3055\u3044\u3002 +FXVideoPanel.progress.bufferingFile={0}\u3092\u30d0\u30c3\u30d5\u30a1\u30ea\u30f3\u30b0 +FXVideoPanel.progressLabel.buffering=\u30d0\u30c3\u30d5\u30a1\u30ea\u30f3\u30b0\u4e2d\u2026 +FXVideoPanel.media.unsupportedFormat=\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u306a\u3044\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u3067\u3059\u3002 +GeneralOptionsPanelController.moduleErr=\u30e2\u30b8\u30e5\u30fc\u30eb\u30a8\u30e9\u30fc +GeneralOptionsPanelController.moduleErr.msg=GeneralOptionsPanelController\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u3092\u78ba\u8a8d\u4e2d\u306b\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u30a8\u30e9\u30fc\u3092\u8d77\u3053\u3057\u307e\u3057\u305f\u3002\u3069\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u304b\u30ed\u30b0\u3067\u78ba\u8a8d\u3057\u3066\u4e0b\u3055\u3044\u3002\u4e00\u90e8\u306e\u30c7\u30fc\u30bf\u304c\u4e0d\u5b8c\u5168\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002 +GstVideoPanel.cannotProcFile.err=\u30e1\u30c7\u30a4\u30a2\u30d7\u30ec\u30fc\u30e4\u30fc\u304c\u3053\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u51e6\u7406\u3067\u304d\u307e\u305b\u3093\u3002 +GstVideoPanel.initGst.gstException.msg=\u30aa\u30fc\u30c7\u30a3\u30aa\uff0f\u30d3\u30c7\u30aa\u306e\u518d\u751f\u304a\u3088\u3073\u30d5\u30ec\u30fc\u30e0\u306e\u62bd\u51fa\u306b\u4f7f\u7528\u3059\u308bGStreamer\u306e\u521d\u671f\u5316\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002\u30d3\u30c7\u30aa\u304a\u3088\u3073\u30aa\u30fc\u30c7\u30a3\u30aa\u518d\u751f\u304c\u7121\u52b9\u5316\u3055\u308c\u307e\u3059\u3002 +GstVideoPanel.initGst.otherException.msg=\u30aa\u30fc\u30c7\u30a3\u30aa\uff0f\u30d3\u30c7\u30aa\u306e\u518d\u751f\u304a\u3088\u3073\u30d5\u30ec\u30fc\u30e0\u306e\u62bd\u51fa\u306b\u4f7f\u7528\u3059\u308bGStreamer\u306e\u521d\u671f\u5316\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002\u30d3\u30c7\u30aa\u304a\u3088\u3073\u30aa\u30fc\u30c7\u30a3\u30aa\u518d\u751f\u304c\u7121\u52b9\u5316\u3055\u308c\u307e\u3059\u3002 +GstVideoPanel.setupVideo.infoLabel.text=\u524a\u9664\u3055\u308c\u305f\u30d3\u30c7\u30aa\u306e\u518d\u751f\u306f\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\u5916\u90e8\u30d7\u30ec\u30fc\u30e4\u30fc\u3092\u4f7f\u7528\u3057\u3066\u4e0b\u3055\u3044\u3002 +GstVideoPanel.exception.problemFile.msg=\u30d5\u30a1\u30a4\u30eb({0})\u304b\u3089\u306f\u30d5\u30ec\u30fc\u30e0\u3092\u62bd\u51fa\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +GstVideoPanel.exception.problemPlay.msg=\u30d3\u30c7\u30aa\u30d5\u30a1\u30a4\u30eb\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002\u9577\u3055\u3092\u78ba\u8a8d\u4e2d\u306b\u518d\u751f\u3092\u3057\u3088\u3046\u3068\u3057\u305f\u969b\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 +LBL_Description=
\n \u88fd\u54c1\u30d0\u30fc\u30b8\u30e7\u30f3\uff1a {0} ({9})
Sleuth Kit\u30d0\u30fc\u30b8\u30e7\u30f3\uff1a {7}
Netbeans RCP\u30d3\u30eb\u30c9\: {8}
Java\: {1}; {2}
\u30b7\u30b9\u30c6\u30e0\uff1a {3}; {4}; {5}
\u30e6\u30fc\u30b6\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u540d {6}
+LBL_Copyright=
Autopsy™\u306fSleuth Kit™\u3084\u305d\u306e\u4ed6\u30c4\u30fc\u30eb\u3092\u57fa\u306b\u3057\u305f\u30c7\u30b8\u30bf\u30eb\u30fb\u30d5\u30a9\u30ec\u30f3\u30b8\u30c3\u30af\u30fb\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u3067\u3059\u3002

Copyright © 2003-2013. \u8a73\u7d30\u306f\u4e0b\u8a18\u3092\u3054\u89a7\u4e0b\u3055\u3044\u3002 http\://www.sleuthkit.org.
+GstVideoPanel.exception.problemPause.msg=\u30d3\u30c7\u30aa\u30d5\u30a1\u30a4\u30eb\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002\u9577\u3055\u3092\u78ba\u8a8d\u4e2d\u306b\u4e00\u6642\u505c\u6b62\u3092\u3057\u3088\u3046\u3068\u3057\u305f\u969b\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 +GstVideoPanel.exception.problemPauseCaptFrame.msg=\u30d3\u30c7\u30aa\u30d5\u30a1\u30a4\u30eb\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002\u30d5\u30ec\u30fc\u30e0\u306e\u62bd\u51fa\u4e2d\u306b\u4e00\u6642\u505c\u6b62\u3092\u3057\u3088\u3046\u3068\u3057\u305f\u969b\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 +GstVideoPanel.exception.problemPlayCaptFrame.msg=\u30d3\u30c7\u30aa\u30d5\u30a1\u30a4\u30eb\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002\u30d5\u30ec\u30fc\u30e0\u306e\u62bd\u51fa\u4e2d\u306b\u518d\u751f\u3057\u3088\u3046\u3068\u3057\u305f\u969b\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 +GstVideoPanel.exception.problemStopCaptFrame.msg=\u30d3\u30c7\u30aa\u30d5\u30a1\u30a4\u30eb\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002\u30d5\u30ec\u30fc\u30e0\u306e\u62bd\u51fa\u4e2d\u306b\u505c\u6b62\u3057\u3088\u3046\u3068\u3057\u305f\u969b\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 +GstVideoPanel.progress.buffering=\u30d0\u30c3\u30d5\u30a1\u30ea\u30f3\u30b0\u4e2d\u2026 +GstVideoPanel.progressLabel.bufferingErr=\u30d5\u30a1\u30a4\u30eb\u306e\u30d0\u30c3\u30d5\u30a1\u30ea\u30f3\u30b0\u30a8\u30e9\u30fc +MediaViewImagePanel.imgFileTooLarge.msg=\u30a4\u30e1\u30fc\u30b8\u30d5\u30a1\u30a4\u30eb\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f\uff08\u5927\u304d\u3059\u304e\u3067\u3059\uff09\uff1a {0} +ProductInformationPanel.verbLoggingEnabled.text=Verbose\u30ed\u30b0\u304c\u6709\u52b9\u3067\u3059 +ProductInformationPanel.propertyUnknown.text=\u4e0d\u660e ProductInformationPanel.getVMValue.text={0} {1} -TableFilterNode.displayName.text=\u540D\u524D +TableFilterNode.displayName.text=\u540d\u524d DataContentViewerHex.ofLabel.text_1=of DataContentViewerString.ofLabel.text_1=of DataContentViewerArtifact.ofLabel.text=of -DataContentViewerString.setDataView.errorNoText=\uFF08\u30AA\u30D5\u30BB\u30C3\u30C8{0}-{1}\u306B\u306F\u30C6\u30AD\u30B9\u30C8\u304C\u3042\u308A\u307E\u305B\u3093\uFF09 -DataResultViewerThumbnail.comboBox.smallThumbnails=\u30B5\u30E0\u30CD\u30A4\u30EB\uFF08\u5C0F\uFF09 -DataResultViewerThumbnail.comboBox.mediumThumbnails=\u30B5\u30E0\u30CD\u30A4\u30EB\uFF08\u4E2D\uFF09 -DataResultViewerThumbnail.comboBox.largeThumbnails=\u30B5\u30E0\u30CD\u30A4\u30EB\uFF08\u5927\uFF09 -DataResultViewerThumbnail.switchPage.done.errMsg=\u30B5\u30E0\u30CD\u30A4\u30EB\u4F5C\u6210\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\uFF1A {0} -FXVideoPanel.pauseButton.infoLabel.playbackErr=\u518D\u751F\u30A8\u30E9\u30FC\u3002 -GstVideoPanel.progress.infoLabel.updateErr=\u30D3\u30C7\u30AA\u30D7\u30ED\u30B0\u30EC\u30B9\u306E\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\uFF1A {0} -GstVideoPanel.ExtractMedia.progress.buffering={0}\u3092\u30D0\u30C3\u30D5\u30A1\u30EA\u30F3\u30B0\u4E2D -AboutWindowPanel.actVerboseLogging.text=Verbose\u30ED\u30B0\u3092\u30A2\u30AF\u30C6\u30A3\u30D9\u30FC\u30C8 -GeneralPanel.jLabel4.text=\u30D5\u30A1\u30A4\u30EB\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u306B\u4F7F\u7528\u3059\u308B\u30B9\u30EC\u30C3\u30C9\u6570\uFF1A \ No newline at end of file +DataContentViewerString.setDataView.errorNoText=\uff08\u30aa\u30d5\u30bb\u30c3\u30c8{0}-{1}\u306b\u306f\u30c6\u30ad\u30b9\u30c8\u304c\u3042\u308a\u307e\u305b\u3093\uff09 +DataResultViewerThumbnail.comboBox.smallThumbnails=\u30b5\u30e0\u30cd\u30a4\u30eb\uff08\u5c0f\uff09 +DataResultViewerThumbnail.comboBox.mediumThumbnails=\u30b5\u30e0\u30cd\u30a4\u30eb\uff08\u4e2d\uff09 +DataResultViewerThumbnail.comboBox.largeThumbnails=\u30b5\u30e0\u30cd\u30a4\u30eb\uff08\u5927\uff09 +DataResultViewerThumbnail.switchPage.done.errMsg=\u30b5\u30e0\u30cd\u30a4\u30eb\u4f5c\u6210\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\uff1a {0} +FXVideoPanel.pauseButton.infoLabel.playbackErr=\u518d\u751f\u30a8\u30e9\u30fc\u3002 +GstVideoPanel.progress.infoLabel.updateErr=\u30d3\u30c7\u30aa\u30d7\u30ed\u30b0\u30ec\u30b9\u306e\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\uff1a {0} +GstVideoPanel.ExtractMedia.progress.buffering={0}\u3092\u30d0\u30c3\u30d5\u30a1\u30ea\u30f3\u30b0\u4e2d +AboutWindowPanel.actVerboseLogging.text=Verbose\u30ed\u30b0\u3092\u30a2\u30af\u30c6\u30a3\u30d9\u30fc\u30c8 +AutopsyOptionsPanel.jLabel4.text=\u30d5\u30a1\u30a4\u30eb\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u306b\u4f7f\u7528\u3059\u308b\u30b9\u30ec\u30c3\u30c9\u6570\uff1a + +AutopsyOptionsPanel.viewsHideKnownCB.text=\u30d3\u30e5\u30fc\u304b\u3089\u9078\u629e\u3057\u3066\u3044\u308b\u5834\u5408 + +AutopsyOptionsPanel.dataSourcesHideKnownCB.text=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u30a8\u30ea\u30a2\uff08\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u968e\u5c64\uff09 + +AutopsyOptionsPanel.jLabel3.text=\u65e2\u77e5\u30d5\u30a1\u30a4\u30eb\uff08NIST NSRL\u5185\u306e\uff09\u3092\u4e0b\u8a18\u306b\u96a0\u3059\uff1a + +AutopsyOptionsPanel.useBestViewerRB.toolTipText=\u4f8b\u3048\u3070\u3001JPEG\u304c\u9078\u629e\u3055\u308c\u305f\u5834\u5408\u306b\u306fHEX\u304b\u3089\u30e1\u30c7\u30a3\u30a2\u306b\u5909\u66f4\u3059\u308b\u3002 + +AutopsyOptionsPanel.useBestViewerRB.text=\u6700\u3082\u5c02\u9580\u7684\u306a\u30d5\u30a1\u30a4\u30eb\u30d3\u30e5\u30fc\u30a2\u306b\u5909\u66f4 + +AutopsyOptionsPanel.useGMTTimeRB.text=GMT\u3092\u4f7f\u7528 + +AutopsyOptionsPanel.useLocalTimeRB.text=\u30ed\u30fc\u30ab\u30eb\u30bf\u30a4\u30e0\u30be\u30fc\u30f3\u3092\u4f7f\u7528 + +AutopsyOptionsPanel.keepCurrentViewerRB.toolTipText=\u4f8b\u3048\u3070\u3001JPEG\u304c\u9078\u629e\u3055\u308c\u305f\u5834\u5408\u306b\u305d\u306e\u307e\u307eHEX\u30d3\u30e5\u30fc\u3092\u4f7f\u7528\u3002 + +AutopsyOptionsPanel.keepCurrentViewerRB.text=\u305d\u306e\u307e\u307e\u540c\u3058\u30d5\u30a1\u30a4\u30eb\u30d3\u30e5\u30fc\u30a2\u3092\u4f7f\u7528 + +AutopsyOptionsPanel.jLabel1.text=\u30d5\u30a1\u30a4\u30eb\u3092\u9078\u629e\u3059\u308b\u5834\u5408\uff1a + +AutopsyOptionsPanel.jLabel2.text=\u30a2\u30a4\u30c6\u30e0\u3092\u8868\u793a\u3059\u308b\u5834\u5408\uff1a diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentPanel.java b/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentPanel.java index f04a485a12..7e5a235c0c 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentPanel.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentPanel.java @@ -1,6 +1,20 @@ /* - * To change this template, choose Tools | Templates - * and open the template in the editor. + * Autopsy Forensic Browser + * + * Copyright 2011-2014 Basis Technology Corp. + * Contact: carrier sleuthkit 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.corecomponents; @@ -10,14 +24,13 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.logging.Level; -import java.util.prefs.Preferences; import javax.swing.JTabbedPane; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import org.openide.nodes.Node; import org.openide.util.Lookup; import org.openide.util.NbBundle; -import org.openide.util.NbPreferences; +import org.sleuthkit.autopsy.core.UserPreferences; import org.sleuthkit.autopsy.corecomponentinterfaces.DataContent; import org.sleuthkit.autopsy.corecomponentinterfaces.DataContentViewer; import org.sleuthkit.autopsy.coreutils.Logger; @@ -34,7 +47,7 @@ import org.sleuthkit.datamodel.TskCoreException; private Node currentNode; private final boolean isMain; private boolean listeningToTabbedPane = false; - + /** * Creates new DataContentPanel panel * The main data content panel can only be created by the data content top component, @@ -162,10 +175,6 @@ import org.sleuthkit.datamodel.TskCoreException; listeningToTabbedPane = true; } - // get the preference for the preferred viewer - Preferences pref = NbPreferences.forModule(GeneralPanel.class); - boolean keepCurrentViewer = pref.getBoolean("keepPreferredViewer", false); //NON-NLS - int currTabIndex = jTabbedPane1.getSelectedIndex(); int totalTabs = jTabbedPane1.getTabCount(); int maxPreferred = 0; @@ -190,8 +199,7 @@ import org.sleuthkit.datamodel.TskCoreException; } // let the user decide if we should stay with the current viewer - int tabIndex = keepCurrentViewer ? currTabIndex : preferredViewerIndex; - + int tabIndex = UserPreferences.keepPreferredContentViewer() ? currTabIndex : preferredViewerIndex; UpdateWrapper dcv = viewers.get(tabIndex); // this is really only needed if no tabs were enabled diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/ContentUtils.java b/Core/src/org/sleuthkit/autopsy/datamodel/ContentUtils.java index 8310d430ed..fd3c00a3a1 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/ContentUtils.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/ContentUtils.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011 Basis Technology Corp. + * Copyright 2011-2014 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -24,13 +24,13 @@ import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.TimeZone; import java.util.logging.Level; -import java.util.prefs.Preferences; - +import java.util.prefs.PreferenceChangeEvent; +import java.util.prefs.PreferenceChangeListener; import org.openide.util.NbBundle; import org.sleuthkit.autopsy.coreutils.Logger; import javax.swing.SwingWorker; import org.netbeans.api.progress.ProgressHandle; -import org.openide.util.NbPreferences; +import org.sleuthkit.autopsy.core.UserPreferences; import org.sleuthkit.datamodel.AbstractFile; import org.sleuthkit.datamodel.Content; import org.sleuthkit.datamodel.ContentVisitor; @@ -50,9 +50,21 @@ import org.sleuthkit.datamodel.VirtualDirectory; public final class ContentUtils { private final static Logger logger = Logger.getLogger(ContentUtils.class.getName()); + private static boolean displayTimesInLocalTime = UserPreferences.displayTimesInLocalTime(); private static final SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z"); private static final SimpleDateFormat dateFormatterISO8601 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); - private static boolean displayInLocalTime; + + static { + UserPreferences.addChangeListener(new PreferenceChangeListener() { + @Override + public void preferenceChange(PreferenceChangeEvent evt) { + if (evt.getKey().equals(UserPreferences.DISPLAY_TIMES_IN_LOCAL_TIME)) { + displayTimesInLocalTime = UserPreferences.displayTimesInLocalTime(); + } + } + }); + } + // don't instantiate private ContentUtils() { throw new AssertionError(); @@ -110,7 +122,7 @@ public final class ContentUtils { public static TimeZone getTimeZone(Content c) { try { - if (!getDisplayInLocalTime()) { + if (!shouldDisplayTimesInLocalTime()) { return TimeZone.getTimeZone("GMT"); } else { @@ -362,18 +374,13 @@ public final class ContentUtils { cntnt.getClass().getSimpleName())); } } - /**sets displayInlocalTime value based on button in GeneralPanel.java + + /** + * Indicates whether or not times should be displayed using local time. * - * @param flag + * @return True or false. */ - public static void setDisplayInLocalTime(boolean flag) { - displayInLocalTime = flag; - } - /** get global timezone setting for displaying time values - * - * @return - */ - public static boolean getDisplayInLocalTime(){ - return displayInLocalTime; + public static boolean shouldDisplayTimesInLocalTime(){ + return displayTimesInLocalTime; } } diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/FileTypeChildren.java b/Core/src/org/sleuthkit/autopsy/datamodel/FileTypeChildren.java index 281e6593eb..463efc547b 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/FileTypeChildren.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/FileTypeChildren.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011 Basis Technology Corp. + * Copyright 2011-2014 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -18,16 +18,14 @@ */ package org.sleuthkit.autopsy.datamodel; -import java.util.ArrayList; import java.util.List; import java.util.logging.Level; - import org.openide.util.NbBundle; import org.sleuthkit.autopsy.coreutils.Logger; import org.openide.nodes.AbstractNode; import org.openide.nodes.ChildFactory; import org.openide.nodes.Node; -import org.sleuthkit.datamodel.AbstractFile; +import org.sleuthkit.autopsy.core.UserPreferences; import org.sleuthkit.datamodel.Content; import org.sleuthkit.datamodel.ContentVisitor; import org.sleuthkit.datamodel.DerivedFile; @@ -40,50 +38,19 @@ import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.datamodel.TskData; /** - * Children factory for a specific file type - does the database query. + * Child node factory for a specific file type - does the database query. */ -class FileTypeChildren extends ChildFactory { - +public class FileTypeChildren extends ChildFactory { + private SleuthkitCase skCase; private FileTypeExtensionFilters.SearchFilterInterface filter; private static final Logger logger = Logger.getLogger(FileTypeChildren.class.getName()); - //private final static int MAX_OBJECTS = 2000; - - public FileTypeChildren(FileTypeExtensionFilters.SearchFilterInterface filter, SleuthkitCase skCase) { + + FileTypeChildren(FileTypeExtensionFilters.SearchFilterInterface filter, SleuthkitCase skCase) { this.filter = filter; this.skCase = skCase; } - @Override - protected boolean createKeys(List list) { - list.addAll(runQuery()); - return true; - } - - private String createQuery(){ - String query = "(dir_type = " + TskData.TSK_FS_NAME_TYPE_ENUM.REG.getValue() + ")" //NON-NLS - + " AND (known IS NULL OR known != " + TskData.FileKnown.KNOWN.getFileKnownValue() + ") AND (0"; //NON-NLS - for(String s : filter.getFilter()){ - query += " OR name LIKE '%" + s + "'"; //NON-NLS - } - query += ')'; -// query += " LIMIT " + MAX_OBJECTS; - return query; - } - - - private List runQuery(){ - List list = new ArrayList<>(); - try { - list = skCase.findAllFilesWhere(createQuery()); - } catch (TskCoreException ex) { - logger.log(Level.SEVERE, "Couldn't get search results", ex); //NON-NLS - } - - return list; - - } - /** * Get children count without actually loading all nodes * @return @@ -96,7 +63,31 @@ class FileTypeChildren extends ChildFactory { return 0; } } - + + @Override + protected boolean createKeys(List list) { + try { + list.addAll(skCase.findAllFilesWhere(createQuery())); + } catch (TskCoreException ex) { + logger.log(Level.SEVERE, "Couldn't get search results", ex); //NON-NLS + } + return true; + } + + private String createQuery(){ + StringBuilder query = new StringBuilder(); + query.append("(dir_type = ").append(TskData.TSK_FS_NAME_TYPE_ENUM.REG.getValue()).append(")"); //NON-NLS + if (UserPreferences.hideKnownFilesInViewsTree()) { + query.append(" AND (known IS NULL OR known != ").append(TskData.FileKnown.KNOWN.getFileKnownValue()).append(")"); //NON-NLS + } + query.append(" AND (0"); + for(String s : filter.getFilter()){ + query.append(" OR name LIKE '%").append(s).append("'"); //NON-NLS + } + query.append(')'); + return query.toString(); + } + @Override protected Node createNodeForKey(Content key) { return key.accept(new ContentVisitor.Default() { diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/KnownFileFilterNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/KnownFileFilterNode.java index 8201fdd73d..5c63206874 100755 --- a/Core/src/org/sleuthkit/autopsy/datamodel/KnownFileFilterNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/KnownFileFilterNode.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2013 Basis Technology Corp. + * Copyright 2013-2014 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -20,11 +20,10 @@ package org.sleuthkit.autopsy.datamodel; import java.util.prefs.PreferenceChangeEvent; import java.util.prefs.PreferenceChangeListener; -import java.util.prefs.Preferences; import org.openide.nodes.FilterNode; import org.openide.nodes.Node; import org.openide.util.NbBundle; -import org.openide.util.NbPreferences; +import org.sleuthkit.autopsy.core.UserPreferences; import org.sleuthkit.datamodel.AbstractFile; import org.sleuthkit.datamodel.TskData; @@ -39,26 +38,28 @@ import org.sleuthkit.datamodel.TskData; */ public class KnownFileFilterNode extends FilterNode { - /** Preference key values. */ - private static final String DS_HIDE_KNOWN = "dataSourcesHideKnown"; // Default false NON-NLS - private static final String VIEWS_HIDE_KNOWN = "viewsHideKnown"; // Default true NON-NLS + private static boolean filterFromDataSources = UserPreferences.hideKnownFilesInDataSourcesTree(); + private static boolean filterFromViews = UserPreferences.hideKnownFilesInViewsTree(); + + static { + UserPreferences.addChangeListener(new PreferenceChangeListener() { + @Override + public void preferenceChange(PreferenceChangeEvent evt) { + switch (evt.getKey()) { + case UserPreferences.HIDE_KNOWN_FILES_IN_DATA_SOURCES_TREE: + filterFromDataSources = UserPreferences.hideKnownFilesInDataSourcesTree(); + break; + case UserPreferences.HIDE_KNOWN_FILES_IN_VIEWS_TREE: + filterFromViews = UserPreferences.hideKnownFilesInViewsTree(); + break; + } + } + }); + } - /** True if Nodes selected from the Views Node should filter Known Files. */ - private static boolean filterFromViews = true; - - /** True if Nodes selected from the DataSources Node should filter Known Files. */ - private static boolean filterFromDataSources = false; - - /** True if a listener has not been added to the preferences. */ - private static boolean addListener = true; - - /** - * Represents the top level category the Node this KnownFileFilterNode wraps - * is a sub-node of. (i.e. Data Sources, Views, Results) - */ public enum SelectionContext { - DATA_SOURCES(NbBundle.getMessage(KnownFileFilterNode.class, "KnownFileFilterNode.selectionContext.dataSources")), // Subnode of DataSources - VIEWS(NbBundle.getMessage(KnownFileFilterNode.class, "KnownFileFilterNode.selectionContext.views")), // Subnode of Views + DATA_SOURCES(NbBundle.getMessage(KnownFileFilterNode.class, "KnownFileFilterNode.selectionContext.dataSources")), + VIEWS(NbBundle.getMessage(KnownFileFilterNode.class, "KnownFileFilterNode.selectionContext.views")), OTHER(""); // Subnode of another node. private final String displayName; @@ -67,13 +68,6 @@ public class KnownFileFilterNode extends FilterNode { this.displayName = displayName; } - /** - * Get the SelectionContext from the display name of a Node that is a - * direct child of the root node. - * - * @param name - * @return - */ public static SelectionContext getContextFromName(String name) { if (name.equals(DATA_SOURCES.getName())) { return DATA_SOURCES; @@ -97,12 +91,7 @@ public class KnownFileFilterNode extends FilterNode { * @param context */ public KnownFileFilterNode(Node arg, SelectionContext context) { - super(arg, new KnownFileFilterChildren(arg, context)); - - if (addListener) { - addPreferenceListener(); - addListener = false; - } + super(arg, new KnownFileFilterChildren(arg, context)); } private KnownFileFilterNode(Node arg, boolean filter) { @@ -127,28 +116,6 @@ public class KnownFileFilterNode extends FilterNode { } } - private void addPreferenceListener() { - Preferences prefs = NbPreferences.root().node("/org/sleuthkit/autopsy/core"); //NON-NLS - // Initialize with values stored in preferences - filterFromViews = prefs.getBoolean(VIEWS_HIDE_KNOWN, filterFromViews); - filterFromDataSources = prefs.getBoolean(DS_HIDE_KNOWN, filterFromDataSources); - - // Add listener - prefs.addPreferenceChangeListener(new PreferenceChangeListener() { - @Override - public void preferenceChange(PreferenceChangeEvent evt) { - switch (evt.getKey()) { - case VIEWS_HIDE_KNOWN: - filterFromViews = evt.getNode().getBoolean(VIEWS_HIDE_KNOWN, filterFromViews); - break; - case DS_HIDE_KNOWN: - filterFromDataSources = evt.getNode().getBoolean(DS_HIDE_KNOWN, filterFromDataSources); - break; - } - } - }); - } - /** * Complementary class to KnownFileFilterNode. * diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java index f7067adf6e..0f61cecf01 100644 --- a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011 Basis Technology Corp. + * Copyright 2011-2014 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -31,6 +31,8 @@ import java.util.Arrays; import java.util.LinkedList; import java.util.List; import java.util.logging.Level; +import java.util.prefs.PreferenceChangeEvent; +import java.util.prefs.PreferenceChangeListener; import org.sleuthkit.autopsy.coreutils.Logger; import javax.swing.Action; import javax.swing.JPanel; @@ -49,6 +51,7 @@ import org.openide.nodes.Node; import org.openide.nodes.NodeNotFoundException; import org.openide.nodes.NodeOp; import org.sleuthkit.autopsy.casemodule.Case; +import org.sleuthkit.autopsy.core.UserPreferences; import org.sleuthkit.autopsy.corecomponentinterfaces.BlackboardResultViewer; import org.sleuthkit.autopsy.corecomponents.DataResultTopComponent; import org.sleuthkit.autopsy.corecomponents.TableFilterNode; @@ -111,25 +114,37 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat setName(NbBundle.getMessage(DirectoryTreeTopComponent.class, "CTL_DirectoryTreeTopComponent")); setToolTipText(NbBundle.getMessage(DirectoryTreeTopComponent.class, "HINT_DirectoryTreeTopComponent")); - setListener(); + subscribeToChangeEvents(); associateLookup(ExplorerUtils.createLookup(em, getActionMap())); this.pcs = new PropertyChangeSupport(this); // set the back & forward list and also disable the back & forward button - this.backList = new LinkedList(); - this.forwardList = new LinkedList(); + this.backList = new LinkedList<>(); + this.forwardList = new LinkedList<>(); backButton.setEnabled(false); forwardButton.setEnabled(false); } /** - * Set the FileBrowserTopComponent as the listener to any property changes - * in the Case.java class + * Make this TopComponent a listener to various change events. */ - private void setListener() { - Case.addPropertyChangeListener(this);// add this class to listen to any changes in the Case.java class + private void subscribeToChangeEvents() { + UserPreferences.addChangeListener(new PreferenceChangeListener() { + @Override + public void preferenceChange(PreferenceChangeEvent evt) { + switch (evt.getKey()) { + case UserPreferences.HIDE_KNOWN_FILES_IN_DATA_SOURCES_TREE: + refreshContentTreeSafe(); + break; + case UserPreferences.HIDE_KNOWN_FILES_IN_VIEWS_TREE: + // RJCTODO: There does not appear to be a way to refresh the Views subtree + break; + } + } + }); + Case.addPropertyChangeListener(this); this.em.addPropertyChangeListener(this); IngestManager.getInstance().addIngestJobEventListener(this); IngestManager.getInstance().addIngestModuleEventListener(this); diff --git a/Core/src/org/sleuthkit/autopsy/timeline/Timeline.java b/Core/src/org/sleuthkit/autopsy/timeline/Timeline.java index 4607f809c5..fe9ad3dd65 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/Timeline.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/Timeline.java @@ -961,7 +961,7 @@ public class Timeline extends CallableSystemAction implements Presenter.Toolbar, //conversion to GMT - if (!ContentUtils.getDisplayInLocalTime()) { + if (!ContentUtils.shouldDisplayTimesInLocalTime()) { calendar.setTimeZone(TimeZone.getTimeZone("GMT")); } else{ From f771ca1634e7ee2b26cd28bdc233db2a9af5ca10 Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Wed, 7 May 2014 10:34:26 -0400 Subject: [PATCH 07/59] Add more change listeners for UserPreferences --- .../autopsy/core/UserPreferences.java | 11 +++++- .../corecomponents/AutopsyOptionsPanel.java | 11 +++--- .../DirectoryTreeTopComponent.java | 2 +- .../autopsy/ingest/IngestManager.java | 35 +++++++++++-------- 4 files changed, 37 insertions(+), 22 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java b/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java index ea2604ba89..abd8056fee 100755 --- a/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java +++ b/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java @@ -33,7 +33,8 @@ public final class UserPreferences { public static final String HIDE_KNOWN_FILES_IN_DATA_SOURCES_TREE = "HideKnownFilesInDataSourcesTree"; //NON-NLS public static final String HIDE_KNOWN_FILES_IN_VIEWS_TREE = "HideKnownFilesInViewsTree"; //NON-NLS public static final String DISPLAY_TIMES_IN_LOCAL_TIME = "DisplayTimesInLocalTime"; //NON-NLS - + public static final String NUMBER_OF_FILE_INGEST_THREADS = "NumberOfFileingestThreads"; //NON-NLS + // Prevent instantiation. private UserPreferences() { } @@ -77,4 +78,12 @@ public final class UserPreferences { public static void setDisplayTimesInLocalTime(boolean value) { preferences.putBoolean(DISPLAY_TIMES_IN_LOCAL_TIME, value); } + + public static int numberOfFileIngestThreads() { + return preferences.getInt(NUMBER_OF_FILE_INGEST_THREADS, 2); + } + + public static void setNumberOfFileIngestThreads(int value) { + preferences.putInt(NUMBER_OF_FILE_INGEST_THREADS, value); + } } diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.java b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.java index ae46e94cce..a39246e34b 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.java @@ -20,10 +20,12 @@ package org.sleuthkit.autopsy.corecomponents; import javax.swing.DefaultComboBoxModel; import org.sleuthkit.autopsy.core.UserPreferences; -import org.sleuthkit.autopsy.ingest.IngestManager; +/** + * Options panel that allow users to set application preferences. + */ final class AutopsyOptionsPanel extends javax.swing.JPanel { - + AutopsyOptionsPanel(AutopsyOptionsPanelController controller) { initComponents(); numberOfFileIngestThreadsComboBox.setModel(new DefaultComboBoxModel<>(new Integer[]{1, 2, 4, 8, 16})); @@ -39,7 +41,7 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel { boolean useLocalTime = UserPreferences.displayTimesInLocalTime(); useLocalTimeRB.setSelected(useLocalTime); useGMTTimeRB.setSelected(!useLocalTime); - numberOfFileIngestThreadsComboBox.setSelectedItem(IngestManager.getNumberOfFileIngestThreads()); + numberOfFileIngestThreadsComboBox.setSelectedItem(UserPreferences.numberOfFileIngestThreads()); } void store() { @@ -47,7 +49,7 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel { UserPreferences.setHideKnownFilesInDataSourcesTree(dataSourcesHideKnownCB.isSelected()); UserPreferences.setHideKnownFilesInViewsTree(viewsHideKnownCB.isSelected()); UserPreferences.setDisplayTimesInLocalTime(useLocalTimeRB.isSelected()); - IngestManager.setNumberOfFileIngestThreads((Integer) numberOfFileIngestThreadsComboBox.getSelectedItem()); + UserPreferences.setNumberOfFileIngestThreads((Integer) numberOfFileIngestThreadsComboBox.getSelectedItem()); } boolean valid() { @@ -161,7 +163,6 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel { .addComponent(numberOfFileIngestThreadsComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) ); }// //GEN-END:initComponents - // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.ButtonGroup buttonGroup1; private javax.swing.ButtonGroup buttonGroup3; diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java index 0f61cecf01..958387337d 100644 --- a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java @@ -139,7 +139,7 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat refreshContentTreeSafe(); break; case UserPreferences.HIDE_KNOWN_FILES_IN_VIEWS_TREE: - // RJCTODO: There does not appear to be a way to refresh the Views subtree + // TODO: Need a way to refresh the Views subtree break; } } diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java index 3b566decd4..6ded7ccf6a 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java @@ -29,16 +29,17 @@ import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.atomic.AtomicLong; import java.util.logging.Level; +import java.util.prefs.PreferenceChangeEvent; +import java.util.prefs.PreferenceChangeListener; import org.openide.util.NbBundle; import org.sleuthkit.autopsy.coreutils.Logger; import org.netbeans.api.progress.ProgressHandle; import org.netbeans.api.progress.ProgressHandleFactory; import org.openide.util.Cancellable; -import org.openide.util.NbPreferences; import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; import org.sleuthkit.datamodel.Content; -import java.util.prefs.Preferences; import javax.swing.JOptionPane; +import org.sleuthkit.autopsy.core.UserPreferences; /** * Manages the execution of ingest jobs. @@ -46,12 +47,10 @@ import javax.swing.JOptionPane; public class IngestManager { private static final int MAX_NUMBER_OF_DATA_SOURCE_INGEST_THREADS = 1; - private static final String NUMBER_OF_FILE_INGEST_THREADS_KEY = "NumberOfFileingestThreads"; //NON-NLS private static final int MIN_NUMBER_OF_FILE_INGEST_THREADS = 1; private static final int MAX_NUMBER_OF_FILE_INGEST_THREADS = 16; private static final int DEFAULT_NUMBER_OF_FILE_INGEST_THREADS = 2; private static final Logger logger = Logger.getLogger(IngestManager.class.getName()); - private static final Preferences userPreferences = NbPreferences.forModule(IngestManager.class); private static final IngestManager instance = new IngestManager(); private final PropertyChangeSupport ingestJobEventPublisher = new PropertyChangeSupport(IngestManager.class); private final PropertyChangeSupport ingestModuleEventPublisher = new PropertyChangeSupport(IngestManager.class); @@ -82,10 +81,23 @@ public class IngestManager { */ private IngestManager() { startDataSourceIngestThread(); - int numberOfFileIngestThreads = getNumberOfFileIngestThreads(); + int numberOfFileIngestThreads = UserPreferences.numberOfFileIngestThreads(); + if ((numberOfFileIngestThreads < MIN_NUMBER_OF_FILE_INGEST_THREADS) || (numberOfFileIngestThreads > MAX_NUMBER_OF_FILE_INGEST_THREADS)) { + numberOfFileIngestThreads = DEFAULT_NUMBER_OF_FILE_INGEST_THREADS; + UserPreferences.setNumberOfFileIngestThreads(numberOfFileIngestThreads); + } for (int i = 0; i < numberOfFileIngestThreads; ++i) { startFileIngestThread(); } + + UserPreferences.addChangeListener(new PreferenceChangeListener() { + @Override + public void preferenceChange(PreferenceChangeEvent evt) { + if (evt.getKey().equals(UserPreferences.NUMBER_OF_FILE_INGEST_THREADS)) { + setNumberOfFileIngestThreads(); + } + } + }); } /** @@ -115,13 +127,6 @@ public class IngestManager { return MAX_NUMBER_OF_FILE_INGEST_THREADS; } - /** - * Gets the number of file ingest threads the ingest manager will use. - */ - public synchronized static int getNumberOfFileIngestThreads() { - return userPreferences.getInt(NUMBER_OF_FILE_INGEST_THREADS_KEY, DEFAULT_NUMBER_OF_FILE_INGEST_THREADS); - } - /** * Changes the number of file ingest threads the ingest manager will use to * no more than MAX_NUMBER_OF_FILE_INGEST_THREADS and no less than @@ -130,12 +135,12 @@ public class IngestManager { * * @param numberOfThreads The desired number of file ingest threads. */ - public synchronized static void setNumberOfFileIngestThreads(int numberOfThreads) { + public synchronized static void setNumberOfFileIngestThreads() { + int numberOfThreads = UserPreferences.numberOfFileIngestThreads(); if ((numberOfThreads < MIN_NUMBER_OF_FILE_INGEST_THREADS) || (numberOfThreads > MAX_NUMBER_OF_FILE_INGEST_THREADS)) { numberOfThreads = DEFAULT_NUMBER_OF_FILE_INGEST_THREADS; + UserPreferences.setNumberOfFileIngestThreads(numberOfThreads); } - userPreferences.putInt(NUMBER_OF_FILE_INGEST_THREADS_KEY, numberOfThreads); - if (instance.fileIngestThreads.size() != numberOfThreads) { if (instance.fileIngestThreads.size() > numberOfThreads) { Long[] threadIds = instance.fileIngestThreads.keySet().toArray(new Long[instance.fileIngestThreads.size()]); From 99acbdc40ebd6ee30b4bad9e3551da952ca421ac Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Wed, 7 May 2014 10:37:11 -0400 Subject: [PATCH 08/59] Fix spelling error in UserPreferences key --- Core/src/org/sleuthkit/autopsy/core/UserPreferences.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java b/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java index abd8056fee..aee3bc5217 100755 --- a/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java +++ b/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java @@ -33,7 +33,7 @@ public final class UserPreferences { public static final String HIDE_KNOWN_FILES_IN_DATA_SOURCES_TREE = "HideKnownFilesInDataSourcesTree"; //NON-NLS public static final String HIDE_KNOWN_FILES_IN_VIEWS_TREE = "HideKnownFilesInViewsTree"; //NON-NLS public static final String DISPLAY_TIMES_IN_LOCAL_TIME = "DisplayTimesInLocalTime"; //NON-NLS - public static final String NUMBER_OF_FILE_INGEST_THREADS = "NumberOfFileingestThreads"; //NON-NLS + public static final String NUMBER_OF_FILE_INGEST_THREADS = "NumberOfFileIngestThreads"; //NON-NLS // Prevent instantiation. private UserPreferences() { From f993d04e4971dff69b9c72abb8ab7b1cf38da53e Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Wed, 7 May 2014 11:05:05 -0400 Subject: [PATCH 09/59] Resolve NetBeans code hints for Logger class --- Core/src/org/sleuthkit/autopsy/coreutils/Logger.java | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/Logger.java b/Core/src/org/sleuthkit/autopsy/coreutils/Logger.java index b1b3e2402d..fe6bad50c2 100644 --- a/Core/src/org/sleuthkit/autopsy/coreutils/Logger.java +++ b/Core/src/org/sleuthkit/autopsy/coreutils/Logger.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2012 Basis Technology Corp. + * Copyright 2012-2014 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -19,9 +19,7 @@ package org.sleuthkit.autopsy.coreutils; import java.io.IOException; -import java.nio.charset.Charset; import java.util.logging.*; -import org.openide.modules.Places; /** * Custom Autopsy logger wrapper over java.util.logging.Logger with default file @@ -125,9 +123,6 @@ public class Logger extends java.util.logging.Logger { addHandler(traces); } - - - /** * Log an action to autopsy_actions.log * @param actionClass class where user triggered action occurs @@ -164,7 +159,7 @@ public class Logger extends java.util.logging.Logger { @Override public void log(Level level, String message, Throwable thrown) { - super.log(level, message + "\nException: " + thrown.toString()); //NON-NLS + super.log(level, "{0}\nException: {1}", new Object[]{message, thrown.toString()}); //NON-NLS removeHandler(normal); super.log(level, message, thrown); addHandler(normal); From 390fa4f911e9db4192810893dd6f1f49858fdfad Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Wed, 7 May 2014 11:06:59 -0400 Subject: [PATCH 10/59] Apply NetBeans IDE formatting to Logger class --- .../sleuthkit/autopsy/coreutils/Logger.java | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/Logger.java b/Core/src/org/sleuthkit/autopsy/coreutils/Logger.java index fe6bad50c2..032994c8cf 100644 --- a/Core/src/org/sleuthkit/autopsy/coreutils/Logger.java +++ b/Core/src/org/sleuthkit/autopsy/coreutils/Logger.java @@ -24,11 +24,12 @@ import java.util.logging.*; /** * Custom Autopsy logger wrapper over java.util.logging.Logger with default file * streams logging to autopsy.log (general high level messages), - * autopsy_traces.log (also including exception traces). - * In development build, those are also redirected to console / messages log. + * autopsy_traces.log (also including exception traces). In development build, + * those are also redirected to console / messages log. + * + * Contains a utility method to log user actions to autopsy_actions.log via + * noteAction() * - * Contains a utility method to log user actions to autopsy_actions.log via noteAction() - * * Use like java.util.logging.Logger API, get a * org.sleuthkit.autopsy.coreutils.Logger handle using factory method * org.sleuthkit.autopsy.coreutils.Logger.getLogger(String name) passing @@ -43,14 +44,11 @@ public class Logger extends java.util.logging.Logger { private static final String LOG_DIR = PlatformUtil.getLogDirectory(); static final int LOG_SIZE = 0; // in bytes, zero is unlimited static final int LOG_FILE_COUNT = 10; - //File Handlers which point to the output logs - private static final FileHandler traces = initTraces(); - private static final FileHandler normal = initNormal(); + private static final FileHandler traces = initTraces(); + private static final FileHandler normal = initNormal(); private static final Handler console = new java.util.logging.ConsoleHandler(); private static final java.util.logging.Logger actionsLogger = initActionsLogger(); - - /** * Main messages log file name */ @@ -59,7 +57,6 @@ public class Logger extends java.util.logging.Logger { * Detailed exception trace log file name */ public static final String tracesLog = "autopsy_traces.log"; //NON-NLS - /** * Action logger file name */ @@ -68,7 +65,7 @@ public class Logger extends java.util.logging.Logger { /** * Static blocks to get around compile errors such as "variable might not * have been initialized - * + * */ // private static FileHandler initTraces() { @@ -94,7 +91,7 @@ public class Logger extends java.util.logging.Logger { throw new RuntimeException("Error initializing normal logger", e); //NON-NLS } } - + private static java.util.logging.Logger initActionsLogger() { try { FileHandler f = new FileHandler(LOG_DIR + actionsLog, LOG_SIZE, LOG_FILE_COUNT); @@ -125,6 +122,7 @@ public class Logger extends java.util.logging.Logger { /** * Log an action to autopsy_actions.log + * * @param actionClass class where user triggered action occurs */ public static void noteAction(Class actionClass) { From 1024099d54ff888bd1c0892854fe4155ba82a83e Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Wed, 7 May 2014 15:39:48 -0400 Subject: [PATCH 11/59] Fix Logger bug --- .../autopsy/casemodule/AddImageAction.java | 2 - .../autopsy/casemodule/CaseCloseAction.java | 16 +- .../autopsy/casemodule/CaseDeleteAction.java | 17 +- .../autopsy/casemodule/CaseNewAction.java | 6 +- .../autopsy/casemodule/CaseOpenAction.java | 6 +- .../casemodule/CasePropertiesAction.java | 4 +- .../casemodule/NewCaseWizardAction.java | 6 +- .../autopsy/casemodule/RecentCases.java | 5 +- .../autopsy/casemodule/RecentItems.java | 5 +- .../corecomponents/AboutWindowAction.java | 5 +- .../sleuthkit/autopsy/coreutils/Logger.java | 169 +++++++----------- .../directorytree/ChangeViewAction.java | 5 +- .../autopsy/directorytree/CollapseAction.java | 5 +- .../ExplorerNodeActionVisitor.java | 15 +- .../directorytree/ExternalViewerAction.java | 5 +- .../directorytree/NewWindowViewAction.java | 4 +- 16 files changed, 90 insertions(+), 185 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageAction.java index f47d094110..363a7f8824 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageAction.java @@ -106,8 +106,6 @@ public final class AddImageAction extends CallableSystemAction implements Presen */ @Override public void actionPerformed(ActionEvent e) { - Logger.noteAction(AddImageAction.class); - if (IngestManager.getInstance().isIngestRunning()) { final String msg = NbBundle.getMessage(this.getClass(), "AddImageAction.ingestConfig.ongoingIngest.msg"); if (JOptionPane.showConfirmDialog(null, msg, diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseCloseAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseCloseAction.java index e19666d209..900a355bf0 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CaseCloseAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseCloseAction.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011 Basis Technology Corp. + * Copyright 2011-2014 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -23,7 +23,16 @@ import java.awt.Component; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.util.logging.Level;; +import java.util.logging.Level;import org.sleuthkit.autopsy.coreutils.Logger; +import javax.swing.Action; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import org.openide.util.HelpCtx; +import org.openide.util.NbBundle; +import org.openide.util.actions.CallableSystemAction; +import org.openide.util.actions.Presenter; +; +import org.sleuthkit.autopsy.coreutils.Logger; import javax.swing.Action; import javax.swing.ImageIcon; import javax.swing.JButton; @@ -40,7 +49,6 @@ import org.openide.util.NbBundle; import org.openide.util.actions.CallableSystemAction; import org.openide.util.actions.Presenter; - /** * The action to close the current Case. This class should be disabled on * creation and it will be enabled on new case creation or case opened. @@ -75,8 +83,6 @@ import org.openide.util.actions.Presenter; */ @Override public void actionPerformed(ActionEvent e) { - Logger.noteAction(this.getClass()); - if (Case.existsCurrentCase() == false) return; diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseDeleteAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseDeleteAction.java index 4b7291971d..cff30efed0 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CaseDeleteAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseDeleteAction.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011 Basis Technology Corp. + * Copyright 2011-2014 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -21,7 +21,7 @@ package org.sleuthkit.autopsy.casemodule; import java.awt.event.ActionEvent; import java.io.File; -import java.util.logging.Level;; +import java.util.logging.Level;import org.sleuthkit.autopsy.coreutils.Logger; import javax.swing.Action; import javax.swing.JOptionPane; import javax.swing.JPanel; @@ -31,6 +31,7 @@ import org.openide.NotifyDescriptor; import org.openide.util.HelpCtx; import org.openide.util.NbBundle; import org.openide.util.actions.CallableSystemAction; +; import org.sleuthkit.autopsy.coreutils.Logger; import javax.swing.Action; import javax.swing.JOptionPane; @@ -38,16 +39,6 @@ import javax.swing.JPanel; import org.openide.DialogDescriptor; import org.openide.DialogDisplayer; import org.openide.NotifyDescriptor; -import org.openide.util.Exceptions; -import org.openide.util.HelpCtx; -import org.openide.util.NbBundle; -import org.openide.util.actions.CallableSystemAction; -import javax.swing.Action; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import org.openide.DialogDescriptor; -import org.openide.DialogDisplayer; -import org.openide.NotifyDescriptor; import org.openide.util.HelpCtx; import org.openide.util.NbBundle; import org.openide.util.actions.CallableSystemAction; @@ -86,8 +77,6 @@ import org.openide.util.actions.CallableSystemAction; */ @Override public void actionPerformed(ActionEvent e) { - Logger.noteAction(this.getClass()); - Case currentCase = Case.getCurrentCase(); File configFile = new File(currentCase.getConfigFilePath()); File caseFolder = new File(configFile.getParent()); diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseNewAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseNewAction.java index 066cd10149..3be5ec7c57 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CaseNewAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseNewAction.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011 Basis Technology Corp. + * Copyright 2011-2014 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -20,10 +20,8 @@ package org.sleuthkit.autopsy.casemodule; import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import org.openide.util.actions.SystemAction; import org.openide.util.lookup.ServiceProvider; -import org.sleuthkit.autopsy.coreutils.Logger; /** * The action to create a new case. This action class is always enabled. @@ -41,8 +39,6 @@ public final class CaseNewAction implements CaseNewActionInterface { */ @Override public void actionPerformed(ActionEvent e) { - Logger.noteAction(this.getClass()); - wizard.performAction(); } } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseOpenAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseOpenAction.java index 5944613d54..8bf7392026 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CaseOpenAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseOpenAction.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011 Basis Technology Corp. + * Copyright 2011-2014 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -27,7 +27,6 @@ import javax.swing.JFileChooser; import javax.swing.JOptionPane; import javax.swing.filechooser.FileFilter; import javax.swing.filechooser.FileNameExtensionFilter; - import org.openide.util.NbBundle; import org.openide.util.lookup.ServiceProvider; import org.sleuthkit.autopsy.coreutils.ModuleSettings; @@ -72,9 +71,6 @@ public final class CaseOpenAction implements ActionListener { */ @Override public void actionPerformed(ActionEvent e) { - Logger.noteAction(this.getClass()); - - int retval = fc.showOpenDialog((Component) e.getSource()); if (retval == JFileChooser.APPROVE_OPTION) { diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesAction.java index 5ef4c42347..a6a9e4f645 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesAction.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011 Basis Technology Corp. + * Copyright 2011-2014 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -58,8 +58,6 @@ import org.sleuthkit.autopsy.coreutils.Logger; */ @Override public void performAction() { - Logger.noteAction(this.getClass()); - try { // create the popUp window for it String title = NbBundle.getMessage(this.getClass(), "CasePropertiesAction.window.title"); diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java index 6fded53a73..6008a0e5be 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011 Basis Technology Corp. + * Copyright 2011-2014 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -21,7 +21,6 @@ package org.sleuthkit.autopsy.casemodule; import java.awt.Component; import java.awt.Dialog; -import java.awt.event.ActionListener; import java.io.File; import java.text.MessageFormat; import java.util.logging.Level; @@ -47,9 +46,6 @@ import org.sleuthkit.autopsy.coreutils.Logger; @Override public void performAction() { - Logger.noteAction(this.getClass()); - - // there's a case open if (Case.existsCurrentCase()) { // show the confirmation first to close the current case and open the "New Case" wizard panel diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/RecentCases.java b/Core/src/org/sleuthkit/autopsy/casemodule/RecentCases.java index 843950d56b..641d7d75eb 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/RecentCases.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/RecentCases.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011 Basis Technology Corp. + * Copyright 2011-2014 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -35,7 +35,6 @@ import org.openide.util.NbBundle; import org.openide.util.actions.CallableSystemAction; import org.openide.util.actions.Presenter; import org.openide.filesystems.FileUtil; -import org.openide.util.Exceptions; import org.sleuthkit.autopsy.coreutils.ModuleSettings; import org.sleuthkit.autopsy.coreutils.Logger; @@ -253,8 +252,6 @@ import org.sleuthkit.autopsy.coreutils.Logger; */ @Override public void actionPerformed(ActionEvent e) { - Logger.noteAction(this.getClass()); - UpdateRecentCases.hasRecentCase = false; recentCases.clear(); diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/RecentItems.java b/Core/src/org/sleuthkit/autopsy/casemodule/RecentItems.java index 59cb40f9fd..f27facd68a 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/RecentItems.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/RecentItems.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011 Basis Technology Corp. + * Copyright 2011-2014 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -26,7 +26,6 @@ import java.io.File; import java.util.logging.Level; import javax.swing.JOptionPane; import javax.swing.JPanel; - import org.openide.util.NbBundle; import org.sleuthkit.autopsy.coreutils.Logger; @@ -53,8 +52,6 @@ class RecentItems implements ActionListener { */ @Override public void actionPerformed(ActionEvent e) { - Logger.noteAction(this.getClass()); - // check if the file exists if(caseName.equals("") || casePath.equals("") || (!new File(casePath).exists())){ // throw an error here diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/AboutWindowAction.java b/Core/src/org/sleuthkit/autopsy/corecomponents/AboutWindowAction.java index 1ecea43720..b580ab7eba 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/AboutWindowAction.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/AboutWindowAction.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011 Basis Technology Corp. + * Copyright 2011-2014 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -23,7 +23,6 @@ import org.openide.util.NbBundle; import org.netbeans.core.actions.AboutAction; import org.openide.DialogDescriptor; import org.openide.DialogDisplayer; -import org.sleuthkit.autopsy.coreutils.Logger; /** * Action to open custom implementation of the "About" window from the Help menu. @@ -32,8 +31,6 @@ import org.sleuthkit.autopsy.coreutils.Logger; @Override public void performAction() { - Logger.noteAction(this.getClass()); - AboutWindowPanel pip = new AboutWindowPanel(); DialogDescriptor descriptor = new DialogDescriptor( pip, diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/Logger.java b/Core/src/org/sleuthkit/autopsy/coreutils/Logger.java index 032994c8cf..1a239cddb5 100644 --- a/Core/src/org/sleuthkit/autopsy/coreutils/Logger.java +++ b/Core/src/org/sleuthkit/autopsy/coreutils/Logger.java @@ -22,151 +22,104 @@ import java.io.IOException; import java.util.logging.*; /** - * Custom Autopsy logger wrapper over java.util.logging.Logger with default file - * streams logging to autopsy.log (general high level messages), - * autopsy_traces.log (also including exception traces). In development build, - * those are also redirected to console / messages log. - * - * Contains a utility method to log user actions to autopsy_actions.log via - * noteAction() - * - * Use like java.util.logging.Logger API, get a - * org.sleuthkit.autopsy.coreutils.Logger handle using factory method - * org.sleuthkit.autopsy.coreutils.Logger.getLogger(String name) passing - * component/module/class name. - * - * If logging behavior is to be customized, you can add or remove handlers or - * filters from the provided Logger object. + * Autopsy specialization of the Java Logger class with custom file handlers. */ -public class Logger extends java.util.logging.Logger { +public final class Logger extends java.util.logging.Logger { private static final String LOG_ENCODING = PlatformUtil.getLogFileEncoding(); private static final String LOG_DIR = PlatformUtil.getLogDirectory(); - static final int LOG_SIZE = 0; // in bytes, zero is unlimited - static final int LOG_FILE_COUNT = 10; - //File Handlers which point to the output logs - private static final FileHandler traces = initTraces(); - private static final FileHandler normal = initNormal(); + private static final int LOG_SIZE = 0; // In bytes, zero is unlimited + private static final int LOG_FILE_COUNT = 10; + private static final String LOG_WITHOUT_STACK_TRACES = "autopsy.log"; //NON-NLS + private static final String LOG_WITH_STACK_TRACES = "autopsy_traces.log"; //NON-NLS + private static final FileHandler userFriendlyLogFile = createFileHandler(LOG_WITHOUT_STACK_TRACES); + private static final FileHandler developersLogFile = createFileHandler(LOG_WITH_STACK_TRACES); private static final Handler console = new java.util.logging.ConsoleHandler(); - private static final java.util.logging.Logger actionsLogger = initActionsLogger(); - /** - * Main messages log file name - */ - public static final String messagesLog = "autopsy.log"; //NON-NLS - /** - * Detailed exception trace log file name - */ - public static final String tracesLog = "autopsy_traces.log"; //NON-NLS - /** - * Action logger file name - */ - public static final String actionsLog = "autopsy_actions.log"; //NON-NLS - - /** - * Static blocks to get around compile errors such as "variable might not - * have been initialized - * - */ - // - private static FileHandler initTraces() { + private static FileHandler createFileHandler(String fileName) { try { - - FileHandler f = new FileHandler(LOG_DIR + tracesLog, LOG_SIZE, LOG_FILE_COUNT); + FileHandler f = new FileHandler(LOG_DIR + fileName, LOG_SIZE, LOG_FILE_COUNT); f.setEncoding(LOG_ENCODING); f.setFormatter(new SimpleFormatter()); return f; } catch (IOException e) { - throw new RuntimeException("Error initializing traces logger", e); //NON-NLS + throw new RuntimeException("Error initializing " + fileName + " file handler", e); //NON-NLS } } - private static FileHandler initNormal() { - try { - FileHandler f = new FileHandler(LOG_DIR + messagesLog, LOG_SIZE, LOG_FILE_COUNT); - f.setEncoding(LOG_ENCODING); - f.setFormatter(new SimpleFormatter()); - return f; - } catch (IOException e) { - throw new RuntimeException("Error initializing normal logger", e); //NON-NLS - } - } - - private static java.util.logging.Logger initActionsLogger() { - try { - FileHandler f = new FileHandler(LOG_DIR + actionsLog, LOG_SIZE, LOG_FILE_COUNT); - f.setEncoding(LOG_ENCODING); - f.setFormatter(new SimpleFormatter()); - java.util.logging.Logger _actionsLogger = java.util.logging.Logger.getLogger("Actions"); //NON-NLS - _actionsLogger.setUseParentHandlers(false); - _actionsLogger.addHandler(f); - _actionsLogger.addHandler(console); - return _actionsLogger; - } catch (IOException e) { - throw new RuntimeException("Error initializing actions logger", e); //NON-NLS - } - } - - // - private Logger(java.util.logging.Logger log) { - super(log.getName(), log.getResourceBundleName()); - //do forward to messages, so that IDE window shows them - if (Version.getBuildType() == Version.Type.DEVELOPMENT) { - addHandler(console); - } - setUseParentHandlers(false); //do not forward to parent logger, sharing static handlers anyway - //addHandler(new AutopsyExceptionHandler()); - addHandler(normal); - addHandler(traces); - } - - /** - * Log an action to autopsy_actions.log - * - * @param actionClass class where user triggered action occurs - */ - public static void noteAction(Class actionClass) { - actionsLogger.log(Level.INFO, "Action performed: {0}", actionClass.getName()); //NON-NLS - } - /** * Factory method to retrieve a org.sleuthkit.autopsy.coreutils.Logger - * instance The logger logs by default to autopsy.log and - * autopsy_traces.log. Add/remove handlers if the desired behavior should be - * different. + * instance derived from java.util.logging.Logger. Hides the base class + * factory method. * - * @param name ID for the logger or empty string for a root logger + * @param name A name for the logger. This should be a dot-separated name + * and should normally be based on the package name or class name. * @return org.sleuthkit.autopsy.coreutils.Logger instance */ public static Logger getLogger(String name) { - Logger l = new Logger(java.util.logging.Logger.getLogger(name)); - return l; + return new Logger(java.util.logging.Logger.getLogger(name)); } /** * Factory method to retrieve a org.sleuthkit.autopsy.coreutils.Logger - * instance + * instance derived from java.util.logging.Logger. Hides the base class + * factory method. * - * @param name ID for the logger or empty string for a root logger - * @param resourceBundleName bundle name associated with the logger + * @param name A name for the logger. This should be a dot-separated name + * and should normally be based on the package name or class name. + * @param resourceBundleName - name of ResourceBundle to be used for + * localizing messages for this logger. May be null if none of the messages + * require localization. * @return org.sleuthkit.autopsy.coreutils.Logger instance */ public static Logger getLogger(String name, String resourceBundleName) { - return new Logger(Logger.getLogger(name, resourceBundleName)); + return new Logger(java.util.logging.Logger.getLogger(name)); + } + + private Logger(java.util.logging.Logger log) { + super(log.getName(), log.getResourceBundleName()); + if (Version.getBuildType() == Version.Type.DEVELOPMENT) { + addHandler(console); + } + setUseParentHandlers(false); + addHandler(userFriendlyLogFile); + addHandler(developersLogFile); } @Override public void log(Level level, String message, Throwable thrown) { - super.log(level, "{0}\nException: {1}", new Object[]{message, thrown.toString()}); //NON-NLS - removeHandler(normal); + logUserFriendlyOnly(level, message, thrown); + removeHandler(userFriendlyLogFile); super.log(level, message, thrown); - addHandler(normal); + addHandler(userFriendlyLogFile); } + @Override + public void logp(Level level, String sourceClass, String sourceMethod, String message, Throwable thrown) { + logUserFriendlyOnly(level, message, thrown); + removeHandler(userFriendlyLogFile); + super.logp(level, sourceClass, sourceMethod, message, thrown); + addHandler(userFriendlyLogFile); + } + + @Override + public void logrb(Level level, String sourceClass, String sourceMethod, String bundleName, String message, Throwable thrown) { + logUserFriendlyOnly(level, message, thrown); + removeHandler(userFriendlyLogFile); + super.logrb(level, sourceClass, sourceMethod, bundleName, message, thrown); + addHandler(userFriendlyLogFile); + } + + private void logUserFriendlyOnly(Level level, String message, Throwable thrown) { + removeHandler(developersLogFile); + super.log(level, "{0}\nException: {1}", new Object[]{message, thrown.toString()}); //NON-NLS + addHandler(developersLogFile); + } + @Override public void throwing(String sourceClass, String sourceMethod, Throwable thrown) { - removeHandler(normal); + removeHandler(userFriendlyLogFile); super.throwing(sourceClass, sourceMethod, thrown); - addHandler(normal); + addHandler(userFriendlyLogFile); } } diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/ChangeViewAction.java b/Core/src/org/sleuthkit/autopsy/directorytree/ChangeViewAction.java index 751948690f..59730b9133 100644 --- a/Core/src/org/sleuthkit/autopsy/directorytree/ChangeViewAction.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/ChangeViewAction.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011 Basis Technology Corp. + * Copyright 2011-2014 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -28,7 +28,6 @@ import org.openide.util.actions.Presenter; import org.sleuthkit.autopsy.corecomponents.DataContentTopComponent; import org.sleuthkit.autopsy.corecomponents.DataContentViewerHex; import org.sleuthkit.autopsy.corecomponents.DataContentViewerString; -import org.sleuthkit.autopsy.coreutils.Logger; /** * The actions to change between the "Hex View" and "String View". @@ -57,8 +56,6 @@ import org.sleuthkit.autopsy.coreutils.Logger; */ @Override public void actionPerformed(ActionEvent e) { - Logger.noteAction(this.getClass()); - DataContentTopComponent dctc = DataContentTopComponent.findInstance(); int totalTabs = dctc.getTabPanels().getTabCount(); diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/CollapseAction.java b/Core/src/org/sleuthkit/autopsy/directorytree/CollapseAction.java index 9d27a8a20d..87bad119d2 100644 --- a/Core/src/org/sleuthkit/autopsy/directorytree/CollapseAction.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/CollapseAction.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011 Basis Technology Corp. + * Copyright 2011-2014 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -24,7 +24,6 @@ import org.openide.explorer.ExplorerManager; import org.openide.explorer.view.BeanTreeView; import org.openide.nodes.Children; import org.openide.nodes.Node; -import org.sleuthkit.autopsy.coreutils.Logger; /** * @@ -38,8 +37,6 @@ class CollapseAction extends AbstractAction { @Override public void actionPerformed(ActionEvent e) { - Logger.noteAction(this.getClass()); - ExplorerManager em = DirectoryTreeTopComponent.findInstance().getExplorerManager(); Node[] selectedNode = em.getSelectedNodes(); diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/ExplorerNodeActionVisitor.java b/Core/src/org/sleuthkit/autopsy/directorytree/ExplorerNodeActionVisitor.java index d4bdbc0425..e3ce4831ac 100755 --- a/Core/src/org/sleuthkit/autopsy/directorytree/ExplorerNodeActionVisitor.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/ExplorerNodeActionVisitor.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011 - 2013 Basis Technology Corp. + * Copyright 2011-2014 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -54,7 +54,7 @@ public class ExplorerNodeActionVisitor extends ContentVisitor.Default getActions(Content c) { - List actions = new ArrayList(); + List actions = new ArrayList<>(); actions.addAll(c.accept(instance)); //TODO: fix this @@ -81,7 +81,7 @@ public class ExplorerNodeActionVisitor extends ContentVisitor.Default visit(final Image img) { - List lst = new ArrayList(); + List lst = new ArrayList<>(); lst.add(new ImageDetails( NbBundle.getMessage(this.getClass(), "ExplorerNodeActionVisitor.action.imgDetails.title"), img)); //TODO lst.add(new ExtractAction("Extract Image", img)); @@ -98,7 +98,7 @@ public class ExplorerNodeActionVisitor extends ContentVisitor.Default visit(final Volume vol) { - List lst = new ArrayList(); + List lst = new ArrayList<>(); lst.add(new VolumeDetails( NbBundle.getMessage(this.getClass(), "ExplorerNodeActionVisitor.action.volumeDetails.title"), vol)); lst.add(new ExtractUnallocAction( @@ -171,12 +171,9 @@ public class ExplorerNodeActionVisitor extends ContentVisitor.Default sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -29,7 +29,6 @@ import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.datamodel.ContentUtils; - /** * Extracts a File object to a temporary file in the case directory, and then * tries to open it in the user's system with the default associated @@ -70,8 +69,6 @@ public class ExternalViewerAction extends AbstractAction { @Override public void actionPerformed(ActionEvent e) { - Logger.noteAction(this.getClass()); - // Get the temp folder path of the case String tempPath = Case.getCurrentCase().getTempDirectory(); tempPath = tempPath + File.separator + this.fileObject.getName(); diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/NewWindowViewAction.java b/Core/src/org/sleuthkit/autopsy/directorytree/NewWindowViewAction.java index 8a76e0a5e7..6bbcfb781a 100644 --- a/Core/src/org/sleuthkit/autopsy/directorytree/NewWindowViewAction.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/NewWindowViewAction.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011 Basis Technology Corp. + * Copyright 2011-2014 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -47,8 +47,6 @@ public class NewWindowViewAction extends AbstractAction{ @Override public void actionPerformed(ActionEvent e) { - Logger.noteAction(this.getClass()); - String name = "DataContent"; //NON-NLS String s = contentNode.getLookup().lookup(String.class); if (s != null) { From f8419c56e5b72eb720eff3337d009894aec90626 Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Wed, 7 May 2014 16:09:58 -0400 Subject: [PATCH 12/59] Add non-validating load doc method to XSDUtil --- .../sleuthkit/autopsy/coreutils/XMLUtil.java | 153 +++++++++--------- .../ingest/IngestPipelinesConfiguration.java | 2 +- .../fileextmismatch/FileExtMismatchXML.java | 4 +- .../autopsy/hashdatabase/HashDbManager.java | 2 +- .../keywordsearch/KeywordSearchListsXML.java | 2 +- 5 files changed, 84 insertions(+), 79 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/XMLUtil.java b/Core/src/org/sleuthkit/autopsy/coreutils/XMLUtil.java index 5b87e0ce42..3d95d8e529 100644 --- a/Core/src/org/sleuthkit/autopsy/coreutils/XMLUtil.java +++ b/Core/src/org/sleuthkit/autopsy/coreutils/XMLUtil.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2012 Basis Technology Corp. + * Copyright 2012-2014 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -45,114 +45,120 @@ import javax.xml.validation.Validator; import org.w3c.dom.Document; import org.xml.sax.SAXException; -/** +/** * XML Utilities - * + * * This class provides basic utilities for working with XML files, such as - * -Validating XML files against a given schema - * -Saving documents to disk - * -Loading documents from disk - * + * -Validating XML files against a given schema -Saving documents to disk + * -Loading documents from disk */ - public class XMLUtil { + /** * Utility to validate XML files against pre-defined schema files. - * - * The schema files are extracted automatically when this function is called, the XML being validated is not. - * Be sure the XML file is already extracted otherwise it will return false. + * + * The schema files are extracted automatically when this function is + * called, the XML being validated is not. Be sure the XML file is already + * extracted otherwise it will return false. + * * @param xmlfile The XML file to validate, in DOMSource format * @param clazz class frm package to extract schema file from - * @param schemaFile The file name of the schema to validate against, must exist as a resource in the same package as where this function is being called. - * - * For example usages, please see KeywordSearchListsXML, HashDbXML, or IngestModuleLoader. - * + * @param schemaFile The file name of the schema to validate against, must + * exist as a resource in the same package as where this function is being + * called. + * + * For example usages, please see KeywordSearchListsXML, HashDbXML, or + * IngestModuleLoader. + * */ public static boolean xmlIsValid(DOMSource xmlfile, Class clazz, String schemaFile) { - try{ - PlatformUtil.extractResourceToUserConfigDir(clazz, schemaFile, false); - File schemaLoc = new File(PlatformUtil.getUserConfigDirectory() + File.separator + schemaFile); - SchemaFactory schm = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); - try{ - Schema schema = schm.newSchema(schemaLoc); - Validator validator = schema.newValidator(); - DOMResult result = new DOMResult(); - validator.validate(xmlfile, result); - return true; - } - catch(SAXException e){ - Logger.getLogger(clazz.getName()).log(Level.WARNING, "Unable to validate XML file.", e); //NON-NLS - return false; - } - } - catch(IOException e){ - Logger.getLogger(clazz.getName()).log(Level.WARNING, "Unable to load XML file [" + xmlfile.toString() + "] of type ["+schemaFile+"]", e); //NON-NLS + try { + PlatformUtil.extractResourceToUserConfigDir(clazz, schemaFile, false); + File schemaLoc = new File(PlatformUtil.getUserConfigDirectory() + File.separator + schemaFile); + SchemaFactory schm = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); + try { + Schema schema = schm.newSchema(schemaLoc); + Validator validator = schema.newValidator(); + DOMResult result = new DOMResult(); + validator.validate(xmlfile, result); + return true; + } catch (SAXException e) { + Logger.getLogger(clazz.getName()).log(Level.WARNING, "Unable to validate XML file.", e); //NON-NLS + return false; + } + } catch (IOException e) { + Logger.getLogger(clazz.getName()).log(Level.WARNING, "Unable to load XML file [" + xmlfile.toString() + "] of type [" + schemaFile + "]", e); //NON-NLS return false; } } - + /** * Evaluates XML files against an XSD. - * - * The schema files are extracted automatically when this function is called, the XML being validated is not. - * Be sure the XML file is already extracted otherwise it will return false. + * + * The schema files are extracted automatically when this function is + * called, the XML being validated is not. Be sure the XML file is already + * extracted otherwise it will return false. + * * @param doc The XML DOM to validate * @param clazz class from package to extract schema from - * @param type The file name of the schema to validate against, must exist as a resource in the same package as where this function is being called - * - * For example usages, please see KeywordSearchListsXML, HashDbXML, or IngestModuleLoader. - * + * @param type The file name of the schema to validate against, must exist + * as a resource in the same package as where this function is being called + * + * For example usages, please see KeywordSearchListsXML, HashDbXML, or + * IngestModuleLoader. + * */ - public static boolean xmlIsValid(Document doc, Class clazz, String type){ - DOMSource dms = new DOMSource(doc); - return xmlIsValid(dms, clazz, type); + public static boolean xmlIsValid(Document doc, Class clazz, String type) { + DOMSource dms = new DOMSource(doc); + return xmlIsValid(dms, clazz, type); } - - - - /** + + /** * Loads XML files from disk - * + * * @param clazz the class this method is invoked from * @param xmlPath the full path to the file to load - * @param xsdPath the full path to the file to validate against - * */ - public static Document loadDoc(Class clazz, String xmlPath, String xsdPath) { - DocumentBuilderFactory builderFactory = - DocumentBuilderFactory.newInstance(); + public static Document loadDoc(Class clazz, String xmlPath) { + DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); Document ret = null; - try { DocumentBuilder builder = builderFactory.newDocumentBuilder(); - ret = builder.parse( - new FileInputStream(xmlPath)); + ret = builder.parse(new FileInputStream(xmlPath)); } catch (ParserConfigurationException e) { Logger.getLogger(clazz.getName()).log(Level.SEVERE, "Error loading XML file: can't initialize parser.", e); //NON-NLS - } catch (SAXException e) { Logger.getLogger(clazz.getName()).log(Level.SEVERE, "Error loading XML file: can't parse XML.", e); //NON-NLS - } catch (IOException e) { //error reading file Logger.getLogger(clazz.getName()).log(Level.SEVERE, "Error loading XML file: can't read file.", e); //NON-NLS - } - if (!XMLUtil.xmlIsValid(ret, clazz, xsdPath)) { - Logger.getLogger(clazz.getName()).log(Level.SEVERE, "Error loading XML file: could not validate against [" + xsdPath + "], results may not be accurate"); //NON-NLS - } - return ret; } - - /** + + /** + * Loads XML files from disk + * + * @param clazz the class this method is invoked from + * @param xmlPath the full path to the file to load + * @param xsdPath the full path to the file to validate against + */ + public static Document loadDoc(Class clazz, String xmlPath, String xsdPath) { + DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); + Document ret = loadDoc(clazz, xmlPath); + if (!XMLUtil.xmlIsValid(ret, clazz, xsdPath)) { + Logger.getLogger(clazz.getName()).log(Level.WARNING, "Error loading XML file: could not validate against [{0}], results may not be accurate", xsdPath); //NON-NLS + } + return ret; + } + + /** * Saves XML files to disk - * + * * @param clazz the class this method is invoked from * @param xmlPath the full path to save the XML to * @param encoding to encoding, such as "UTF-8", to encode the file with * @param doc the document to save - * */ public static boolean saveDoc(Class clazz, String xmlPath, String encoding, final Document doc) { TransformerFactory xf = TransformerFactory.newInstance(); @@ -166,11 +172,11 @@ public class XMLUtil { xformer.setOutputProperty(OutputKeys.STANDALONE, "yes"); //NON-NLS xformer.setOutputProperty(OutputKeys.VERSION, "1.0"); File file = new File(xmlPath); - FileOutputStream stream = new FileOutputStream(file); - Result out = new StreamResult(new OutputStreamWriter(stream, encoding)); - xformer.transform(new DOMSource(doc), out); - stream.flush(); - stream.close(); + try (FileOutputStream stream = new FileOutputStream(file)) { + Result out = new StreamResult(new OutputStreamWriter(stream, encoding)); + xformer.transform(new DOMSource(doc), out); + stream.flush(); + } success = true; } catch (UnsupportedEncodingException e) { @@ -186,5 +192,4 @@ public class XMLUtil { } return success; } - } diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestPipelinesConfiguration.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestPipelinesConfiguration.java index 5e9a7dce4c..d829a7e300 100755 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestPipelinesConfiguration.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestPipelinesConfiguration.java @@ -89,7 +89,7 @@ final class IngestPipelinesConfiguration { PlatformUtil.extractResourceToUserConfigDir(IngestPipelinesConfiguration.class, PIPELINES_CONFIG_FILE, overWrite); String configFilePath = PlatformUtil.getUserConfigDirectory() + File.separator + PIPELINES_CONFIG_FILE; - Document doc = XMLUtil.loadDoc(IngestPipelinesConfiguration.class, configFilePath, PIPELINES_CONFIG_FILE_XSD); + Document doc = XMLUtil.loadDoc(IngestPipelinesConfiguration.class, configFilePath); if (doc == null) { return; } diff --git a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchXML.java b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchXML.java index 558e78990f..1a955a1872 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchXML.java +++ b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchXML.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011 - 2013 Basis Technology Corp. + * Copyright 2011-2014 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -89,7 +89,7 @@ class FileExtMismatchXML { try { - final Document doc = XMLUtil.loadDoc(FileExtMismatchXML.class, filePath, XSDFILE); + final Document doc = XMLUtil.loadDoc(FileExtMismatchXML.class, filePath); if (doc == null) { return null; } diff --git a/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashDbManager.java b/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashDbManager.java index 19250cd4a3..7aa31414be 100755 --- a/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashDbManager.java +++ b/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashDbManager.java @@ -554,7 +554,7 @@ public class HashDbManager implements PropertyChangeListener { boolean updatedSchema = false; // Open the XML document that implements the configuration file. - final Document doc = XMLUtil.loadDoc(HashDbManager.class, configFilePath, XSD_FILE_NAME); + final Document doc = XMLUtil.loadDoc(HashDbManager.class, configFilePath); if (doc == null) { return false; } diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchListsXML.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchListsXML.java index 42e3650270..3be121acaa 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchListsXML.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchListsXML.java @@ -147,7 +147,7 @@ final class KeywordSearchListsXML extends KeywordSearchListsAbstract { */ @Override public boolean load() { - final Document doc = XMLUtil.loadDoc(KeywordSearchListsXML.class, filePath, XSDFILE); + final Document doc = XMLUtil.loadDoc(KeywordSearchListsXML.class, filePath); if (doc == null) { return false; } From 19a40c9afbc01a073a41fa1450edd3aa5990673e Mon Sep 17 00:00:00 2001 From: Nick Davis Date: Wed, 7 May 2014 18:58:06 -0400 Subject: [PATCH 13/59] Marked string as NON-NLS --- Core/src/org/sleuthkit/autopsy/datamodel/FileTypeChildren.java | 2 +- c:casesSamll2Againautopsy.db | 0 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100755 c:casesSamll2Againautopsy.db diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/FileTypeChildren.java b/Core/src/org/sleuthkit/autopsy/datamodel/FileTypeChildren.java index 463efc547b..29c1306a23 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/FileTypeChildren.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/FileTypeChildren.java @@ -80,7 +80,7 @@ public class FileTypeChildren extends ChildFactory { if (UserPreferences.hideKnownFilesInViewsTree()) { query.append(" AND (known IS NULL OR known != ").append(TskData.FileKnown.KNOWN.getFileKnownValue()).append(")"); //NON-NLS } - query.append(" AND (0"); + query.append(" AND (0"); //NON-NLS for(String s : filter.getFilter()){ query.append(" OR name LIKE '%").append(s).append("'"); //NON-NLS } diff --git a/c:casesSamll2Againautopsy.db b/c:casesSamll2Againautopsy.db deleted file mode 100755 index e69de29bb2..0000000000 From a0fa5f374d14221f255aa644b0b3078f3fd0be44 Mon Sep 17 00:00:00 2001 From: Nick Davis Date: Wed, 7 May 2014 19:43:09 -0400 Subject: [PATCH 14/59] Localized some strings. Marked some strings as NON-NLS --- .../autopsy/ingest/Bundle.properties | 6 ++++ .../sleuthkit/autopsy/ingest/IngestJob.java | 2 +- .../autopsy/ingest/IngestJobConfigurator.java | 29 ++++++++++++++----- .../autopsy/ingest/IngestManager.java | 2 +- .../autopsy/ingest/IngestScheduler.java | 2 +- c:casesSamll2Againautopsy.db | 0 6 files changed, 30 insertions(+), 11 deletions(-) delete mode 100755 c:casesSamll2Againautopsy.db diff --git a/Core/src/org/sleuthkit/autopsy/ingest/Bundle.properties b/Core/src/org/sleuthkit/autopsy/ingest/Bundle.properties index 253f4f390d..c8ed06243a 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/ingest/Bundle.properties @@ -66,3 +66,9 @@ IngestManager.StartIngestJobsTask.run.startupErr.dlgErrorList=Errors\: \ \ {0} IngestManager.StartIngestJobsTask.run.startupErr.dlgTitle=Ingest Failure +IngestJobConfigurator.createModuleSettingsFolderForContext.exception.msg=Failed to create ingest module settings folder, cannot save settings. +IngestJobConfigurator.createModuleSettingsFolderForContext.exception.title=Ingest Job Initialization Failure +IngestJobConfigurator.loadJobSettings.usermsg.text=Failed to load saved ingest job settings for {0} module, using defaults. +IngestJobConfigurator.loadJobSettings.usermsg.title=Ingest Job Settings +IngestJobConfigurator.saveJobSettings.usermsg=Failed to save ingest job settings for {0} module. +IngestJobConfigurator.saveJobSettings.usermsg.title=Ingest Job Settings diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestJob.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestJob.java index 22d32b3638..a98da052ee 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestJob.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestJob.java @@ -198,7 +198,7 @@ final class IngestJob { private void logIngestModuleErrors(List errors) { for (IngestModuleError error : errors) { - logger.log(Level.SEVERE, error.getModuleDisplayName() + " experienced an error", error.getModuleError()); + logger.log(Level.SEVERE, error.getModuleDisplayName() + " experienced an error", error.getModuleError()); //NON-NLS } } diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestJobConfigurator.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestJobConfigurator.java index 519df49999..1ef6582af0 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestJobConfigurator.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestJobConfigurator.java @@ -29,6 +29,8 @@ import java.util.List; import java.util.logging.Level; import javax.swing.JOptionPane; import javax.swing.JPanel; + +import org.openide.util.NbBundle; import org.openide.util.io.NbObjectInputStream; import org.openide.util.io.NbObjectOutputStream; import org.sleuthkit.autopsy.coreutils.Logger; @@ -145,8 +147,13 @@ public final class IngestJobConfigurator { } moduleSettingsFolderForContext = folder.getAbsolutePath(); } catch (Exception ex) { - logger.log(Level.SEVERE, "Failed to create ingest module settings directory", ex); - JOptionPane.showMessageDialog(null, "Failed to create ingest module settings folder, cannot save settings.", "Ingest Job Initialization Failure", JOptionPane.ERROR_MESSAGE); + logger.log(Level.SEVERE, "Failed to create ingest module settings directory", ex); //NON-NLS + JOptionPane.showMessageDialog(null, + NbBundle.getMessage(this.getClass(), + "IngestJobConfigurator.createModuleSettingsFolderForContext.exception.msg"), + NbBundle.getMessage(this.getClass(), + "IngestJobConfigurator.createModuleSettingsFolderForContext.exception.title"), + JOptionPane.ERROR_MESSAGE); } } @@ -189,10 +196,13 @@ public final class IngestJobConfigurator { try (NbObjectInputStream in = new NbObjectInputStream(new FileInputStream(settingsFile.getAbsolutePath()))) { settings = (IngestModuleIngestJobSettings) in.readObject(); } catch (IOException | ClassNotFoundException ex) { - String logMessage = String.format("Error loading ingest job settings for %s module for %s context, using defaults", factory.getModuleDisplayName(), launcherContext); + String logMessage = String.format("Error loading ingest job settings for %s module for %s context, using defaults", factory.getModuleDisplayName(), launcherContext); //NON-NLS logger.log(Level.SEVERE, logMessage, ex); - String userMessage = String.format("Failed to load saved ingest job settings for %s module, using defaults.", factory.getModuleDisplayName()); - JOptionPane.showMessageDialog(null, userMessage, "Ingest Job Settings", JOptionPane.WARNING_MESSAGE); + String userMessage = NbBundle.getMessage(this.getClass(), "IngestJobConfigurator.loadJobSettings.usermsg.text", factory.getModuleDisplayName()); + JOptionPane.showMessageDialog(null, userMessage, + NbBundle.getMessage(this.getClass(), + "IngestJobConfigurator.loadJobSettings.usermsg.title"), + JOptionPane.WARNING_MESSAGE); } } if (settings == null) { @@ -207,10 +217,13 @@ public final class IngestJobConfigurator { out.writeObject(settings); } } catch (IOException ex) { - String logMessage = String.format("Error saving ingest job settings for %s module for %s context", factory.getModuleDisplayName(), launcherContext); + String logMessage = String.format("Error saving ingest job settings for %s module for %s context", factory.getModuleDisplayName(), launcherContext); //NON-NLS logger.log(Level.SEVERE, logMessage, ex); - String userMessage = String.format("Failed to save ingest job settings for %s module.", factory.getModuleDisplayName()); - JOptionPane.showMessageDialog(null, userMessage, "Ingest Job Settings", JOptionPane.WARNING_MESSAGE); + String userMessage = NbBundle.getMessage(this.getClass(), "IngestJobConfigurator.saveJobSettings.usermsg", factory.getModuleDisplayName()); + JOptionPane.showMessageDialog(null, userMessage, + NbBundle.getMessage(this.getClass(), + "IngestJobConfigurator.saveJobSettings.usermsg.title"), + JOptionPane.WARNING_MESSAGE); } } diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java index 6ded7ccf6a..cd772728fb 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java @@ -220,7 +220,7 @@ public class IngestManager { } catch (InterruptedException | ExecutionException ex) { // This should never happen, something is awry, but everything // should be o.k. anyway. - logger.log(Level.SEVERE, "Unexpected thread interrupt", ex); + logger.log(Level.SEVERE, "Unexpected thread interrupt", ex); //NON-NLS } } diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestScheduler.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestScheduler.java index 6bad7b6ab7..77c557eb84 100755 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestScheduler.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestScheduler.java @@ -204,7 +204,7 @@ final class IngestScheduler { } } } catch (TskCoreException ex) { - logger.log(Level.SEVERE, "Could not get children of file and update file queues: " + parentFile.getName(), ex); + logger.log(Level.SEVERE, "Could not get children of file and update file queues: " + parentFile.getName(), ex); //NON-NLS } } } diff --git a/c:casesSamll2Againautopsy.db b/c:casesSamll2Againautopsy.db deleted file mode 100755 index e69de29bb2..0000000000 From 30cf8e6fa03cdcb5e7759c8c15c66e095e1f6082 Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Thu, 8 May 2014 11:07:30 -0400 Subject: [PATCH 15/59] Remove inadvertantly controlled file --- c:casesSamll2Againautopsy.db | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 c:casesSamll2Againautopsy.db diff --git a/c:casesSamll2Againautopsy.db b/c:casesSamll2Againautopsy.db deleted file mode 100755 index e69de29bb2..0000000000 From 2708079f82f8a9f780518be681ccd4944182251d Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Thu, 8 May 2014 11:24:26 -0400 Subject: [PATCH 16/59] Convert string buffer from instance to locla variable in AbstractFileStringExtract --- .../keywordsearch/AbstractFileStringExtract.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/AbstractFileStringExtract.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/AbstractFileStringExtract.java index 65ef4c31a1..1f6614ba28 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/AbstractFileStringExtract.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/AbstractFileStringExtract.java @@ -44,12 +44,11 @@ class AbstractFileStringExtract implements AbstractFileExtract { private static final int BOM_LEN = 0; //disabled prepending of BOM private static final Charset INDEX_CHARSET = Server.DEFAULT_INDEXED_TEXT_CHARSET; private static final SCRIPT DEFAULT_SCRIPT = SCRIPT.LATIN_2; - private final byte[] stringChunkBuf = new byte[(int) MAX_STRING_CHUNK_SIZE]; private KeywordSearchIngestModule module; private AbstractFile sourceFile; private int numChunks = 0; - private final List