mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-12 07:56:16 +00:00
6781 refactor viewer code for general purpose viewer
This commit is contained in:
parent
6e1e3ff21b
commit
3dd28340e5
@ -0,0 +1,387 @@
|
|||||||
|
/*
|
||||||
|
* Autopsy
|
||||||
|
*
|
||||||
|
* Copyright 2020 Basis Technology Corp.
|
||||||
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.sleuthkit.autopsy.contentviewers.artifactviewers;
|
||||||
|
|
||||||
|
import java.awt.Component;
|
||||||
|
import java.awt.Dimension;
|
||||||
|
import java.awt.Font;
|
||||||
|
import java.awt.GridBagConstraints;
|
||||||
|
import java.awt.GridBagLayout;
|
||||||
|
import java.awt.Insets;
|
||||||
|
import java.awt.Toolkit;
|
||||||
|
import java.awt.datatransfer.StringSelection;
|
||||||
|
import java.awt.event.ActionEvent;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import javax.swing.JLabel;
|
||||||
|
import javax.swing.JMenuItem;
|
||||||
|
import javax.swing.JPopupMenu;
|
||||||
|
import javax.swing.JScrollPane;
|
||||||
|
import javax.swing.JTextPane;
|
||||||
|
import javax.swing.SwingUtilities;
|
||||||
|
import org.openide.util.NbBundle;
|
||||||
|
import org.openide.util.lookup.ServiceProvider;
|
||||||
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
|
import org.sleuthkit.autopsy.coreutils.ThreadConfined;
|
||||||
|
import org.sleuthkit.autopsy.discovery.ui.AbstractArtifactDetailsPanel;
|
||||||
|
import org.sleuthkit.datamodel.BlackboardArtifact;
|
||||||
|
import org.sleuthkit.datamodel.BlackboardAttribute;
|
||||||
|
import org.sleuthkit.datamodel.TskCoreException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Panel to display the details for a Web History Artifact.
|
||||||
|
*/
|
||||||
|
@ServiceProvider(service = ArtifactContentViewer.class)
|
||||||
|
public class GeneralPurposeArtifactViewer extends AbstractArtifactDetailsPanel implements ArtifactContentViewer {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
private static final Logger logger = Logger.getLogger(GeneralPurposeArtifactViewer.class.getName());
|
||||||
|
// Number of columns in the gridbag layout.
|
||||||
|
private final static int MAX_COLS = 4;
|
||||||
|
private final static Insets ROW_INSETS = new java.awt.Insets(0, 12, 0, 0);
|
||||||
|
private final static Insets HEADER_INSETS = new java.awt.Insets(0, 0, 0, 0);
|
||||||
|
private final static double GLUE_WEIGHT_X = 1.0;
|
||||||
|
private final static double TEXT_WEIGHT_X = 0.0;
|
||||||
|
private final static int LABEL_COLUMN = 0;
|
||||||
|
private final static int VALUE_COLUMN = 1;
|
||||||
|
private final static int VALUE_WIDTH = 2;
|
||||||
|
private final static int LABEL_WIDTH = 1;
|
||||||
|
private final GridBagLayout gridBagLayout = new GridBagLayout();
|
||||||
|
private final GridBagConstraints gridBagConstraints = new GridBagConstraints();
|
||||||
|
private String dataSourceName;
|
||||||
|
private String sourceFileName;
|
||||||
|
private final Map<Integer, List<BlackboardAttribute>> attributeMap = new HashMap<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates new form GeneralPurposeArtifactViewer.
|
||||||
|
*/
|
||||||
|
@ThreadConfined(type = ThreadConfined.ThreadType.AWT)
|
||||||
|
public GeneralPurposeArtifactViewer() {
|
||||||
|
initComponents();
|
||||||
|
}
|
||||||
|
|
||||||
|
@ThreadConfined(type = ThreadConfined.ThreadType.AWT)
|
||||||
|
@Override
|
||||||
|
public void setArtifact(BlackboardArtifact artifact) {
|
||||||
|
resetComponent();
|
||||||
|
if (artifact != null) {
|
||||||
|
try {
|
||||||
|
extractArtifactData(artifact);
|
||||||
|
} catch (TskCoreException ex) {
|
||||||
|
logger.log(Level.WARNING, "Unable to get attributes for artifact " + artifact.getArtifactID(), ex);
|
||||||
|
}
|
||||||
|
updateView();
|
||||||
|
}
|
||||||
|
this.setLayout(this.gridBagLayout);
|
||||||
|
this.revalidate();
|
||||||
|
this.repaint();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extracts data from the artifact to be displayed in the panel.
|
||||||
|
*
|
||||||
|
* @param artifact Artifact to show.
|
||||||
|
*
|
||||||
|
* @throws TskCoreException
|
||||||
|
*/
|
||||||
|
@ThreadConfined(type = ThreadConfined.ThreadType.AWT)
|
||||||
|
private void extractArtifactData(BlackboardArtifact artifact) throws TskCoreException {
|
||||||
|
// Get all the attributes and group them by the attributeType
|
||||||
|
for (BlackboardAttribute bba : artifact.getAttributes()) {
|
||||||
|
List<BlackboardAttribute> attrList = attributeMap.get(bba.getAttributeType().getTypeID());
|
||||||
|
if (attrList == null) {
|
||||||
|
attrList = new ArrayList<>();
|
||||||
|
}
|
||||||
|
attrList.add(bba);
|
||||||
|
attributeMap.put(bba.getAttributeType().getTypeID(), attrList);
|
||||||
|
}
|
||||||
|
dataSourceName = artifact.getDataSource().getName();
|
||||||
|
sourceFileName = artifact.getParent().getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reset the panel so that it is empty.
|
||||||
|
*/
|
||||||
|
@ThreadConfined(type = ThreadConfined.ThreadType.AWT)
|
||||||
|
private void resetComponent() {
|
||||||
|
// clear the panel
|
||||||
|
this.removeAll();
|
||||||
|
gridBagConstraints.anchor = GridBagConstraints.FIRST_LINE_START;
|
||||||
|
gridBagConstraints.gridy = 0;
|
||||||
|
gridBagConstraints.gridx = LABEL_COLUMN;
|
||||||
|
gridBagConstraints.weighty = 0.0;
|
||||||
|
gridBagConstraints.weightx = TEXT_WEIGHT_X; // keep components fixed horizontally.
|
||||||
|
gridBagConstraints.fill = GridBagConstraints.NONE;
|
||||||
|
gridBagConstraints.insets = ROW_INSETS;
|
||||||
|
dataSourceName = null;
|
||||||
|
sourceFileName = null;
|
||||||
|
attributeMap.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
@ThreadConfined(type = ThreadConfined.ThreadType.AWT)
|
||||||
|
@Override
|
||||||
|
public Component getComponent() {
|
||||||
|
// Slap a vertical scrollbar on the panel.
|
||||||
|
return new JScrollPane(this, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
|
||||||
|
}
|
||||||
|
|
||||||
|
@ThreadConfined(type = ThreadConfined.ThreadType.AWT)
|
||||||
|
@Override
|
||||||
|
public boolean isSupported(BlackboardArtifact artifact) {
|
||||||
|
return (artifact != null)
|
||||||
|
&& (artifact.getArtifactTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_HISTORY.getTypeID()
|
||||||
|
|| artifact.getArtifactTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_SEARCH_QUERY.getTypeID()
|
||||||
|
|| artifact.getArtifactTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_COOKIE.getTypeID()
|
||||||
|
|| artifact.getArtifactTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_BOOKMARK.getTypeID());
|
||||||
|
}
|
||||||
|
|
||||||
|
@NbBundle.Messages({"GeneralPurposeArtifactViewer.details.attrHeader=Attributes",
|
||||||
|
"GeneralPurposeArtifactViewer.details.sourceHeader=Source",
|
||||||
|
"GeneralPurposeArtifactViewer.details.dataSource=Data Source",
|
||||||
|
"GeneralPurposeArtifactViewer.details.file=File"})
|
||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
// <editor-fold defaultstate="collapsed" desc="Generated Code">//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, 400, Short.MAX_VALUE)
|
||||||
|
);
|
||||||
|
layout.setVerticalGroup(
|
||||||
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGap(0, 300, Short.MAX_VALUE)
|
||||||
|
);
|
||||||
|
}// </editor-fold>//GEN-END:initComponents
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the view to reflect the current artifact's details.
|
||||||
|
*/
|
||||||
|
@ThreadConfined(type = ThreadConfined.ThreadType.AWT)
|
||||||
|
private void updateView() {
|
||||||
|
addHeader(Bundle.GeneralPurposeArtifactViewer_details_attrHeader());
|
||||||
|
moveAttributesFromMapToPanel(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_TITLE);
|
||||||
|
moveAttributesFromMapToPanel(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME);
|
||||||
|
moveAttributesFromMapToPanel(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_ACCESSED);
|
||||||
|
moveAttributesFromMapToPanel(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_CREATED);
|
||||||
|
moveAttributesFromMapToPanel(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_START);
|
||||||
|
moveAttributesFromMapToPanel(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_END);
|
||||||
|
moveAttributesFromMapToPanel(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DOMAIN);
|
||||||
|
moveAttributesFromMapToPanel(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_URL);
|
||||||
|
moveAttributesFromMapToPanel(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_REFERRER);
|
||||||
|
moveAttributesFromMapToPanel(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROG_NAME);
|
||||||
|
moveAttributesFromMapToPanel(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_VALUE);
|
||||||
|
moveAttributesFromMapToPanel(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_TEXT);
|
||||||
|
for (int key : attributeMap.keySet()) {
|
||||||
|
for (BlackboardAttribute bba : attributeMap.get(key)) {
|
||||||
|
addNameValueRow(bba.getAttributeType().getDisplayName(), bba.getDisplayString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
addHeader(Bundle.GeneralPurposeArtifactViewer_details_sourceHeader());
|
||||||
|
addNameValueRow(Bundle.GeneralPurposeArtifactViewer_details_dataSource(), dataSourceName);
|
||||||
|
addNameValueRow(Bundle.GeneralPurposeArtifactViewer_details_file(), sourceFileName);
|
||||||
|
// add veritcal glue at the end
|
||||||
|
addPageEndGlue();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove attributes of the specified type from the map and add them to the
|
||||||
|
* panel.
|
||||||
|
*
|
||||||
|
* @param type The type of BlackboardAttribute to remove from the map and
|
||||||
|
* add to the panel.
|
||||||
|
*/
|
||||||
|
@ThreadConfined(type = ThreadConfined.ThreadType.AWT)
|
||||||
|
private void moveAttributesFromMapToPanel(BlackboardAttribute.ATTRIBUTE_TYPE type) {
|
||||||
|
List<BlackboardAttribute> attrList = attributeMap.remove(type.getTypeID());
|
||||||
|
if (attrList != null) {
|
||||||
|
for (BlackboardAttribute bba : attrList) {
|
||||||
|
addNameValueRow(bba.getAttributeType().getDisplayName(), bba.getDisplayString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a new heading to the panel.
|
||||||
|
*
|
||||||
|
* @param headerString Heading string to display.
|
||||||
|
*
|
||||||
|
* @return JLabel Heading label added.
|
||||||
|
*/
|
||||||
|
@ThreadConfined(type = ThreadConfined.ThreadType.AWT)
|
||||||
|
private JLabel addHeader(String headerString) {
|
||||||
|
// create label for heading
|
||||||
|
javax.swing.JLabel headingLabel = new javax.swing.JLabel();
|
||||||
|
// add a blank line before the start of new section, unless it's
|
||||||
|
// the first section
|
||||||
|
if (gridBagConstraints.gridy != 0) {
|
||||||
|
gridBagConstraints.gridy++;
|
||||||
|
add(new javax.swing.JLabel(" "), gridBagConstraints);
|
||||||
|
addLineEndGlue();
|
||||||
|
}
|
||||||
|
gridBagConstraints.gridy++;
|
||||||
|
gridBagConstraints.gridx = LABEL_COLUMN;;
|
||||||
|
// let the header span all of the row
|
||||||
|
gridBagConstraints.gridwidth = MAX_COLS;
|
||||||
|
gridBagConstraints.insets = HEADER_INSETS;
|
||||||
|
// set text
|
||||||
|
headingLabel.setText(headerString);
|
||||||
|
// make it large and bold
|
||||||
|
headingLabel.setFont(headingLabel.getFont().deriveFont(Font.BOLD, headingLabel.getFont().getSize() + 2));
|
||||||
|
// add to panel
|
||||||
|
add(headingLabel, gridBagConstraints);
|
||||||
|
// reset constraints to normal
|
||||||
|
gridBagConstraints.gridwidth = LABEL_WIDTH;
|
||||||
|
// add line end glue
|
||||||
|
addLineEndGlue();
|
||||||
|
gridBagConstraints.insets = ROW_INSETS;
|
||||||
|
return headingLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a key value row to the specified panel with the specified layout and
|
||||||
|
* constraints.
|
||||||
|
*
|
||||||
|
* @param keyString Key name to display.
|
||||||
|
* @param valueString Value string to display.
|
||||||
|
*/
|
||||||
|
private void addNameValueRow(String keyString, String valueString) {
|
||||||
|
addKeyAtCol(keyString);
|
||||||
|
addValueAtCol(valueString);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a filler/glue at the end of the line to keep the other columns
|
||||||
|
* aligned, in case the panel is resized.
|
||||||
|
*/
|
||||||
|
private void addLineEndGlue() {
|
||||||
|
// Place the filler just past the last column.
|
||||||
|
gridBagConstraints.gridx = MAX_COLS;
|
||||||
|
gridBagConstraints.weightx = GLUE_WEIGHT_X; // take up all the horizontal space
|
||||||
|
gridBagConstraints.fill = GridBagConstraints.BOTH;
|
||||||
|
javax.swing.Box.Filler horizontalFiller = new javax.swing.Box.Filler(new Dimension(0, 0), new Dimension(0, 0), new Dimension(32767, 0));
|
||||||
|
add(horizontalFiller, gridBagConstraints);
|
||||||
|
// restore fill & weight
|
||||||
|
gridBagConstraints.fill = GridBagConstraints.NONE;
|
||||||
|
gridBagConstraints.weightx = TEXT_WEIGHT_X;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a filler/glue at the bottom of the panel to keep the data rows
|
||||||
|
* aligned, in case the panel is resized.
|
||||||
|
*/
|
||||||
|
private void addPageEndGlue() {
|
||||||
|
gridBagConstraints.weighty = 1.0; // take up all the vertical space
|
||||||
|
gridBagConstraints.fill = GridBagConstraints.VERTICAL;
|
||||||
|
javax.swing.Box.Filler vertFiller = new javax.swing.Box.Filler(new Dimension(0, 0), new Dimension(0, 0), new Dimension(0, 32767));
|
||||||
|
add(vertFiller, gridBagConstraints);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a label/key to the panel.
|
||||||
|
*
|
||||||
|
* @param keyString Key name to display.
|
||||||
|
*
|
||||||
|
* @return Label added.
|
||||||
|
*/
|
||||||
|
private JLabel addKeyAtCol(String keyString) {
|
||||||
|
// create label
|
||||||
|
javax.swing.JLabel keyLabel = new javax.swing.JLabel();
|
||||||
|
gridBagConstraints.gridy++;
|
||||||
|
gridBagConstraints.gridx = LABEL_COLUMN;
|
||||||
|
gridBagConstraints.gridwidth = LABEL_WIDTH;
|
||||||
|
// set text
|
||||||
|
keyLabel.setText(keyString + ": ");
|
||||||
|
// add to panel
|
||||||
|
add(keyLabel, gridBagConstraints);
|
||||||
|
return keyLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a value string to the panel at specified column.
|
||||||
|
*
|
||||||
|
* @param valueString Value string to display.
|
||||||
|
*
|
||||||
|
* @return Label added.
|
||||||
|
*/
|
||||||
|
private JTextPane addValueAtCol(String valueString) {
|
||||||
|
// create label,
|
||||||
|
JTextPane valueField = new JTextPane();
|
||||||
|
valueField.setEditable(false);
|
||||||
|
valueField.setOpaque(false);
|
||||||
|
gridBagConstraints.gridx = VALUE_COLUMN;
|
||||||
|
GridBagConstraints cloneConstraints = (GridBagConstraints) gridBagConstraints.clone();
|
||||||
|
// let the value span 2 cols
|
||||||
|
cloneConstraints.gridwidth = VALUE_WIDTH;
|
||||||
|
cloneConstraints.fill = GridBagConstraints.BOTH;
|
||||||
|
// set text
|
||||||
|
valueField.setText(valueString);
|
||||||
|
// attach a right click menu with Copy option
|
||||||
|
valueField.addMouseListener(new java.awt.event.MouseAdapter() {
|
||||||
|
@Override
|
||||||
|
public void mouseClicked(java.awt.event.MouseEvent evt) {
|
||||||
|
valueLabelMouseClicked(evt, valueField);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// add label to panel
|
||||||
|
add(valueField, cloneConstraints);
|
||||||
|
// end the line
|
||||||
|
addLineEndGlue();
|
||||||
|
return valueField;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Event handler for mouse click event. Attaches a 'Copy' menu item to right
|
||||||
|
* click.
|
||||||
|
*
|
||||||
|
* @param evt Event to check.
|
||||||
|
* @param valueLabel Label to attach the menu item to.
|
||||||
|
*/
|
||||||
|
@NbBundle.Messages({
|
||||||
|
"GeneralPurposeArtifactViewer_menuitem_copy=Copy"
|
||||||
|
})
|
||||||
|
private void valueLabelMouseClicked(java.awt.event.MouseEvent evt, JTextPane valueLabel) {
|
||||||
|
if (SwingUtilities.isRightMouseButton(evt)) {
|
||||||
|
JPopupMenu popup = new JPopupMenu();
|
||||||
|
JMenuItem copyMenu = new JMenuItem(Bundle.CommunicationArtifactViewerHelper_menuitem_copy()); // NON-NLS
|
||||||
|
copyMenu.addActionListener(new ActionListener() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(valueLabel.getText()), null);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
popup.add(copyMenu);
|
||||||
|
popup.show(valueLabel, evt.getX(), evt.getY());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||||
|
// End of variables declaration//GEN-END:variables
|
||||||
|
}
|
@ -1,28 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
|
||||||
|
|
||||||
<Form version="1.3" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
|
|
||||||
<AuxValues>
|
|
||||||
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
|
|
||||||
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
|
|
||||||
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
|
|
||||||
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
|
|
||||||
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
|
|
||||||
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
|
|
||||||
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
|
|
||||||
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
|
|
||||||
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
|
|
||||||
</AuxValues>
|
|
||||||
|
|
||||||
<Layout>
|
|
||||||
<DimensionLayout dim="0">
|
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
|
||||||
<EmptySpace min="0" pref="400" max="32767" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
</DimensionLayout>
|
|
||||||
<DimensionLayout dim="1">
|
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
|
||||||
<EmptySpace min="0" pref="300" max="32767" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
</DimensionLayout>
|
|
||||||
</Layout>
|
|
||||||
</Form>
|
|
@ -1,129 +0,0 @@
|
|||||||
/*
|
|
||||||
* Autopsy
|
|
||||||
*
|
|
||||||
* Copyright 2020 Basis Technology Corp.
|
|
||||||
* Contact: carrier <at> sleuthkit <dot> org
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package org.sleuthkit.autopsy.contentviewers.artifactviewers;
|
|
||||||
|
|
||||||
import java.awt.Component;
|
|
||||||
import java.util.logging.Level;
|
|
||||||
import javax.swing.JScrollPane;
|
|
||||||
import org.sleuthkit.autopsy.discovery.ui.AbstractArtifactDetailsPanel;
|
|
||||||
import org.sleuthkit.datamodel.BlackboardArtifact;
|
|
||||||
import org.sleuthkit.datamodel.BlackboardAttribute;
|
|
||||||
import org.sleuthkit.datamodel.TskCoreException;
|
|
||||||
|
|
||||||
public class GenericArtifactViewer extends AbstractArtifactDetailsPanel implements ArtifactContentViewer {
|
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
|
||||||
|
|
||||||
private BlackboardArtifact Artifact;
|
|
||||||
// private final atttribute
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates new form GenericArtifactViewer
|
|
||||||
*/
|
|
||||||
public GenericArtifactViewer() {
|
|
||||||
initComponents();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//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, 400, Short.MAX_VALUE)
|
|
||||||
);
|
|
||||||
layout.setVerticalGroup(
|
|
||||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
||||||
.addGap(0, 300, Short.MAX_VALUE)
|
|
||||||
);
|
|
||||||
}// </editor-fold>//GEN-END:initComponents
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setArtifact(BlackboardArtifact artifact) {
|
|
||||||
// resetComponent();
|
|
||||||
// if (artifact != null) {
|
|
||||||
// try {
|
|
||||||
// extractArtifactData(artifact);
|
|
||||||
// } catch (TskCoreException ex) {
|
|
||||||
// logger.log(Level.WARNING, "Unable to get attributes for artifact " + artifact.getArtifactID(), ex);
|
|
||||||
// }
|
|
||||||
// updateView();
|
|
||||||
// }
|
|
||||||
// this.setLayout(this.gridBagLayout);
|
|
||||||
// this.revalidate();
|
|
||||||
// this.repaint();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extracts data from the artifact to be displayed in the panel.
|
|
||||||
*
|
|
||||||
* @param artifact Artifact to show.
|
|
||||||
*
|
|
||||||
* @throws TskCoreException
|
|
||||||
*/
|
|
||||||
private void extractArtifactData(BlackboardArtifact artifact) throws TskCoreException {
|
|
||||||
|
|
||||||
// webHistoryArtifact = artifact;
|
|
||||||
// artifactAttributesList.addAll(webHistoryArtifact.getAttributes());
|
|
||||||
// // Get all the attributes and group them by the section panels they go in
|
|
||||||
// for (BlackboardAttribute bba : artifactAttributesList) {
|
|
||||||
// if (bba.getAttributeType().getTypeName().startsWith("TSK_URL")) {
|
|
||||||
// urlList.add(bba);
|
|
||||||
// } else if (bba.getAttributeType().getTypeName().startsWith("TSK_PROG_NAME")) {
|
|
||||||
// programNameList.add(bba);
|
|
||||||
// } else if (bba.getAttributeType().getTypeName().startsWith("TSK_DOMAIN")) {
|
|
||||||
// domainList.add(bba);
|
|
||||||
// } else if (bba.getAttributeType().getTypeName().startsWith("TSK_REFERRER")) {
|
|
||||||
// referrerUrlList.add(bba);
|
|
||||||
// } else if (bba.getAttributeType().getTypeName().startsWith("TSK_DATETIME_ACCESSED")) {
|
|
||||||
// dateAccessedList.add(bba);
|
|
||||||
// } else if (bba.getAttributeType().getTypeName().startsWith("TSK_TITLE")) {
|
|
||||||
// titleList.add(bba);
|
|
||||||
// } else {
|
|
||||||
// otherList.add(bba);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// dataSourceName = webHistoryArtifact.getDataSource().getName();
|
|
||||||
// sourceFileName = webHistoryArtifact.getParent().getName();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Component getComponent() {
|
|
||||||
// Slap a vertical scrollbar on the panel.
|
|
||||||
return new JScrollPane(this, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isSupported(BlackboardArtifact artifact) {
|
|
||||||
return false; //(artifact != null);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
|
||||||
// End of variables declaration//GEN-END:variables
|
|
||||||
}
|
|
@ -18,6 +18,7 @@
|
|||||||
*/
|
*/
|
||||||
package org.sleuthkit.autopsy.discovery.ui;
|
package org.sleuthkit.autopsy.discovery.ui;
|
||||||
|
|
||||||
|
import org.sleuthkit.autopsy.contentviewers.artifactviewers.GeneralPurposeArtifactViewer;
|
||||||
import com.google.common.eventbus.Subscribe;
|
import com.google.common.eventbus.Subscribe;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import javax.swing.JPanel;
|
import javax.swing.JPanel;
|
||||||
@ -78,7 +79,7 @@ final class DomainArtifactsTabPanel extends JPanel {
|
|||||||
case TSK_WEB_COOKIE:
|
case TSK_WEB_COOKIE:
|
||||||
case TSK_WEB_SEARCH_QUERY:
|
case TSK_WEB_SEARCH_QUERY:
|
||||||
case TSK_WEB_BOOKMARK:
|
case TSK_WEB_BOOKMARK:
|
||||||
rightPanel = new WebHistoryDetailsPanel();
|
rightPanel = new GeneralPurposeArtifactViewer();
|
||||||
break;
|
break;
|
||||||
case TSK_WEB_DOWNLOAD:
|
case TSK_WEB_DOWNLOAD:
|
||||||
case TSK_WEB_CACHE:
|
case TSK_WEB_CACHE:
|
||||||
|
@ -1,265 +0,0 @@
|
|||||||
/*
|
|
||||||
* Autopsy
|
|
||||||
*
|
|
||||||
* Copyright 2020 Basis Technology Corp.
|
|
||||||
* Contact: carrier <at> sleuthkit <dot> org
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package org.sleuthkit.autopsy.discovery.ui;
|
|
||||||
|
|
||||||
import java.awt.Component;
|
|
||||||
import java.awt.GridBagConstraints;
|
|
||||||
import java.awt.GridBagLayout;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.logging.Level;
|
|
||||||
import javax.swing.JScrollPane;
|
|
||||||
import org.openide.util.NbBundle;
|
|
||||||
import org.openide.util.lookup.ServiceProvider;
|
|
||||||
import org.sleuthkit.autopsy.contentviewers.artifactviewers.ArtifactContentViewer;
|
|
||||||
import org.sleuthkit.autopsy.contentviewers.artifactviewers.CommunicationArtifactViewerHelper;
|
|
||||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
|
||||||
import org.sleuthkit.autopsy.coreutils.ThreadConfined;
|
|
||||||
import org.sleuthkit.datamodel.BlackboardArtifact;
|
|
||||||
import org.sleuthkit.datamodel.BlackboardAttribute;
|
|
||||||
import org.sleuthkit.datamodel.TskCoreException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Panel to display the details for a Web History Artifact.
|
|
||||||
*/
|
|
||||||
@ServiceProvider(service = ArtifactContentViewer.class)
|
|
||||||
public class WebHistoryDetailsPanel extends AbstractArtifactDetailsPanel implements ArtifactContentViewer {
|
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
|
||||||
private static final Logger logger = Logger.getLogger(WebHistoryDetailsPanel.class.getName());
|
|
||||||
private BlackboardArtifact webHistoryArtifact;
|
|
||||||
private final GridBagLayout gridBagLayout = new GridBagLayout();
|
|
||||||
private final List<BlackboardAttribute> urlList = new ArrayList<>();
|
|
||||||
private final List<BlackboardAttribute> dateAccessedList = new ArrayList<>();
|
|
||||||
private final List<BlackboardAttribute> referrerUrlList = new ArrayList<>();
|
|
||||||
private final List<BlackboardAttribute> titleList = new ArrayList<>();
|
|
||||||
private final List<BlackboardAttribute> programNameList = new ArrayList<>();
|
|
||||||
private final List<BlackboardAttribute> domainList = new ArrayList<>();
|
|
||||||
private final List<BlackboardAttribute> nameList = new ArrayList<>();
|
|
||||||
private final List<BlackboardAttribute> valueList = new ArrayList<>();
|
|
||||||
private final List<BlackboardAttribute> dateCreatedList = new ArrayList<>();
|
|
||||||
private final List<BlackboardAttribute> datestartList = new ArrayList<>();
|
|
||||||
private final List<BlackboardAttribute> dateEndList = new ArrayList<>();
|
|
||||||
private final List<BlackboardAttribute> textList = new ArrayList<>();
|
|
||||||
private final List<BlackboardAttribute> otherList = new ArrayList<>();
|
|
||||||
private final GridBagConstraints gridBagConstraints = new GridBagConstraints();
|
|
||||||
private String dataSourceName;
|
|
||||||
private String sourceFileName;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates new form WebHistoryDetailsPanel.
|
|
||||||
*/
|
|
||||||
@ThreadConfined(type = ThreadConfined.ThreadType.AWT)
|
|
||||||
public WebHistoryDetailsPanel() {
|
|
||||||
initComponents();
|
|
||||||
}
|
|
||||||
|
|
||||||
@ThreadConfined(type = ThreadConfined.ThreadType.AWT)
|
|
||||||
@Override
|
|
||||||
public void setArtifact(BlackboardArtifact artifact) {
|
|
||||||
resetComponent();
|
|
||||||
if (artifact != null) {
|
|
||||||
try {
|
|
||||||
extractArtifactData(artifact);
|
|
||||||
} catch (TskCoreException ex) {
|
|
||||||
logger.log(Level.WARNING, "Unable to get attributes for artifact " + artifact.getArtifactID(), ex);
|
|
||||||
}
|
|
||||||
updateView();
|
|
||||||
}
|
|
||||||
this.setLayout(this.gridBagLayout);
|
|
||||||
this.revalidate();
|
|
||||||
this.repaint();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extracts data from the artifact to be displayed in the panel.
|
|
||||||
*
|
|
||||||
* @param artifact Artifact to show.
|
|
||||||
*
|
|
||||||
* @throws TskCoreException
|
|
||||||
*/
|
|
||||||
@ThreadConfined(type = ThreadConfined.ThreadType.AWT)
|
|
||||||
private void extractArtifactData(BlackboardArtifact artifact) throws TskCoreException {
|
|
||||||
|
|
||||||
webHistoryArtifact = artifact;
|
|
||||||
// Get all the attributes and group them by the section panels they go in
|
|
||||||
for (BlackboardAttribute bba : webHistoryArtifact.getAttributes()) {
|
|
||||||
if (bba.getAttributeType().getTypeName().startsWith("TSK_URL")) {
|
|
||||||
urlList.add(bba);
|
|
||||||
} else if (bba.getAttributeType().getTypeName().startsWith("TSK_PROG_NAME")) {
|
|
||||||
programNameList.add(bba);
|
|
||||||
} else if (bba.getAttributeType().getTypeName().startsWith("TSK_DOMAIN")) {
|
|
||||||
domainList.add(bba);
|
|
||||||
} else if (bba.getAttributeType().getTypeName().startsWith("TSK_REFERRER")) {
|
|
||||||
referrerUrlList.add(bba);
|
|
||||||
} else if (bba.getAttributeType().getTypeName().startsWith("TSK_DATETIME_ACCESSED")) {
|
|
||||||
dateAccessedList.add(bba);
|
|
||||||
} else if (bba.getAttributeType().getTypeName().startsWith("TSK_DATETIME_CREATED")) {
|
|
||||||
dateCreatedList.add(bba);
|
|
||||||
} else if (bba.getAttributeType().getTypeName().startsWith("TSK_DATETIME_START")) {
|
|
||||||
datestartList.add(bba);
|
|
||||||
} else if (bba.getAttributeType().getTypeName().startsWith("TSK_DATETIME_END")) {
|
|
||||||
dateEndList.add(bba);
|
|
||||||
} else if (bba.getAttributeType().getTypeName().startsWith("TSK_TEXT")) {
|
|
||||||
textList.add(bba);
|
|
||||||
} else if (bba.getAttributeType().getTypeName().startsWith("TSK_VALUE")) {
|
|
||||||
valueList.add(bba);
|
|
||||||
} else if (bba.getAttributeType().getTypeName().startsWith("TSK_TITLE")) {
|
|
||||||
titleList.add(bba);
|
|
||||||
} else {
|
|
||||||
otherList.add(bba);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
dataSourceName = webHistoryArtifact.getDataSource().getName();
|
|
||||||
sourceFileName = webHistoryArtifact.getParent().getName();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Reset the panel so that it is empty.
|
|
||||||
*/
|
|
||||||
@ThreadConfined(type = ThreadConfined.ThreadType.AWT)
|
|
||||||
private void resetComponent() {
|
|
||||||
// clear the panel
|
|
||||||
this.removeAll();
|
|
||||||
gridBagConstraints.anchor = GridBagConstraints.FIRST_LINE_START;
|
|
||||||
gridBagConstraints.gridy = 0;
|
|
||||||
gridBagConstraints.gridx = 0;
|
|
||||||
gridBagConstraints.weighty = 0.0;
|
|
||||||
gridBagConstraints.weightx = 0.0; // keep components fixed horizontally.
|
|
||||||
gridBagConstraints.insets = new java.awt.Insets(0, 12, 0, 0);
|
|
||||||
gridBagConstraints.fill = GridBagConstraints.NONE;
|
|
||||||
webHistoryArtifact = null;
|
|
||||||
dataSourceName = null;
|
|
||||||
sourceFileName = null;
|
|
||||||
urlList.clear();
|
|
||||||
dateAccessedList.clear();
|
|
||||||
referrerUrlList.clear();
|
|
||||||
titleList.clear();
|
|
||||||
programNameList.clear();
|
|
||||||
domainList.clear();
|
|
||||||
dateCreatedList.clear();
|
|
||||||
datestartList.clear();
|
|
||||||
dateEndList.clear();
|
|
||||||
valueList.clear();
|
|
||||||
nameList.clear();
|
|
||||||
textList.clear();
|
|
||||||
otherList.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
@ThreadConfined(type = ThreadConfined.ThreadType.AWT)
|
|
||||||
@Override
|
|
||||||
public Component getComponent() {
|
|
||||||
// Slap a vertical scrollbar on the panel.
|
|
||||||
return new JScrollPane(this, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
|
|
||||||
}
|
|
||||||
|
|
||||||
@ThreadConfined(type = ThreadConfined.ThreadType.AWT)
|
|
||||||
@Override
|
|
||||||
public boolean isSupported(BlackboardArtifact artifact) {
|
|
||||||
return (artifact != null)
|
|
||||||
&& (artifact.getArtifactTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_HISTORY.getTypeID()
|
|
||||||
|| artifact.getArtifactTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_SEARCH_QUERY.getTypeID()
|
|
||||||
|| artifact.getArtifactTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_COOKIE.getTypeID()
|
|
||||||
|| artifact.getArtifactTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_BOOKMARK.getTypeID());
|
|
||||||
}
|
|
||||||
|
|
||||||
@NbBundle.Messages({"WebHistoryDetailsPanel.details.attrHeader=Attributes",
|
|
||||||
"WebHistoryDetailsPanel.details.sourceHeader=Source",
|
|
||||||
"WebHistoryDetailsPanel.details.dataSource=Data Source",
|
|
||||||
"WebHistoryDetailsPanel.details.file=File"})
|
|
||||||
/**
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//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, 400, Short.MAX_VALUE)
|
|
||||||
);
|
|
||||||
layout.setVerticalGroup(
|
|
||||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
||||||
.addGap(0, 300, Short.MAX_VALUE)
|
|
||||||
);
|
|
||||||
}// </editor-fold>//GEN-END:initComponents
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Update the view to reflect the current artifact's details.
|
|
||||||
*/
|
|
||||||
@ThreadConfined(type = ThreadConfined.ThreadType.AWT)
|
|
||||||
private void updateView() {
|
|
||||||
CommunicationArtifactViewerHelper.addHeader(this, gridBagLayout, gridBagConstraints, Bundle.WebHistoryDetailsPanel_details_attrHeader());
|
|
||||||
|
|
||||||
for (BlackboardAttribute bba : this.titleList) {
|
|
||||||
CommunicationArtifactViewerHelper.addNameValueRow(this, gridBagLayout, gridBagConstraints, bba.getAttributeType().getDisplayName(), bba.getDisplayString());
|
|
||||||
}
|
|
||||||
for (BlackboardAttribute bba : this.nameList) {
|
|
||||||
CommunicationArtifactViewerHelper.addNameValueRow(this, gridBagLayout, gridBagConstraints, bba.getAttributeType().getDisplayName(), bba.getDisplayString());
|
|
||||||
}
|
|
||||||
for (BlackboardAttribute bba : dateAccessedList) {
|
|
||||||
CommunicationArtifactViewerHelper.addNameValueRow(this, gridBagLayout, gridBagConstraints, bba.getAttributeType().getDisplayName(), bba.getDisplayString());
|
|
||||||
}
|
|
||||||
for (BlackboardAttribute bba : dateCreatedList) {
|
|
||||||
CommunicationArtifactViewerHelper.addNameValueRow(this, gridBagLayout, gridBagConstraints, bba.getAttributeType().getDisplayName(), bba.getDisplayString());
|
|
||||||
}
|
|
||||||
for (BlackboardAttribute bba : datestartList) {
|
|
||||||
CommunicationArtifactViewerHelper.addNameValueRow(this, gridBagLayout, gridBagConstraints, bba.getAttributeType().getDisplayName(), bba.getDisplayString());
|
|
||||||
}
|
|
||||||
for (BlackboardAttribute bba : dateEndList) {
|
|
||||||
CommunicationArtifactViewerHelper.addNameValueRow(this, gridBagLayout, gridBagConstraints, bba.getAttributeType().getDisplayName(), bba.getDisplayString());
|
|
||||||
}
|
|
||||||
for (BlackboardAttribute bba : domainList) {
|
|
||||||
CommunicationArtifactViewerHelper.addNameValueRow(this, gridBagLayout, gridBagConstraints, bba.getAttributeType().getDisplayName(), bba.getDisplayString());
|
|
||||||
}
|
|
||||||
for (BlackboardAttribute bba : urlList) {
|
|
||||||
CommunicationArtifactViewerHelper.addNameValueRow(this, gridBagLayout, gridBagConstraints, bba.getAttributeType().getDisplayName(), bba.getDisplayString());
|
|
||||||
}
|
|
||||||
for (BlackboardAttribute bba : referrerUrlList) {
|
|
||||||
CommunicationArtifactViewerHelper.addNameValueRow(this, gridBagLayout, gridBagConstraints, bba.getAttributeType().getDisplayName(), bba.getDisplayString());
|
|
||||||
}
|
|
||||||
for (BlackboardAttribute bba : programNameList) {
|
|
||||||
CommunicationArtifactViewerHelper.addNameValueRow(this, gridBagLayout, gridBagConstraints, bba.getAttributeType().getDisplayName(), bba.getDisplayString());
|
|
||||||
}
|
|
||||||
for (BlackboardAttribute bba : valueList) {
|
|
||||||
CommunicationArtifactViewerHelper.addNameValueRow(this, gridBagLayout, gridBagConstraints, bba.getAttributeType().getDisplayName(), bba.getDisplayString());
|
|
||||||
}
|
|
||||||
for (BlackboardAttribute bba : textList) {
|
|
||||||
CommunicationArtifactViewerHelper.addNameValueRow(this, gridBagLayout, gridBagConstraints, bba.getAttributeType().getDisplayName(), bba.getDisplayString());
|
|
||||||
}
|
|
||||||
for (BlackboardAttribute bba : otherList) {
|
|
||||||
CommunicationArtifactViewerHelper.addNameValueRow(this, gridBagLayout, gridBagConstraints, bba.getAttributeType().getDisplayName(), bba.getDisplayString());
|
|
||||||
}
|
|
||||||
CommunicationArtifactViewerHelper.addHeader(this, gridBagLayout, gridBagConstraints, Bundle.WebHistoryDetailsPanel_details_sourceHeader());
|
|
||||||
CommunicationArtifactViewerHelper.addNameValueRow(this, gridBagLayout, gridBagConstraints, Bundle.WebHistoryDetailsPanel_details_dataSource(), dataSourceName);
|
|
||||||
CommunicationArtifactViewerHelper.addNameValueRow(this, gridBagLayout, gridBagConstraints, Bundle.WebHistoryDetailsPanel_details_file(), sourceFileName);
|
|
||||||
// add veritcal glue at the end
|
|
||||||
CommunicationArtifactViewerHelper.addPageEndGlue(this, gridBagLayout, this.gridBagConstraints);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
|
||||||
// End of variables declaration//GEN-END:variables
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user