diff --git a/Ingest/src/org/sleuthkit/autopsy/ingest/IngestManager.java b/Ingest/src/org/sleuthkit/autopsy/ingest/IngestManager.java index 3c5a642cf5..e4db79d22b 100755 --- a/Ingest/src/org/sleuthkit/autopsy/ingest/IngestManager.java +++ b/Ingest/src/org/sleuthkit/autopsy/ingest/IngestManager.java @@ -18,7 +18,6 @@ */ package org.sleuthkit.autopsy.ingest; -import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.text.DateFormat; @@ -46,7 +45,6 @@ import org.netbeans.api.progress.ProgressHandle; import org.netbeans.api.progress.ProgressHandleFactory; import org.openide.util.Cancellable; import org.openide.util.Lookup; -import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.ingest.IngestMessage.MessageType; import org.sleuthkit.datamodel.FsContent; import org.sleuthkit.datamodel.Image; @@ -88,7 +86,7 @@ public class IngestManager { public final static String SERVICE_STOPPED_EVT = IngestManagerEvents.SERVICE_STOPPED.name(); public final static String SERVICE_HAS_DATA_EVT = IngestManagerEvents.SERVICE_HAS_DATA.name(); //ui - private IngestUI ui = IngestTopComponent.getDefault(); + private IngestUI ui = IngestMessageTopComponent.findInstance(); //singleton private static IngestManager instance; @@ -97,14 +95,13 @@ public class IngestManager { } static synchronized IngestManager getDefault() { - logger.log(Level.INFO, "creating manager instance"); if (instance == null) { + logger.log(Level.INFO, "creating manager instance"); instance = new IngestManager(); } return instance; } - /** * Add property change listener to listen to ingest events * @param l PropertyChangeListener to add @@ -129,10 +126,9 @@ public class IngestManager { void execute(final Collection services, final Collection images) { logger.log(Level.INFO, "Will enqueue number of images: " + images.size()); - logger.log(Level.INFO, "Starting enqueue worker"); queueWorker = new EnqueueWorker(services, images); queueWorker.execute(); - + ui.restoreMessages(); //logger.log(Level.INFO, "Queues: " + imageQueue.toString() + " " + fsContentQueue.toString()); } @@ -276,21 +272,34 @@ public class IngestManager { * test if any of image of fscontent ingesters are running * @return true if any service is running, false otherwise */ - synchronized boolean isIngestRunning() { - //enqueue running? + public synchronized boolean isIngestRunning() { + if (isEnqueueRunning()) { + return true; + } else if (isFileIngestRunning()) { + return true; + } else if (isImageIngestRunning()) { + return true; + } else { + return false; + } + + } + + public synchronized boolean isEnqueueRunning() { if (queueWorker != null && !queueWorker.isDone()) { return true; } + return false; + } - //enque not running - - //file ingester running? + public synchronized boolean isFileIngestRunning() { if (fsContentIngester != null && !fsContentIngester.isDone()) { return true; } + return false; + } - //file ingester not running - + public synchronized boolean isImageIngestRunning() { if (imageIngesters.isEmpty()) { return false; } @@ -305,9 +314,9 @@ public class IngestManager { } if (allDone) { return false; + } else { + return true; } - - return true; } /** @@ -351,7 +360,6 @@ public class IngestManager { } SwingUtilities.invokeLater(new Runnable() { - @Override public void run() { ui.displayMessage(message); @@ -487,16 +495,6 @@ public class IngestManager { }); } - private void updateMainProgress(final int progress) { - SwingUtilities.invokeLater(new Runnable() { - - @Override - public void run() { - ui.updateProgress(progress); - } - }); - } - //image worker to remove itself when complete or interrupted void removeImageIngestWorker(IngestImageThread worker) { //remove worker @@ -970,7 +968,6 @@ public class IngestManager { } progress.progress(unit.content.getName(), ++processedFiles); - updateMainProgress(processedFiles); --numFsContents; } logger.log(Level.INFO, "Done background processing"); diff --git a/Ingest/src/org/sleuthkit/autopsy/ingest/IngestMessageTopComponent.form b/Ingest/src/org/sleuthkit/autopsy/ingest/IngestMessageTopComponent.form new file mode 100644 index 0000000000..b8a67a0dd3 --- /dev/null +++ b/Ingest/src/org/sleuthkit/autopsy/ingest/IngestMessageTopComponent.form @@ -0,0 +1,28 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/Ingest/src/org/sleuthkit/autopsy/ingest/IngestMessageTopComponent.java b/Ingest/src/org/sleuthkit/autopsy/ingest/IngestMessageTopComponent.java new file mode 100644 index 0000000000..2692387a8c --- /dev/null +++ b/Ingest/src/org/sleuthkit/autopsy/ingest/IngestMessageTopComponent.java @@ -0,0 +1,272 @@ +/* + * 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.ingest; + +import java.awt.BorderLayout; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.swing.JOptionPane; +import javax.swing.SwingUtilities; +import org.openide.util.ImageUtilities; +import org.openide.util.NbBundle; +import org.openide.windows.Mode; +import org.openide.windows.TopComponent; +import org.openide.windows.WindowManager; +import org.sleuthkit.autopsy.casemodule.Case; +import org.sleuthkit.datamodel.Image; + +/** + * Top component which displays something. + */ +public final class IngestMessageTopComponent extends TopComponent implements IngestUI { + + private static IngestMessageTopComponent instance; + private static final Logger logger = Logger.getLogger(IngestMessageTopComponent.class.getName()); + private IngestMessagePanel messagePanel; + private IngestManager manager; + private static String PREFERRED_ID = "IngestMessageTopComponent"; + + public IngestMessageTopComponent() { + initComponents(); + customizeComponents(); + registerListeners(); + setName(NbBundle.getMessage(IngestMessageTopComponent.class, "CTL_IngestMessageTopComponent")); + setToolTipText(NbBundle.getMessage(IngestMessageTopComponent.class, "HINT_IngestMessageTopComponent")); + //putClientProperty(TopComponent.PROP_CLOSING_DISABLED, Boolean.TRUE); + + } + + private static synchronized IngestMessageTopComponent getDefault() { + if (instance == null) { + instance = new IngestMessageTopComponent(); + } + return instance; + } + + public static synchronized IngestMessageTopComponent findInstance() { + TopComponent win = WindowManager.getDefault().findTopComponent(PREFERRED_ID); + if (win == null) { + return getDefault(); + } + if (win instanceof IngestMessageTopComponent) { + return (IngestMessageTopComponent) win; + } + + return getDefault(); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + // //GEN-BEGIN:initComponents + private void initComponents() { + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 385, Short.MAX_VALUE) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 362, Short.MAX_VALUE) + ); + }// //GEN-END:initComponents + // Variables declaration - do not modify//GEN-BEGIN:variables + // End of variables declaration//GEN-END:variables + + @Override + public void componentOpened() { + logger.log(Level.INFO, "OPENED"); + //create manager instance + if (manager == null) + manager = IngestManager.getDefault(); + } + + @Override + public void componentClosed() { + logger.log(Level.INFO, "CLOSED"); + // TODO add custom code on component closing + // WindowManager.getDefault().findMode("bottomSlidingSide").dockInto(this); + if (manager.isIngestRunning()) { + /* + Mode mode = WindowManager.getDefault().findMode("floatingLeftBottom"); + //Mode mode = WindowManager.getDefault().findMode("bottomSlidingSide"); + if (mode != null) { + mode.dockInto(this); + this.open(); + } + + return; + */ + } + + Mode mode = WindowManager.getDefault().findMode("dockedBottom"); + if (mode != null) { + mode.dockInto(this); + this.open(); + } + + } + + @Override + protected void componentShowing() { + logger.log(Level.INFO, "SHOWING"); + + Mode mode = WindowManager.getDefault().findMode("floatingLeftBottom"); + if (mode != null) { + mode.dockInto(this); + this.open(); + } + } + + @Override + protected void componentHidden() { + logger.log(Level.INFO, "HIDDEN"); + + } + + @Override + protected void componentActivated() { + super.componentActivated(); + } + + @Override + protected void componentDeactivated() { + super.componentDeactivated(); + } + + @Override + public boolean canClose() { + return true; + } + + @Override + public int getPersistenceType() { + return TopComponent.PERSISTENCE_NEVER; + } + + @Override + public java.awt.Image getIcon() { + return ImageUtilities.loadImage( + "org/sleuthkit/autopsy/ingest/ingest-msg-icon.png"); + } + + void writeProperties(java.util.Properties p) { + // better to version settings since initial version as advocated at + // http://wiki.apidesign.org/wiki/PropertyFiles + p.setProperty("version", "1.0"); + // TODO store your settings + } + + void readProperties(java.util.Properties p) { + String version = p.getProperty("version"); + // TODO read your settings according to their version + } + + private void registerListeners() { + //handle case change + Case.addPropertyChangeListener(new PropertyChangeListener() { + + @Override + public void propertyChange(PropertyChangeEvent evt) { + if (evt.getPropertyName().equals(Case.CASE_CURRENT_CASE)) { + Case oldCase = (Case) evt.getOldValue(); + if (oldCase == null) //nothing to do, new case had been opened + { + return; + } + //stop workers if running + IngestManager.getDefault().stopAll(); + //clear inbox + clearMessages(); + } else if (evt.getPropertyName().equals(Case.CASE_ADD_IMAGE)) { + final Image image = (Image) evt.getNewValue(); + SwingUtilities.invokeLater(new Runnable() { + + @Override + public void run() { + displayIngestDialog(image); + } + }); + + } + } + }); + } + + private void customizeComponents() { + //custom GUI setup not done by builder + + messagePanel = new IngestMessagePanel(); + messagePanel.setOpaque(false); + setLayout(new BorderLayout()); + add(messagePanel, BorderLayout.CENTER); + } + + /** + * Display ingest summary report in some dialog + */ + @Override + public void displayReport(String ingestReport) { + JOptionPane.showMessageDialog( + null, + ingestReport, + "File Ingest Summary", + JOptionPane.INFORMATION_MESSAGE); + } + + /** + * Display IngestMessage from service (forwarded by IngestManager) + */ + @Override + public void displayMessage(IngestMessage ingestMessage) { + messagePanel.addMessage(ingestMessage); + } + + @Override + public void initProgress(int maximum) { + } + + @Override + public void updateProgress(int progress) { + } + + @Override + public void clearMessages() { + clearMessages(); + } + + @Override + public void displayIngestDialog(final Image image) { + final IngestDialog ingestDialog = new IngestDialog(); + ingestDialog.setImage(image); + ingestDialog.display(); + + } + + @Override + public void restoreMessages() { + componentShowing(); + } +} diff --git a/Ingest/src/org/sleuthkit/autopsy/ingest/IngestMessageTopComponentWstcref.xml b/Ingest/src/org/sleuthkit/autopsy/ingest/IngestMessageTopComponentWstcref.xml new file mode 100644 index 0000000000..b2b20289fe --- /dev/null +++ b/Ingest/src/org/sleuthkit/autopsy/ingest/IngestMessageTopComponentWstcref.xml @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/Ingest/src/org/sleuthkit/autopsy/ingest/IngestTopComponent.java b/Ingest/src/org/sleuthkit/autopsy/ingest/IngestTopComponent.java index 1bdc53a342..15de3e3e84 100644 --- a/Ingest/src/org/sleuthkit/autopsy/ingest/IngestTopComponent.java +++ b/Ingest/src/org/sleuthkit/autopsy/ingest/IngestTopComponent.java @@ -35,7 +35,7 @@ import org.sleuthkit.datamodel.Image; /** * Top component explorer for the Ingest module. */ -public final class IngestTopComponent extends TopComponent implements DataExplorer, IngestUI { +public final class IngestTopComponent extends TopComponent implements DataExplorer { private static IngestTopComponent instance; private static final Logger logger = Logger.getLogger(IngestTopComponent.class.getName()); @@ -43,8 +43,8 @@ public final class IngestTopComponent extends TopComponent implements DataExplor private IngestTopComponent() { initComponents(); - customizeComponents(); - registerListeners(); + // customizeComponents(); + //registerListeners(); setName(NbBundle.getMessage(IngestTopComponent.class, "CTL_IngestTopComponent")); setToolTipText(NbBundle.getMessage(IngestTopComponent.class, "HINT_IngestTopComponent")); //putClientProperty(TopComponent.PROP_UNDOCKING_DISABLED, Boolean.TRUE); @@ -74,36 +74,6 @@ public final class IngestTopComponent extends TopComponent implements DataExplor return TopComponent.PERSISTENCE_NEVER; } - private void registerListeners() { - //handle case change - Case.addPropertyChangeListener(new PropertyChangeListener() { - - @Override - public void propertyChange(PropertyChangeEvent evt) { - if (evt.getPropertyName().equals(Case.CASE_CURRENT_CASE)) { - Case oldCase = (Case) evt.getOldValue(); - if (oldCase == null) //nothing to do, new case had been opened - { - return; - } - //stop workers if running - IngestManager.getDefault().stopAll(); - //clear inbox - clearMessages(); - } else if (evt.getPropertyName().equals(Case.CASE_ADD_IMAGE)) { - final Image image = (Image) evt.getNewValue(); - SwingUtilities.invokeLater(new Runnable() { - - @Override - public void run() { - displayIngestDialog(image); - } - }); - - } - } - }); - } private void customizeComponents() { //custom GUI setup not done by builder @@ -257,7 +227,7 @@ public final class IngestTopComponent extends TopComponent implements DataExplor @Override public void componentOpened() { logger.log(Level.INFO, "IngestTopComponent opened()"); - IngestManager.getDefault(); //create initial instance + // IngestManager.getDefault(); //create initial instance } @@ -279,46 +249,7 @@ public final class IngestTopComponent extends TopComponent implements DataExplor } - /** - * Display ingest summary report in some dialog - */ - @Override - public void displayReport(String ingestReport) { - JOptionPane.showMessageDialog( - null, - ingestReport, - "File Ingest Summary", - JOptionPane.INFORMATION_MESSAGE); - } + - /** - * Display IngestMessage from service (forwarded by IngestManager) - */ - @Override - public void displayMessage(IngestMessage ingestMessage) { - messagePanel.addMessage(ingestMessage); - } - - @Override - public void initProgress(int maximum) { - this.mainProgressBar.setMaximum(maximum); - } - - @Override - public void updateProgress(int progress) { - this.mainProgressBar.setValue(progress); - } - - @Override - public void clearMessages() { - messagePanel.clearMessages(); - } - - @Override - public void displayIngestDialog(final Image image) { - final IngestDialog ingestDialog = new IngestDialog(); - ingestDialog.setImage(image); - ingestDialog.display(); - - } + } diff --git a/Ingest/src/org/sleuthkit/autopsy/ingest/IngestUI.java b/Ingest/src/org/sleuthkit/autopsy/ingest/IngestUI.java index 5989c0011e..cbc361c23f 100644 --- a/Ingest/src/org/sleuthkit/autopsy/ingest/IngestUI.java +++ b/Ingest/src/org/sleuthkit/autopsy/ingest/IngestUI.java @@ -27,11 +27,10 @@ import org.sleuthkit.datamodel.Image; public interface IngestUI { void displayMessage(final IngestMessage message); void clearMessages(); + void restoreMessages(); void displayIngestDialog(final Image image); void initProgress(final int maximum); void updateProgress(final int progress); void displayReport(final String report); - - } diff --git a/Ingest/src/org/sleuthkit/autopsy/ingest/dockedBottomWsmode.xml b/Ingest/src/org/sleuthkit/autopsy/ingest/dockedBottomWsmode.xml new file mode 100644 index 0000000000..0e663eb73a --- /dev/null +++ b/Ingest/src/org/sleuthkit/autopsy/ingest/dockedBottomWsmode.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Ingest/src/org/sleuthkit/autopsy/ingest/floatingLeftBottomWsmode.xml b/Ingest/src/org/sleuthkit/autopsy/ingest/floatingLeftBottomWsmode.xml new file mode 100644 index 0000000000..4289ff5e16 --- /dev/null +++ b/Ingest/src/org/sleuthkit/autopsy/ingest/floatingLeftBottomWsmode.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Ingest/src/org/sleuthkit/autopsy/ingest/ingest-msg-icon.png b/Ingest/src/org/sleuthkit/autopsy/ingest/ingest-msg-icon.png new file mode 100644 index 0000000000..f828d7c7fb Binary files /dev/null and b/Ingest/src/org/sleuthkit/autopsy/ingest/ingest-msg-icon.png differ diff --git a/Ingest/src/org/sleuthkit/autopsy/ingest/layer.xml b/Ingest/src/org/sleuthkit/autopsy/ingest/layer.xml index 4e31716dc8..9cd0c71445 100644 --- a/Ingest/src/org/sleuthkit/autopsy/ingest/layer.xml +++ b/Ingest/src/org/sleuthkit/autopsy/ingest/layer.xml @@ -1,12 +1,18 @@ + + + + + - - - - - + + + + + + + + + + + + + + diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestService.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestService.java index b6a1064771..0521b47ddc 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestService.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestService.java @@ -71,7 +71,7 @@ public final class KeywordSearchIngestService implements IngestServiceFsContent private Map> currentResults; private volatile int messageID = 0; private volatile boolean finalRun = false; - private final SleuthkitCase caseHandle = Case.getCurrentCase().getSleuthkitCase(); + private SleuthkitCase caseHandle = null; private static final String[] ingestibleExtensions = {"tar", "jar", "zip", "bzip2", "gz", "tgz", "doc", "xls", "ppt", "rtf", "pdf", "html", "xhtml", "txt", "bmp", "gif", "png", "jpeg", "tiff", "mp3", "aiff", "au", "midi", "wav", @@ -167,6 +167,8 @@ public final class KeywordSearchIngestService implements IngestServiceFsContent @Override public void init(IngestManagerProxy managerProxy) { logger.log(Level.INFO, "init()"); + + caseHandle = Case.getCurrentCase().getSleuthkitCase(); this.managerProxy = managerProxy;