Skip to content

Commit

Permalink
#49: new References tab to show items referencing the selected item
Browse files Browse the repository at this point in the history
  • Loading branch information
lfcnassif committed Jun 24, 2021
1 parent 18008a4 commit 4e674ba
Show file tree
Hide file tree
Showing 7 changed files with 239 additions and 32 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -334,6 +334,7 @@ NoJavaFX.Error=This application needs JavaFX to be installed!
ProcessingNotFinished.title=Processing not finished
ProcessingNotFinished.message=Processing didn't finish successfully. Many case items could be missing, including allocated.\nTry to resume it with --continue option.
ProcessingNotFinished.cases=\ Following cases are affected:\n
ReferencesTab.Title=\ Referências
ResultTableModel.bookmark=bookmark
ResultTableModel.score=score
ReportDialog.AddToReport=Add to existing report
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -338,6 +338,7 @@ ProcessingNotFinished.cases=\ Os seguintes casos s
ResultTableModel.bookmark=marcador
ResultTableModel.score=score
ParentTableModel.ParentCount=Item Pai
ReferencesTab.Title=\ References
ResultTableModel.DateFormat=dd/MM/yyyy HH:mm:ss z
ResultTableModel.Error=ERRO
ResultTableModel.FATDateFormat=dd/MM/yyyy
Expand Down
36 changes: 32 additions & 4 deletions iped-app/src/main/java/dpf/sp/gpinf/indexer/desktop/App.java
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ public class App extends JFrame implements WindowListener, IMultiSearchResultPro
public HitsTable hitsTable;
AppGraphAnalytics appGraphAnalytics;

HitsTable subItemTable, duplicatesTable;
HitsTable subItemTable, duplicatesTable, referencesTable;
JTree tree, bookmarksTree, categoryTree;
MetadataPanel metadataPanel;
JScrollPane categoriesPanel, bookmarksPanel;
Expand All @@ -184,7 +184,7 @@ public class App extends JFrame implements WindowListener, IMultiSearchResultPro
List<DefaultSingleCDockable> rsTabDock = new ArrayList<DefaultSingleCDockable>();

DefaultSingleCDockable tableTabDock, galleryTabDock, graphDock;
public DefaultSingleCDockable hitsDock, subitemDock, parentDock, duplicateDock;
public DefaultSingleCDockable hitsDock, subitemDock, parentDock, duplicateDock, referencesDock;
DefaultSingleCDockable compositeViewerDock;

private List<DefaultSingleCDockable> viewerDocks;
Expand All @@ -194,17 +194,20 @@ public class App extends JFrame implements WindowListener, IMultiSearchResultPro
Color defaultColor;
Color defaultFocusedColor;
Color defaultSelectedColor;
private JScrollPane hitsScroll, subItemScroll, parentItemScroll, duplicatesScroll;
private JScrollPane hitsScroll, subItemScroll, parentItemScroll, duplicatesScroll, referencesScroll;
JScrollPane viewerScroll, resultsScroll, galleryScroll;
JPanel topPanel;
ClearFilterButton clearAllFilters;
boolean disposicaoVertical = false;

public ResultTableModel resultsModel;
List resultSortKeys;

SubitemTableModel subItemModel = new SubitemTableModel();
ParentTableModel parentItemModel = new ParentTableModel();
DuplicatesTableModel duplicatesModel = new DuplicatesTableModel();
ReferencesTableModel referencesModel = new ReferencesTableModel();

GalleryModel galleryModel = new GalleryModel();

