Skip to content

Commit c97d1e3

Browse files
committed
Better way to handle filter references
1 parent 0e84ca8 commit c97d1e3

File tree

2 files changed

+50
-2
lines changed

2 files changed

+50
-2
lines changed

src/main/java/in/twizmwaz/cardinal/module/filter/FilterModule.java

+17-2
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
import in.twizmwaz.cardinal.module.filter.type.CreatureFilter;
5454
import in.twizmwaz.cardinal.module.filter.type.CrouchingFilter;
5555
import in.twizmwaz.cardinal.module.filter.type.EntityFilter;
56+
import in.twizmwaz.cardinal.module.filter.type.FilterReference;
5657
import in.twizmwaz.cardinal.module.filter.type.FlyingFilter;
5758
import in.twizmwaz.cardinal.module.filter.type.HoldingFilter;
5859
import in.twizmwaz.cardinal.module.filter.type.LayerFilter;
@@ -83,13 +84,16 @@
8384
import org.jdom2.Element;
8485
import org.jdom2.located.Located;
8586

87+
import java.util.ArrayList;
8688
import java.util.Collection;
89+
import java.util.List;
8790
import java.util.Map;
8891

8992
@ModuleEntry(depends = {RegionModule.class, TeamModule.class})
9093
public class FilterModule extends AbstractModule implements Listener {
9194

9295
private Map<Match, Map<String, Filter>> filters = Maps.newHashMap();
96+
private Map<Match, List<FilterReference>> references = Maps.newHashMap();
9397

9498
//Static filters. Can be shared across matches, because they use no arguments
9599
public static final Filter ALLOW = new StaticFilter(FilterState.ALLOW);
@@ -114,6 +118,7 @@ public FilterModule() {
114118
@Override
115119
public boolean loadMatch(@NonNull Match match) {
116120
filters.put(match, Maps.newHashMap());
121+
references.put(match, new ArrayList<>());
117122
for (Element filtersElement : match.getMap().getDocument().getRootElement().getChildren("filters")) {
118123
for (Element filterElement : filtersElement.getChildren()) {
119124
filters.get(match).put("always", ALLOW);
@@ -125,6 +130,10 @@ public boolean loadMatch(@NonNull Match match) {
125130
}
126131
}
127132
}
133+
for (FilterReference reference : references.get(match)) {
134+
reference.load(this, match);
135+
}
136+
references.remove(match);
128137
return true;
129138
}
130139

@@ -158,6 +167,12 @@ public Filter getFilter(@NonNull Match match, @NonNull String id) {
158167
return filters.get(match).get(id);
159168
}
160169

170+
public Filter getFilterReference(@NonNull Match match, @NonNull String id) {
171+
FilterReference reference = new FilterReference(id);
172+
references.get(match).add(reference);
173+
return reference;
174+
}
175+
161176
/**
162177
* Parses an element for a filter.
163178
*
@@ -312,7 +327,7 @@ public Filter getFilter(Match match, Element element, String... alternateAttribu
312327
for (String alternateAttribute : alternateAttributes) {
313328
String filterValue = element.getAttributeValue(alternateAttribute);
314329
if (filterValue != null) {
315-
Filter filter = getFilter(match, filterValue);
330+
Filter filter = getFilterReference(match, filterValue);
316331
if (filter != null) {
317332
return checkFilter(match, id, filter);
318333
}
@@ -321,7 +336,7 @@ public Filter getFilter(Match match, Element element, String... alternateAttribu
321336

322337
String filterValue = element.getAttributeValue("id");
323338
if (filterValue != null) {
324-
Filter filter = getFilter(match, filterValue);
339+
Filter filter = getFilterReference(match, filterValue);
325340
if (filter != null) {
326341
return checkFilter(match, id, filter);
327342
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package in.twizmwaz.cardinal.module.filter.type;
2+
3+
import in.twizmwaz.cardinal.match.Match;
4+
import in.twizmwaz.cardinal.module.ModuleError;
5+
import in.twizmwaz.cardinal.module.filter.Filter;
6+
import in.twizmwaz.cardinal.module.filter.FilterModule;
7+
import in.twizmwaz.cardinal.module.filter.FilterState;
8+
import lombok.RequiredArgsConstructor;
9+
10+
@RequiredArgsConstructor
11+
public class FilterReference implements Filter {
12+
13+
private final String id;
14+
private Filter filter;
15+
16+
public void load(FilterModule module, Match match) {
17+
filter = module.getFilter(match, id);
18+
if (filter == null) {
19+
module.getErrors().add(
20+
new ModuleError(module, match.getMap(), new String[]{"Could not find filter for id \'" + id + "\'"}, false));
21+
}
22+
}
23+
24+
@Override
25+
public FilterState evaluate(Object... objects) {
26+
if (filter != null) {
27+
return filter.evaluate(objects);
28+
} else {
29+
return FilterState.ABSTAIN;
30+
}
31+
}
32+
33+
}

0 commit comments

Comments
 (0)