summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Matthias Jaros <jarlucmat@mailbox.org>2026-08-01 15:54:14 +0200
committerGravatar Matthias Jaros <jarlucmat@mailbox.org>2026-08-01 15:54:14 +0200
commit31ce828c187bd3f4f41da33512c15775e0224798 (patch)
treec5fc1264db5e21b3a35b1b8e94d1dfdb8466b92a
parentfc214210c580f89de40e7c4200f52981e137e435 (diff)
Added PortResultAccumulator to reduce mental load and have an object
that collects and unifies all important fields for scanREsult instead of keeping them in the method
-rw-r--r--src/main/java/com/it_jaros/jscanner/Scanner.java78
1 files changed, 48 insertions, 30 deletions
diff --git a/src/main/java/com/it_jaros/jscanner/Scanner.java b/src/main/java/com/it_jaros/jscanner/Scanner.java
index a90fc55..021eb32 100644
--- a/src/main/java/com/it_jaros/jscanner/Scanner.java
+++ b/src/main/java/com/it_jaros/jscanner/Scanner.java
@@ -231,16 +231,18 @@ public class Scanner implements AutoCloseable {
* @return
*/
private ScanResult scanHostPorts(final String host, final Scan scan) {
- PortRange portRange = new PortRange(scan.getPorts());
- BitSet openPorts = new BitSet(PortRange.MAX_PORT);
- BitSet filteredPorts = new BitSet(PortRange.MAX_PORT);
- HashMap<Integer, ServiceType> serviceTypes = new HashMap<>();
-
if (!disableOnlineCheck && !checkHostOnline(host)) {
// Unreachable host
- return new ScanResult(host, openPorts, filteredPorts, serviceTypes, List.of());
+ return new ScanResult(
+ host,
+ new BitSet(PortRange.MAX_PORT),
+ new BitSet(PortRange.MAX_PORT),
+ new HashMap<>(),
+ List.of()
+ );
}
+ final PortRange portRange = new PortRange(scan.getPorts());
final AtomicLong portSlotFactory = new AtomicLong(System.nanoTime());
// producer thread
ProducerState<PortResult> state = startProducer(
@@ -250,10 +252,10 @@ public class Scanner implements AutoCloseable {
scan.getThreadCounter()
);
- List<ScanFailure> scanFailures = new ArrayList<>();
// consumer is the main thread
// we run as long as the producer is running or as long as things are in pipeline to be processed
// only exception is when cancelled is set
+ final PortResultAccumulator accumulator = new PortResultAccumulator(host);
while (!cancelled && (state.running().get() || state.inPipeline().get() > 0)) {
try {
PortResult portResult = getPortResult(state);
@@ -261,13 +263,13 @@ public class Scanner implements AutoCloseable {
continue;
}
- handlePortResult(portResult, openPorts, serviceTypes, filteredPorts, scanFailures);
+ accumulator.add(portResult);
} catch (InterruptedException ignored) {
Thread.currentThread().interrupt();
}
}
- return new ScanResult(host, openPorts, filteredPorts, serviceTypes, scanFailures);
+ return accumulator.build();
}
private boolean checkHostOnline(String host) {
@@ -298,27 +300,6 @@ public class Scanner implements AutoCloseable {
}
return portResult;
}
-
- private void handlePortResult(PortResult portResult, BitSet openPorts, HashMap<Integer, ServiceType> serviceTypes, BitSet filteredPorts, List<ScanFailure> scanFailures) {
- switch (portResult.getState()) {
- case OPEN -> {
- // bitset is not thread-safe, so it is set
- // outside the other virtual threads that update progress
- openPorts.set(portResult.getPort());
- serviceTypes.put(portResult.getPort(), ServiceDetector.detect(portResult.getBanner()));
- }
- case FILTERED -> {
- filteredPorts.set(portResult.getPort());
- }
- default -> {
- // sonarcube glücklich machen
- }
- }
- Exception e = portResult.getException();
- if (e != null) {
- scanFailures.add(new ScanFailure(portResult.getPort(), ExceptionInfo.from(e)));
- }
- }
}
private final class ScanPortTask implements Callable<PortResult> {
@@ -405,4 +386,41 @@ public class Scanner implements AutoCloseable {
return null;
}
}
+
+ private final class PortResultAccumulator {
+ private final String host;
+ private final BitSet openPorts = new BitSet(PortRange.MAX_PORT);
+ private final BitSet filteredPorts = new BitSet(PortRange.MAX_PORT);
+ private final Map<Integer, ServiceType> serviceTypes = new HashMap<>();
+ private final List<ScanFailure> scanFailures = new ArrayList<>();
+
+ private PortResultAccumulator(String host) {
+ this.host = host;
+ }
+
+ void add(PortResult portResult) {
+ switch (portResult.getState()) {
+ case OPEN -> {
+ // bitset is not thread-safe, so it is set
+ // outside the other virtual threads that update progress
+ openPorts.set(portResult.getPort());
+ serviceTypes.put(portResult.getPort(), ServiceDetector.detect(portResult.getBanner()));
+ }
+ case FILTERED -> {
+ filteredPorts.set(portResult.getPort());
+ }
+ default -> {
+ // sonarcube glücklich machen
+ }
+ }
+ Exception e = portResult.getException();
+ if (e != null) {
+ scanFailures.add(new ScanFailure(portResult.getPort(), ExceptionInfo.from(e)));
+ }
+ }
+
+ ScanResult build() {
+ return new ScanResult(host, openPorts, filteredPorts, serviceTypes, scanFailures);
+ }
+ }
}