aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/org/traccar/config/Keys.java9
-rw-r--r--src/main/java/org/traccar/handler/ComputedAttributesHandler.java24
2 files changed, 29 insertions, 4 deletions
diff --git a/src/main/java/org/traccar/config/Keys.java b/src/main/java/org/traccar/config/Keys.java
index 23a983e7b..15bfec09d 100644
--- a/src/main/java/org/traccar/config/Keys.java
+++ b/src/main/java/org/traccar/config/Keys.java
@@ -1482,13 +1482,20 @@ public final class Keys {
List.of(KeyType.CONFIG, KeyType.DEVICE));
/**
- * Enable computed attributes processing.
+ * Include device attributes in the computed attribute context.
*/
public static final ConfigKey<Boolean> PROCESSING_COMPUTED_ATTRIBUTES_DEVICE_ATTRIBUTES = new BooleanConfigKey(
"processing.computedAttributes.deviceAttributes",
List.of(KeyType.CONFIG));
/**
+ * Include last position attributes in the computed attribute context.
+ */
+ public static final ConfigKey<Boolean> PROCESSING_COMPUTED_ATTRIBUTES_LAST_ATTRIBUTES = new BooleanConfigKey(
+ "processing.computedAttributes.lastAttributes",
+ List.of(KeyType.CONFIG));
+
+ /**
* Enable local variables declaration.
*/
public static final ConfigKey<Boolean> PROCESSING_COMPUTED_ATTRIBUTES_LOCAL_VARIABLES = new BooleanConfigKey(
diff --git a/src/main/java/org/traccar/handler/ComputedAttributesHandler.java b/src/main/java/org/traccar/handler/ComputedAttributesHandler.java
index 042747359..3f8a8c0bd 100644
--- a/src/main/java/org/traccar/handler/ComputedAttributesHandler.java
+++ b/src/main/java/org/traccar/handler/ComputedAttributesHandler.java
@@ -59,6 +59,7 @@ public class ComputedAttributesHandler extends BaseDataHandler {
private final JexlFeatures features;
private final boolean includeDeviceAttributes;
+ private final boolean includeLastAttributes;
@Inject
public ComputedAttributesHandler(Config config, CacheManager cacheManager) {
@@ -81,6 +82,7 @@ public class ComputedAttributesHandler extends BaseDataHandler {
.sandbox(sandbox)
.create();
includeDeviceAttributes = config.getBoolean(Keys.PROCESSING_COMPUTED_ATTRIBUTES_DEVICE_ATTRIBUTES);
+ includeLastAttributes = config.getBoolean(Keys.PROCESSING_COMPUTED_ATTRIBUTES_LAST_ATTRIBUTES);
}
private MapContext prepareContext(Position position) {
@@ -93,6 +95,10 @@ public class ComputedAttributesHandler extends BaseDataHandler {
}
}
}
+ Position last = null;
+ if (includeLastAttributes) {
+ last = cacheManager.getPosition(position.getDeviceId());
+ }
Set<Method> methods = new HashSet<>(Arrays.asList(position.getClass().getMethods()));
Arrays.asList(Object.class.getMethods()).forEach(methods::remove);
for (Method method : methods) {
@@ -102,9 +108,17 @@ public class ComputedAttributesHandler extends BaseDataHandler {
try {
if (!method.getReturnType().equals(Map.class)) {
result.set(name, method.invoke(position));
+ if (last != null) {
+ result.set(prefixAttribute("last", name), method.invoke(last));
+ }
} else {
- for (Object key : ((Map<?, ?>) method.invoke(position)).keySet()) {
- result.set((String) key, ((Map<?, ?>) method.invoke(position)).get(key));
+ for (Map.Entry<?, ?> entry : ((Map<?, ?>) method.invoke(position)).entrySet()) {
+ result.set((String) entry.getKey(), entry.getValue());
+ }
+ if (last != null) {
+ for (Map.Entry<?, ?> entry : ((Map<?, ?>) method.invoke(last)).entrySet()) {
+ result.set(prefixAttribute("last", (String) entry.getKey()), entry.getValue());
+ }
}
}
} catch (IllegalAccessException | InvocationTargetException error) {
@@ -112,7 +126,11 @@ public class ComputedAttributesHandler extends BaseDataHandler {
}
}
}
- return result;
+ return result;//Character.toUpperCase(column.charAt(0)) + column.substring(1)
+ }
+
+ private String prefixAttribute(String prefix, String key) {
+ return prefix + Character.toUpperCase(key.charAt(0)) + key.substring(1);
}
/**