From b58c813e897249737265540ce2e0f39c62a34f50 Mon Sep 17 00:00:00 2001 From: "Michael N. Lipp" Date: Wed, 17 Apr 2024 11:20:11 +0200 Subject: [PATCH] Make class thread safe. --- .../vmoperator/vmconlet/TimeSeries.java | 54 +++++++++---------- 1 file changed, 25 insertions(+), 29 deletions(-) diff --git a/org.jdrupes.vmoperator.vmconlet/src/org/jdrupes/vmoperator/vmconlet/TimeSeries.java b/org.jdrupes.vmoperator.vmconlet/src/org/jdrupes/vmoperator/vmconlet/TimeSeries.java index c7f634b8e..ee1667c76 100644 --- a/org.jdrupes.vmoperator.vmconlet/src/org/jdrupes/vmoperator/vmconlet/TimeSeries.java +++ b/org.jdrupes.vmoperator.vmconlet/src/org/jdrupes/vmoperator/vmconlet/TimeSeries.java @@ -20,6 +20,7 @@ import java.time.Duration; import java.time.Instant; +import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList; import java.util.List; @@ -30,7 +31,8 @@ @SuppressWarnings("PMD.DataflowAnomalyAnalysis") public class TimeSeries { - private final List data = new LinkedList<>(); + @SuppressWarnings("PMD.LooseCoupling") + private final LinkedList data = new LinkedList<>(); private final Duration period; /** @@ -52,25 +54,26 @@ public TimeSeries(Duration period) { @SuppressWarnings("PMD.AvoidLiteralsInIfCondition") public TimeSeries add(Instant time, Number... numbers) { var newEntry = new Entry(time, numbers); - boolean adjust = false; - if (data.size() >= 2) { - var lastEntry = data.get(data.size() - 1); - var lastButOneEntry = data.get(data.size() - 2); - adjust = lastEntry.valuesEqual(lastButOneEntry) - && lastEntry.valuesEqual(newEntry); - } - if (adjust) { - data.get(data.size() - 1).adjustTime(time); - } else { + boolean nothingNew = false; + synchronized (data) { + if (data.size() >= 2) { + var lastEntry = data.get(data.size() - 1); + var lastButOneEntry = data.get(data.size() - 2); + nothingNew = lastEntry.valuesEqual(lastButOneEntry) + && lastEntry.valuesEqual(newEntry); + } + if (nothingNew) { + data.removeLast(); + } data.add(new Entry(time, numbers)); - } - // Purge - Instant limit = time.minus(period); - while (data.size() > 2 - && data.get(0).getTime().isBefore(limit) - && data.get(1).getTime().isBefore(limit)) { - data.remove(0); + // Purge + Instant limit = time.minus(period); + while (data.size() > 2 + && data.get(0).getTime().isBefore(limit) + && data.get(1).getTime().isBefore(limit)) { + data.removeFirst(); + } } return this; } @@ -81,14 +84,16 @@ public TimeSeries add(Instant time, Number... numbers) { * @return the list */ public List entries() { - return data; + synchronized (data) { + return new ArrayList<>(data); + } } /** * The Class Entry. */ public static class Entry { - private Instant timestamp; + private final Instant timestamp; private final Number[] values; /** @@ -103,15 +108,6 @@ public Entry(Instant time, Number... numbers) { values = numbers; } - /** - * Changes the entry's time. - * - * @param time the time - */ - public void adjustTime(Instant time) { - timestamp = time; - } - /** * Returns the entry's time. *