|
|
@@ -0,0 +1,43 @@
|
|
|
+package org.leumasjaffe.charsheet.model.features.pred;
|
|
|
+
|
|
|
+import java.util.Collection;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+import org.leumasjaffe.charsheet.model.features.DDFeaturePredicate;
|
|
|
+import org.leumasjaffe.charsheet.model.magic.DDSpell;
|
|
|
+
|
|
|
+import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
+
|
|
|
+import lombok.AllArgsConstructor;
|
|
|
+import lombok.NonNull;
|
|
|
+import lombok.SneakyThrows;
|
|
|
+
|
|
|
+@AllArgsConstructor
|
|
|
+public class SpellMatcher implements DDFeaturePredicate {
|
|
|
+ @NonNull Map<String, Object> properties;
|
|
|
+
|
|
|
+ @Override @SneakyThrows
|
|
|
+ public boolean accepts(Object value) {
|
|
|
+ if (!(value instanceof DDSpell)) return false;
|
|
|
+ final ObjectMapper mapper = new ObjectMapper();
|
|
|
+ @SuppressWarnings("unchecked")
|
|
|
+ Map<String, Object> json = mapper.treeToValue(mapper.valueToTree((DDSpell) value), Map.class);
|
|
|
+ for (final String key : properties.keySet()) {
|
|
|
+ if (!matches(properties.get(key), json.get(key))) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ @SuppressWarnings("unchecked")
|
|
|
+ private boolean matches(Object match, Object json) {
|
|
|
+ if (match instanceof String) {
|
|
|
+ return ((String) json).matches((String) match);
|
|
|
+ } else if (match instanceof Collection) {
|
|
|
+ ((Collection<String>) json).containsAll((Collection<String>) match);
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|