Color alertColor = Color.RED;
Expand Down Expand Up @@ -583,6 +586,18 @@ public void componentResized(ComponentEvent e) {
parentItemTable.getTableHeader().setPreferredSize(new Dimension(0, 0));
parentItemTable.setShowGrid(false);

referencesTable = new HitsTable(referencesModel);
referencesTable.setFillsViewportHeight(true);
referencesTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
referencesTable.getColumnModel().getColumn(0).setPreferredWidth(40);
referencesTable.getColumnModel().getColumn(1).setPreferredWidth(20);
referencesTable.getColumnModel().getColumn(2).setPreferredWidth(1500);
referencesTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
referencesTable.setDefaultRenderer(String.class, new TableCellRenderer());
referencesTable.getTableHeader().setPreferredSize(new Dimension(0, 0));
referencesTable.setShowGrid(false);
referencesScroll = new JScrollPane(referencesTable);

categoryTree = new JTree(new Object[0]);
categoryTree.setRootVisible(true);
categoryTree.setExpandsSelectedPaths(false);
Expand Down Expand Up @@ -731,6 +746,8 @@ public TabPanePainter createDecorationPainter(EclipseTabPane pane) {
parentItemTable.getSelectionModel().addListSelectionListener(parentItemModel);
duplicatesTable.addMouseListener(duplicatesModel);
duplicatesTable.getSelectionModel().addListSelectionListener(duplicatesModel);
referencesTable.addMouseListener(referencesModel);
referencesTable.getSelectionModel().addListSelectionListener(referencesModel);

hitsTable.addMouseListener(appletListener);
// filtro.addMouseListener(appletListener);
Expand Down Expand Up @@ -880,6 +897,8 @@ public void changed(CDockableLocationEvent event) {
parentItemScroll);
duplicateDock = createDockable("duplicatestab", Messages.getString("DuplicatesTableModel.Duplicates"), //$NON-NLS-1$ //$NON-NLS-2$
duplicatesScroll);
referencesDock = createDockable("referencedbytab", Messages.getString("ReferencesTab.Title"),
referencesScroll);

dockingControl.addDockable(categoriesTabDock);
dockingControl.addDockable(metadataTabDock);
Expand All @@ -902,6 +921,7 @@ public void changed(CDockableLocationEvent event) {
dockingControl.addDockable(subitemDock);
dockingControl.addDockable(duplicateDock);
dockingControl.addDockable(parentDock);
dockingControl.addDockable(referencesDock);

List<Viewer> viewers = viewerController.getViewers();
viewerDocks = new ArrayList<DefaultSingleCDockable>();
Expand Down Expand Up @@ -1021,7 +1041,7 @@ private void removeAllDockables() {

List<DefaultSingleCDockable> docks = new ArrayList<>();
docks.addAll(Arrays.asList(hitsDock, subitemDock, duplicateDock, parentDock, tableTabDock, galleryTabDock,
bookmarksTabDock, evidenceTabDock, metadataTabDock, categoriesTabDock, graphDock));
bookmarksTabDock, evidenceTabDock, metadataTabDock, categoriesTabDock, graphDock, referencesDock));
docks.addAll(viewerDocks);
docks.addAll(rsTabDock);
rsTabDock.clear();
Expand Down Expand Up @@ -1196,6 +1216,10 @@ public void refazLayout(boolean remove) {

duplicateDock.setLocation(nextLocation);
duplicateDock.setVisible(true);
nextLocation = duplicateDock.getBaseLocation().aside();

referencesDock.setLocation(nextLocation);
referencesDock.setVisible(true);

for (int i = 0; i < viewerDocks.size(); i++) {
DefaultSingleCDockable dock = viewerDocks.get(i);
Expand Down Expand Up @@ -1269,6 +1293,10 @@ public void refazLayout(boolean remove) {

duplicateDock.setLocation(nextLocation);
duplicateDock.setVisible(true);
nextLocation = duplicateDock.getBaseLocation().aside();

referencesDock.setLocation(nextLocation);
referencesDock.setVisible(true);

categoriesTabDock.setLocation(CLocation.base().normalWest(0.20).north(0.5));
categoriesTabDock.setVisible(true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ public void updateFileListing(Query query) {
App.get().subitemDock.setTitleText(Messages.getString("SubitemTableModel.Subitens")); //$NON-NLS-1$
App.get().duplicateDock.setTitleText(Messages.getString("DuplicatesTableModel.Duplicates")); //$NON-NLS-1$
App.get().parentDock.setTitleText(Messages.getString("ParentTableModel.ParentCount")); //$NON-NLS-1$
App.get().referencesDock.setTitleText(Messages.getString("ReferencesTab.Title")); //$NON-NLS-1$
App.get().status.setText(" "); //$NON-NLS-1$

App.get().getViewerController().clear();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,14 +156,15 @@ private void process() {
App.get().getViewerController().loadFile(item, viewItem, contentType, highlights);

if (listRelated) {
// listRelatedItens();
App.get().subItemModel.listSubItens(doc);
if (Thread.currentThread().isInterrupted()) {
return;
}
App.get().parentItemModel.listParents(doc);

App.get().duplicatesModel.listDuplicates(doc);

App.get().referencesModel.listReferencingItems(doc);
}
}

Expand Down Expand Up @@ -218,31 +219,4 @@ public void run() {
}
}

private Thread listTask;

private void listRelatedItens() {
if (listTask != null) {
listTask.interrupt();
}

listTask = new Thread(new Runnable() {
@Override
public void run() {
synchronized (lock2) {
App.get().subItemModel.listSubItens(doc);
if (Thread.currentThread().isInterrupted()) {
return;
}
App.get().parentItemModel.listParents(doc);
App.get().duplicatesModel.listDuplicates(doc);
}

}
});
synchronized (lock2) {
listTask.start();
}

}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,201 @@
/*
* Copyright 2012-2014, Luis Filipe da Cruz Nassif
*
* This file is part of Indexador e Processador de Evidências Digitais (IPED).
*
* IPED is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* IPED is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with IPED. If not, see <http://www.gnu.org/licenses/>.
*/
package dpf.sp.gpinf.indexer.desktop;

import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Arrays;
import java.util.stream.Collectors;

import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel;

import org.apache.lucene.document.Document;

import dpf.sp.gpinf.indexer.process.IndexItem;
import dpf.sp.gpinf.indexer.process.task.HashTask;
import dpf.sp.gpinf.indexer.search.IPEDSearcher;
import dpf.sp.gpinf.indexer.search.MultiSearchResult;
import iped3.search.LuceneSearchResult;
import iped3.util.ExtraProperties;

public class ReferencesTableModel extends AbstractTableModel
implements MouseListener, ListSelectionListener, SearchResultTableModel {

/**
*
*/
private static final long serialVersionUID = 1L;

private LuceneSearchResult results = new LuceneSearchResult(0);
private int selectedIndex = -1;

@Override
public int getColumnCount() {
return 3;
}

@Override
public int getRowCount() {
return results.getLength();
}

@Override
public String getColumnName(int col) {
if (col == 2)
return IndexItem.NAME;

return ""; //$NON-NLS-1$
}

@Override
public boolean isCellEditable(int row, int col) {
if (col == 1) {
return true;
} else {
return false;
}
}

@Override
public Class<?> getColumnClass(int c) {
if (c == 1) {
return Boolean.class;
} else {
return String.class;
}
}

@Override
public void setValueAt(Object value, int row, int col) {
App.get().appCase.getMultiMarcadores().setSelected((Boolean) value,
App.get().appCase.getItemId(results.getLuceneIds()[row]));
MarcadoresController.get().atualizarGUI();
}

@Override
public Object getValueAt(int row, int col) {
if (col == 0) {
return row + 1;

} else if (col == 1) {
return App.get().appCase.getMultiMarcadores()
.isSelected(App.get().appCase.getItemId(results.getLuceneIds()[row]));

} else {
try {
Document doc = App.get().appCase.getSearcher().doc(results.getLuceneIds()[row]);
return doc.get(IndexItem.NAME);
} catch (Exception e) {
// e.printStackTrace();
}
return ""; //$NON-NLS-1$
}
}

@Override
public void mouseClicked(MouseEvent arg0) {
}

@Override
public void mouseEntered(MouseEvent arg0) {
}

@Override
public void mouseExited(MouseEvent arg0) {
}

@Override
public void mousePressed(MouseEvent arg0) {
}

@Override
public void mouseReleased(MouseEvent evt) {
if (evt.getClickCount() == 2 && selectedIndex != -1) {
int docId = results.getLuceneIds()[selectedIndex];
ExternalFileOpen.open(docId);
}

}

@Override
public void valueChanged(ListSelectionEvent evt) {
ListSelectionModel lsm = (ListSelectionModel) evt.getSource();

if (lsm.getMinSelectionIndex() == -1 || selectedIndex == lsm.getMinSelectionIndex()) {
selectedIndex = lsm.getMinSelectionIndex();
return;
}

selectedIndex = lsm.getMinSelectionIndex();
App.get().getTextViewer().textTable.scrollRectToVisible(new Rectangle());

FileProcessor parsingTask = new FileProcessor(results.getLuceneIds()[selectedIndex], false);
parsingTask.execute();

App.get().parentItemModel.fireTableDataChanged();
}

public void listReferencingItems(Document doc) {

String md5 = doc.get(HashTask.HASH.MD5.toString());
String sha1 = doc.get(HashTask.HASH.SHA1.toString());
String sha256 = doc.get(HashTask.HASH.SHA256.toString());
String edonkey = doc.get(HashTask.HASH.EDONKEY.toString());
String hashes = Arrays.asList(md5, sha1, sha256, edonkey).stream().filter(a -> a != null)
.collect(Collectors.joining(" "));
String textQuery = ExtraProperties.LINKED_ITEMS + ":(" + hashes + ") ";
textQuery += ExtraProperties.SHARED_HASHES + ":(" + hashes + ")";

System.out.println(textQuery);

try {
IPEDSearcher task = new IPEDSearcher(App.get().appCase, textQuery);
results = task.luceneSearch();

final int length = results.getLength();

if (length > 0) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
App.get().referencesDock.setTitleText(length + Messages.getString("ReferencesTab.Title"));
}
});
}

} catch (Exception e) {
results = new LuceneSearchResult(0);
e.printStackTrace();
}

fireTableDataChanged();

}

@Override
public MultiSearchResult getSearchResult() {
return MultiSearchResult.get(App.get().appCase, results);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ private synchronized void processSelectedFile() {
App.get().subitemDock.setTitleText(Messages.getString("SubitemTableModel.Subitens")); //$NON-NLS-1$
App.get().duplicateDock.setTitleText(Messages.getString("DuplicatesTableModel.Duplicates")); //$NON-NLS-1$
App.get().parentDock.setTitleText(Messages.getString("ParentTableModel.ParentCount")); //$NON-NLS-1$
App.get().referencesDock.setTitleText(Messages.getString("ReferencesTab.Title")); //$NON-NLS-1$

FileProcessor parsingTask = new FileProcessor(docId, true);
parsingTask.execute();
Expand Down

0 comments on commit 4e674ba

Please sign in to comment.