Skip to content

Commit

Permalink
Make class thread safe.
Browse files Browse the repository at this point in the history
  • Loading branch information
mnlipp committed Apr 17, 2024
1 parent 98f5c1e commit b58c813
Showing 1 changed file with 25 additions and 29 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -30,7 +31,8 @@
@SuppressWarnings("PMD.DataflowAnomalyAnalysis")
public class TimeSeries {

private final List<Entry> data = new LinkedList<>();
@SuppressWarnings("PMD.LooseCoupling")
private final LinkedList<Entry> data = new LinkedList<>();
private final Duration period;

/**
Expand All @@ -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;
}
Expand All @@ -81,14 +84,16 @@ public TimeSeries add(Instant time, Number... numbers) {
* @return the list
*/
public List<Entry> 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;

/**
Expand All @@ -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.
*
Expand Down

0 comments on commit b58c813

Please # to comment.