diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index a8a77b9..8f1cf05 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -16,6 +16,7 @@
diff --git a/.idea/runConfigurations/Debug_Robot_via_IP.xml b/.idea/runConfigurations/Debug_Robot_via_IP.xml
deleted file mode 100644
index 4c693ff..0000000
--- a/.idea/runConfigurations/Debug_Robot_via_IP.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/Debug_Robot_via_USB.xml b/.idea/runConfigurations/Debug_Robot_via_USB.xml
deleted file mode 100644
index b83b06c..0000000
--- a/.idea/runConfigurations/Debug_Robot_via_USB.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/lib/src/main/java/badgerlog/events/EventRegistry.java b/lib/src/main/java/badgerlog/events/EventRegistry.java
index 0989d46..b192431 100644
--- a/lib/src/main/java/badgerlog/events/EventRegistry.java
+++ b/lib/src/main/java/badgerlog/events/EventRegistry.java
@@ -6,12 +6,11 @@
import edu.wpi.first.networktables.NetworkTableInstance;
import edu.wpi.first.wpilibj.Timer;
-import java.util.ArrayList;
import java.util.EnumSet;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Queue;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue;
/**
@@ -19,7 +18,7 @@
*/
public class EventRegistry {
private static final Queue> eventQueue = new ConcurrentLinkedQueue<>();
- private static final Map>> watchedEntries = new HashMap<>();
+ private static final Map>> watchedEntries = new ConcurrentHashMap<>();
/**
* Activates any queued events from the previous loop
@@ -74,14 +73,14 @@ public static void registerWatcher(WatcherEvent> event, EventMetadata metadata
*/
public static void addWatchedEntry(NTEntry> entry, List watcherNames) {
for (String watcher : watcherNames) {
- List> entries = watchedEntries.computeIfAbsent(watcher, k -> new ArrayList<>());
+ Queue> entries = watchedEntries.computeIfAbsent(watcher, k -> new ConcurrentLinkedQueue<>());
entries.add(entry);
}
}
@SuppressWarnings("unchecked")
private static void addManagedWatcherEvent(WatcherEvent> event, EventMetadata metadata, NetworkTableEvent ntEvent) {
- List> namedEntries = watchedEntries.getOrDefault(metadata.name(), new ArrayList<>());
+ Queue> namedEntries = watchedEntries.getOrDefault(metadata.name(), new ConcurrentLinkedQueue<>());
for (NTEntry> entry : namedEntries) {
String actualKey = "/BadgerLog/" + entry.getKey();
diff --git a/lib/src/main/java/badgerlog/processing/EntryAspect.java b/lib/src/main/java/badgerlog/processing/EntryAspect.java
index 00a83f1..cc424e0 100644
--- a/lib/src/main/java/badgerlog/processing/EntryAspect.java
+++ b/lib/src/main/java/badgerlog/processing/EntryAspect.java
@@ -32,8 +32,10 @@
import java.lang.reflect.Member;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
+import java.util.List;
/**
* Utilizes AspectJ to weave entry generation and management into target classes.
@@ -41,6 +43,7 @@
@Aspect
public class EntryAspect {
private final Entries entries = new Entries(new HashMap<>());
+ private final List> blacklistedClasses = new ArrayList<>();
@Pointcut("!within(edu.wpi.first..*) && !within(badgerlog..*) && !within(java..*) && !within(javax..*)")
public void onlyRobotCode() {
@@ -73,6 +76,13 @@ public void getterMethodExecution(Entry entry) {
@After("onlyRobotCode() && staticinitialization(*)")
public void createStaticEntries(JoinPoint joinPoint) {
Class> clazz = joinPoint.getSignature().getDeclaringType();
+ if (blacklistedClasses.contains(clazz)) {
+ return;
+ }
+ if (!Members.hasAnyOfAnnotation(clazz, Entry.class)) {
+ blacklistedClasses.add(clazz);
+ }
+
entries.addInstance(clazz, null);
Members.iterateOverAnnotatedFields(clazz, Entry.class, true, field -> createFieldEntry(field, null));
@@ -83,7 +93,16 @@ public void createStaticEntries(JoinPoint joinPoint) {
@After("onlyRobotCode() && newInitialization()")
public void createInstanceEntries(JoinPoint joinPoint) {
Object instance = joinPoint.getThis();
- entries.addInstance(instance.getClass(), instance);
+ Class> clazz = joinPoint.getSignature().getDeclaringType();
+
+ if (blacklistedClasses.contains(clazz)) {
+ return;
+ }
+ if (!Members.hasAnyOfAnnotation(clazz, Entry.class)) {
+ blacklistedClasses.add(clazz);
+ }
+
+ entries.addInstance(clazz, instance);
Members.iterateOverAnnotatedFields(instance
.getClass(), Entry.class, false, field -> createFieldEntry(field, instance));
@@ -91,8 +110,8 @@ public void createInstanceEntries(JoinPoint joinPoint) {
Members.iterateOverAnnotatedMethods(instance
.getClass(), Entry.class, false, method -> createMethodEntry(method, instance));
- if (instance.getClass().isAnnotationPresent(Entry.class)) {
- Field[] allFields = instance.getClass().getFields();
+ if (clazz.isAnnotationPresent(Entry.class)) {
+ Field[] allFields = clazz.getFields();
Arrays.stream(allFields)
.filter(this::isValidForClassGeneration)
.forEach(field -> createFieldEntry(field, instance));
diff --git a/lib/src/main/java/badgerlog/processing/EventAspect.java b/lib/src/main/java/badgerlog/processing/EventAspect.java
index cde36eb..937501c 100644
--- a/lib/src/main/java/badgerlog/processing/EventAspect.java
+++ b/lib/src/main/java/badgerlog/processing/EventAspect.java
@@ -14,6 +14,8 @@
import org.aspectj.lang.annotation.Pointcut;
import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Map;
/**
@@ -22,6 +24,8 @@
@Aspect
public class EventAspect {
+ private final List> blacklistedClasses = new ArrayList<>();
+
@Pointcut("!within(edu.wpi.first..*) && !within(badgerlog..*) && !within(java..*) && !within(javax..*)")
public void onlyRobotCode() {
}
@@ -34,6 +38,13 @@ public void newInitialization() {
public void createStaticEvents(JoinPoint joinPoint) {
Class> clazz = joinPoint.getSignature().getDeclaringType();
+ if (blacklistedClasses.contains(clazz)) {
+ return;
+ }
+ if (!Members.hasAnyOfAnnotation(clazz, Watcher.class) && !Members.hasAnyOfAnnotation(clazz, RawWatcher.class)) {
+ blacklistedClasses.add(clazz);
+ }
+
Members.iterateOverAnnotatedMethods(clazz, Watcher.class, true, method -> handleWatcherMethod(method, null));
Members.iterateOverAnnotatedMethods(clazz, RawWatcher.class, true, method -> handleRawWatcherMethod(method, null));
}
@@ -43,6 +54,13 @@ public void createInstanceEvents(JoinPoint joinPoint) {
Class> clazz = joinPoint.getSignature().getDeclaringType();
Object workingClass = joinPoint.getThis();
+ if (blacklistedClasses.contains(clazz)) {
+ return;
+ }
+ if (!Members.hasAnyOfAnnotation(clazz, Watcher.class) && !Members.hasAnyOfAnnotation(clazz, RawWatcher.class)) {
+ blacklistedClasses.add(clazz);
+ }
+
Members.iterateOverAnnotatedMethods(clazz, Watcher.class, false, method -> handleWatcherMethod(method, workingClass));
Members.iterateOverAnnotatedMethods(clazz, RawWatcher.class, false, method -> handleRawWatcherMethod(method, workingClass));
}
diff --git a/lib/src/main/java/badgerlog/processing/data/ClassData.java b/lib/src/main/java/badgerlog/processing/data/ClassData.java
index 327c989..8a5e2d4 100644
--- a/lib/src/main/java/badgerlog/processing/data/ClassData.java
+++ b/lib/src/main/java/badgerlog/processing/data/ClassData.java
@@ -1,5 +1,7 @@
package badgerlog.processing.data;
+import lombok.Getter;
+
import java.lang.reflect.Field;
import java.util.Map;
import java.util.Objects;
@@ -7,14 +9,21 @@
/**
* Holds the data used for an entire class with entries inside. Contains all instances of the class.
*/
-public record ClassData(Map fieldMap, Map