Gridarta Editor
NamedFilter.java
Go to the documentation of this file.
1 /*
2  * Gridarta MMORPG map editor for Crossfire, Daimonin and similar games.
3  * Copyright (C) 2000-2015 The Gridarta Developers.
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along
16  * with this program; if not, write to the Free Software Foundation, Inc.,
17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18  */
19 
20 package net.sf.gridarta.model.filter;
21 
22 import java.util.Collection;
23 import java.util.LinkedHashMap;
24 import java.util.Map;
25 import java.util.Map.Entry;
26 import java.util.concurrent.CopyOnWriteArrayList;
29 import org.apache.log4j.Category;
30 import org.apache.log4j.Logger;
31 import org.jetbrains.annotations.NotNull;
32 
41 public class NamedFilter implements Filter<NamedFilter, NamedFilterConfig> {
42 
46  @NotNull
47  private static final Category LOG = Logger.getLogger(NamedFilter.class);
48 
52  @NotNull
53  private final Map<String, Filter<?, ?>> subFilters;
54 
59  @NotNull
60  private final Collection<NamedFilterListener> listenerList = new CopyOnWriteArrayList<>();
61 
66  public NamedFilter(@NotNull final Iterable<NamedGameObjectMatcher> matchers) {
67  subFilters = new LinkedHashMap<>();
68  for (final NamedGameObjectMatcher matcher : matchers) { // FIXME: use localized name; FIXME: sort by name
69  subFilters.put(matcher.getName(), new NamedGameObjectMatcherFilter(matcher));
70  }
71  }
72 
77  public void resetConfig(@NotNull final NamedFilterConfig config) {
78  for (final String name : subFilters.keySet()) {
79  config.setSubFilterEnabled(name, false);
80  }
81  }
82 
83  @Override
84  public boolean match(@NotNull final NamedFilterConfig config, @NotNull final GameObject<?, ?, ?> gameObject) {
85  try {
86  if (LOG.isDebugEnabled()) {
87  LOG.debug("match called on " + gameObject.getArchetype().getArchetypeName());
88  }
89  for (final String name : subFilters.keySet()) {
90  if (LOG.isDebugEnabled()) {
91  LOG.debug("checking if filter " + name + " is enabled()");
92  }
93  if (config.isSubFilterEnabled(name)) {
94  if (LOG.isDebugEnabled()) {
95  LOG.debug("enabled!");
96  }
97  if (config.getConfig(name).match(gameObject)) {
98  if (LOG.isDebugEnabled()) {
99  LOG.debug("and matched!");
100  }
101  return !config.isInverted();
102  }
103  }
104  }
105  if (LOG.isDebugEnabled()) {
106  LOG.debug("finished scanning sub filters");
107  }
108  return config.isInverted();
109  } catch (final Exception e) {
110  return false;
111  }
112  }
113 
114  @Override
115  public boolean reset(@NotNull final NamedFilterConfig config) {
116  try {
117  boolean didMatch = false;
118  for (final String name : subFilters.keySet()) {
119  final FilterConfig<?, ?> filterConfig = config.getConfig(name);
120  if (filterConfig.reset()) {
121  didMatch = true;
122  }
123  }
124  return didMatch ^ config.isInverted();
125  } catch (final Exception e) {
126  return false;
127  }
128  }
129 
130  @Override
131  public boolean hasGlobalMatch(@NotNull final NamedFilterConfig config) {
132  return false;
133  }
134 
135  @NotNull
136  @Override
138  final NamedFilterConfig filterConfig = new NamedFilterConfig(this);
139  for (final Entry<String, Filter<?, ?>> filterEntry : subFilters.entrySet()) {
140  fireEvent(NamedFilterChangeType.ADD, filterEntry.getKey(), filterEntry.getValue());
141  }
142  resetConfig(filterConfig);
143  return filterConfig;
144  }
145 
151  public void addFilter(@NotNull final String name, @NotNull final Filter<?, ?> filter) {
152  if (subFilters.containsKey(name)) {
153  return;
154  }
155 
156  subFilters.put(name, filter);
157  fireEvent(NamedFilterChangeType.ADD, name, filter);
158  }
159 
164  public void removeFilter(@NotNull final String name) {
165  final Filter<?, ?> filter = subFilters.remove(name);
166  if (filter == null) {
167  return;
168  }
169 
170  fireEvent(NamedFilterChangeType.REMOVE, name, filter);
171  }
172 
179  private void fireEvent(@NotNull final NamedFilterChangeType type, @NotNull final String filterName, @NotNull final Filter<?, ?> filter) {
180  for (final NamedFilterListener listener : listenerList) {
181  listener.nameFilterChanged(type, filterName, filter);
182  }
183  }
184 
189  public void addFilterListener(@NotNull final NamedFilterListener listener) {
190  listenerList.add(listener);
191  }
192 
197  public void removeFilterListener(@NotNull final NamedFilterListener listener) {
198  listenerList.remove(listener);
199  }
200 
207  public boolean canShow(@NotNull final GameObject<?, ?, ?> gameObject, @NotNull final NamedFilterConfig filterOutConfig) {
208  reset(filterOutConfig);
209  if (hasGlobalMatch(filterOutConfig)) {
210  match(filterOutConfig, gameObject);
211  return !reset(filterOutConfig);
212  }
213 
214  return !match(filterOutConfig, gameObject);
215  }
216 
217 }
net.sf.gridarta.model.filter.NamedFilter.removeFilterListener
void removeFilterListener(@NotNull final NamedFilterListener listener)
Definition: NamedFilter.java:197
net.sf.gridarta.model.filter.NamedFilter.fireEvent
void fireEvent(@NotNull final NamedFilterChangeType type, @NotNull final String filterName, @NotNull final Filter<?, ?> filter)
Definition: NamedFilter.java:179
net.sf.gridarta.model.filter.NamedFilter.LOG
static final Category LOG
Definition: NamedFilter.java:47
net.sf.gridarta.model.filter.NamedFilter.removeFilter
void removeFilter(@NotNull final String name)
Definition: NamedFilter.java:164
net.sf.gridarta.model.filter.Filter
Definition: Filter.java:33
net.sf.gridarta.model.filter.NamedFilterChangeType
Definition: NamedFilterChangeType.java:26
net.sf.gridarta
net.sf
net.sf.gridarta.model.filter.NamedFilter.NamedFilter
NamedFilter(@NotNull final Iterable< NamedGameObjectMatcher > matchers)
Definition: NamedFilter.java:66
net.sf.gridarta.model.filter.NamedFilterConfig
Definition: NamedFilterConfig.java:34
net.sf.gridarta.model.gameobject.GameObject
Definition: GameObject.java:36
net.sf.gridarta.model.filter.NamedFilterChangeType.REMOVE
REMOVE
Definition: NamedFilterChangeType.java:30
net.sf.gridarta.model.filter.NamedFilter.match
boolean match(@NotNull final NamedFilterConfig config, @NotNull final GameObject<?, ?, ?> gameObject)
Definition: NamedFilter.java:84
net.sf.gridarta.model.filter.FilterConfig<?, ?>
net.sf.gridarta.model.filter.NamedFilter.addFilterListener
void addFilterListener(@NotNull final NamedFilterListener listener)
Definition: NamedFilter.java:189
net.sf.gridarta.model.match.NamedGameObjectMatcher
Definition: NamedGameObjectMatcher.java:33
net.sf.gridarta.model.gameobject
Definition: AbstractGameObject.java:20
net
net.sf.gridarta.model.filter.NamedFilter.canShow
boolean canShow(@NotNull final GameObject<?, ?, ?> gameObject, @NotNull final NamedFilterConfig filterOutConfig)
Definition: NamedFilter.java:207
net.sf.gridarta.model.filter.FilterConfig.reset
boolean reset()
net.sf.gridarta.model.match
Definition: AndGameObjectMatcher.java:20
net.sf.gridarta.model.filter.NamedFilterListener
Definition: NamedFilterListener.java:29
net.sf.gridarta.model.filter.NamedFilter.subFilters
final Map< String, Filter<?, ?> > subFilters
Definition: NamedFilter.java:53
net.sf.gridarta.model.filter.NamedFilter.reset
boolean reset(@NotNull final NamedFilterConfig config)
Definition: NamedFilter.java:115
net.sf.gridarta.model.filter.NamedGameObjectMatcherFilter
Definition: NamedGameObjectMatcherFilter.java:31
net.sf.gridarta.model.filter.NamedFilterChangeType.ADD
ADD
Definition: NamedFilterChangeType.java:28
net.sf.gridarta.model.filter.NamedFilter.createConfig
NamedFilterConfig createConfig()
Definition: NamedFilter.java:137
net.sf.gridarta.model.filter.NamedFilter.addFilter
void addFilter(@NotNull final String name, @NotNull final Filter<?, ?> filter)
Definition: NamedFilter.java:151
net.sf.gridarta.model
net.sf.gridarta.model.filter.NamedFilter.listenerList
final Collection< NamedFilterListener > listenerList
Definition: NamedFilter.java:60
net.sf.gridarta.var.crossfire.model.gameobject.GameObject<?, ?, ?>
net.sf.gridarta.model.filter.NamedFilter
Definition: NamedFilter.java:41
net.sf.gridarta.model.filter.NamedFilter.hasGlobalMatch
boolean hasGlobalMatch(@NotNull final NamedFilterConfig config)
Definition: NamedFilter.java:131
net.sf.gridarta.model.filter.NamedFilter.resetConfig
void resetConfig(@NotNull final NamedFilterConfig config)
Definition: NamedFilter.java:77