From b967bc4b33be32d11801a46392884ac96a75dd88 Mon Sep 17 00:00:00 2001 From: Fredrik Teschke Date: Fri, 3 Mar 2017 10:57:33 +0100 Subject: [PATCH 1/2] fix docear/Desktop#500 (search orphaned nodes perf.) --- .../features/MonitoringWorker.java | 69 ++++++++++++------- .../pdf/PdfAnnotationImporter.java | 3 +- 2 files changed, 46 insertions(+), 26 deletions(-) diff --git a/docear_plugin_pdfutilities/src/org/docear/plugin/pdfutilities/features/MonitoringWorker.java b/docear_plugin_pdfutilities/src/org/docear/plugin/pdfutilities/features/MonitoringWorker.java index b1ffd2abc..c764b565c 100644 --- a/docear_plugin_pdfutilities/src/org/docear/plugin/pdfutilities/features/MonitoringWorker.java +++ b/docear_plugin_pdfutilities/src/org/docear/plugin/pdfutilities/features/MonitoringWorker.java @@ -227,6 +227,9 @@ private boolean searchingOrphanedNodes(NodeModel target) throws InterruptedExcep fireStatusUpdate(SwingWorkerDialog.SET_PROGRESS_BAR_DETERMINATE, null, null); fireStatusUpdate(SwingWorkerDialog.PROGRESS_BAR_TEXT, null, TextUtils.getText("AbstractMonitoringAction.11")); //$NON-NLS-1$ int count = 0; + + // Step 1: collect all files that have to be checked. + Map> filesWithAnnotations = new HashMap>(); for (AnnotationID id : nodeIndex.keySet()) { if (canceled()) return false; count++; @@ -239,39 +242,57 @@ private boolean searchingOrphanedNodes(NodeModel target) throws InterruptedExcep if (annotation.getAnnotationType() == null) continue; if (annotation.getAnnotationType().equals(AnnotationType.FILE)) continue; if (orphanedNodes.contains(node)) continue; - try { - File file = URIUtils.getAbsoluteFile(URIUtils.getAbsoluteURI(node)); - if (file != null && !file.exists()) { - orphanedNodes.add(node); - continue; - } - else if (file != null) { - File monitoringDirectory = MonitoringUtils.getPdfDirFromMonitoringNode(target); - boolean ok = false; - if(monitoringDirectory instanceof AVirtualDirectory) { - for(File repo : monitoringDirectory.listFiles()) { - if (file.getPath().startsWith(repo.getPath())) { - ok = true; - } - } - } - else if (file.getPath().startsWith(monitoringDirectory.getPath())) { + + File file = URIUtils.getAbsoluteFile(URIUtils.getAbsoluteURI(node)); + List annotationsForFile = filesWithAnnotations.get(file); + if (annotationsForFile == null) { + annotationsForFile = new ArrayList(); + filesWithAnnotations.put(file, annotationsForFile); + } + annotationsForFile.add(node); + } + } + + // Step 2: Open each file only once, and check for orphaned annotations + for (File file : filesWithAnnotations.keySet()) { + List nodes = filesWithAnnotations.get(file); + + if (file != null && !file.exists()) { + orphanedNodes.addAll(nodes); + continue; + } + else if (file != null) { + File monitoringDirectory = MonitoringUtils.getPdfDirFromMonitoringNode(target); + boolean ok = false; + if(monitoringDirectory instanceof AVirtualDirectory) { + for(File repo : monitoringDirectory.listFiles()) { + if (file.getPath().startsWith(repo.getPath())) { ok = true; } - if(ok) { - AnnotationModel annoation = new PdfAnnotationImporter().searchAnnotation(URIUtils.getAbsoluteURI(node), node); - if (annoation == null) { + } + } + else if (file.getPath().startsWith(monitoringDirectory.getPath())) { + ok = true; + } + if(ok) { + PdfAnnotationImporter importer = new PdfAnnotationImporter(); + importer.setImportAll(true); + try { + List annotationsInFile = importer.importAnnotations(file.toURI()); + for (NodeModel node : nodes) { + AnnotationModel foundAnnotation = + importer.searchAnnotation(annotationsInFile, node); + if (foundAnnotation == null) { orphanedNodes.add(node); } } + } catch (Exception e) { + LogUtils.info("Exception during import file: " + file.toURI()); //$NON-NLS-1$ } - - } - catch (Exception e) { - LogUtils.info("Exception during import file: " + URIUtils.getAbsoluteURI(node)); //$NON-NLS-1$ } } } + return true; } diff --git a/docear_plugin_pdfutilities/src/org/docear/plugin/pdfutilities/pdf/PdfAnnotationImporter.java b/docear_plugin_pdfutilities/src/org/docear/plugin/pdfutilities/pdf/PdfAnnotationImporter.java index 7a8f8f917..a551bca33 100644 --- a/docear_plugin_pdfutilities/src/org/docear/plugin/pdfutilities/pdf/PdfAnnotationImporter.java +++ b/docear_plugin_pdfutilities/src/org/docear/plugin/pdfutilities/pdf/PdfAnnotationImporter.java @@ -496,8 +496,7 @@ public AnnotationModel searchAnnotation(IAnnotation annotation) throws Exception } } - - private AnnotationModel searchAnnotation(List annotations, NodeModel node) { + public AnnotationModel searchAnnotation(List annotations, NodeModel node) { for(AnnotationModel annotation : annotations){ AnnotationModel extensionModel = AnnotationController.getModel(node, false); if(extensionModel == null){ From 4bd8d719f3b768546f30a56f4987c85701db0be4 Mon Sep 17 00:00:00 2001 From: Fredrik Teschke Date: Fri, 3 Mar 2017 11:28:59 +0100 Subject: [PATCH 2/2] fix progress update for docear/Desktop#500 --- .../plugin/pdfutilities/features/MonitoringWorker.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docear_plugin_pdfutilities/src/org/docear/plugin/pdfutilities/features/MonitoringWorker.java b/docear_plugin_pdfutilities/src/org/docear/plugin/pdfutilities/features/MonitoringWorker.java index c764b565c..3958ab6c7 100644 --- a/docear_plugin_pdfutilities/src/org/docear/plugin/pdfutilities/features/MonitoringWorker.java +++ b/docear_plugin_pdfutilities/src/org/docear/plugin/pdfutilities/features/MonitoringWorker.java @@ -227,13 +227,15 @@ private boolean searchingOrphanedNodes(NodeModel target) throws InterruptedExcep fireStatusUpdate(SwingWorkerDialog.SET_PROGRESS_BAR_DETERMINATE, null, null); fireStatusUpdate(SwingWorkerDialog.PROGRESS_BAR_TEXT, null, TextUtils.getText("AbstractMonitoringAction.11")); //$NON-NLS-1$ int count = 0; + int progressForStep1 = 30; + int progressForStep2 = 100 - progressForStep1; // Step 1: collect all files that have to be checked. Map> filesWithAnnotations = new HashMap>(); for (AnnotationID id : nodeIndex.keySet()) { if (canceled()) return false; count++; - fireProgressUpdate(100 * count / nodeIndex.keySet().size()); + fireProgressUpdate(progressForStep1 * count / nodeIndex.keySet().size()); if (importedFiles.containsKey(id)) continue; for (NodeModel node : nodeIndex.get(id)) { if (!isMonitoringNodeChild(target, node)) continue; @@ -253,8 +255,12 @@ private boolean searchingOrphanedNodes(NodeModel target) throws InterruptedExcep } } + count = 0; + int numberOfFiles = filesWithAnnotations.keySet().size(); // Step 2: Open each file only once, and check for orphaned annotations for (File file : filesWithAnnotations.keySet()) { + count++; + fireProgressUpdate(progressForStep1 + progressForStep2 * count / numberOfFiles); List nodes = filesWithAnnotations.get(file); if (file != null && !file.exists()) {