Gridarta Editor
FilterConfigDecoder.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 org.jetbrains.annotations.NotNull;
23 import org.jetbrains.annotations.Nullable;
24 
29 public class FilterConfigDecoder {
30 
34  @NotNull
35  private final StringBuilder sb = new StringBuilder();
36 
41  @NotNull
43 
44  @Override
45  public void visit(@NotNull final NamedFilterConfig filterConfig) {
47  filterConfig.getFilter().resetConfig(filterConfig);
48 
49  final boolean enabled = removePrefix("enabled");
50  filterConfig.setEnabled(enabled);
51  boolean first = !enabled;
52 
53  final boolean inverted = removePrefix(first ? "inverted" : ",inverted");
54  if (inverted) {
55  first = false;
56  }
57  filterConfig.setInverted(inverted);
58 
59  while (sb.length() > 0 && sb.charAt(0) != ')') {
60  if (first) {
61  first = false;
62  } else {
63  if (!removePrefix(",")) {
64  break;
65  }
66  }
67  final String key = FilterCodecUtils.decodeString(sb);
68  final FilterConfig<?, ?> subFilterConfig = filterConfig.getEntries().get(key);
69  if (subFilterConfig == null) {
70  throw new NumberFormatException("filter has no key '" + key + "'");
71  }
72  if (!removePrefix("=")) {
73  throw new NumberFormatException("syntax error");
74  }
75  decodeInternal(subFilterConfig);
76  }
77  }
78 
79  @Override
80  public void visit(@NotNull final NamedGameObjectMatcherFilterConfig filterConfig) {
82 
83  final boolean enabled = removePrefix("enabled");
84  filterConfig.setEnabled(enabled);
85  boolean first = !enabled;
86 
87  while (sb.length() > 0 && sb.charAt(0) != ')') {
88  if (first) {
89  first = false;
90  } else {
91  if (!removePrefix(",")) {
92  throw new NumberFormatException("syntax error");
93  }
94  }
95  final String key = FilterCodecUtils.decodeString(sb);
96  if (!removePrefix("=")) {
97  throw new NumberFormatException("syntax error");
98  }
99  filterConfig.setProperty(key, FilterCodecUtils.decodeString(sb));
100  }
101  }
102 
103  };
104 
109  @NotNull
111 
112  @Override
113  public void visit(@NotNull final NamedFilterConfig filterConfig) {
114  filterConfig.setEnabled(false);
115  filterConfig.setInverted(false);
116  filterConfig.getFilter().resetConfig(filterConfig);
117  filterConfig.getEntries().values().forEach(entry -> entry.accept(resetToDefaultsVisitor));
118  }
119 
120  @Override
121  public void visit(@NotNull final NamedGameObjectMatcherFilterConfig filterConfig) {
122  filterConfig.setEnabled(false);
123  filterConfig.removeAllProperties();
124  }
125 
126  };
127 
132  @Nullable
134 
142  public boolean decode(@NotNull final String string, @NotNull final FilterConfig<?, ?> filterConfig) {
143  sb.setLength(0);
144  sb.append(string);
145  try {
147  } catch (final IndexOutOfBoundsException | NumberFormatException ignored) {
148  return false;
149  }
150  return sb.length() == 0;
151  }
152 
157  private void decodeInternal(@NotNull final FilterConfig<?, ?> filterConfig) {
158  final FilterConfig<?, ?> prevFilterConfig = this.filterConfig;
159  try {
160  if (!removePrefix("(")) {
161  filterConfig.accept(resetToDefaultsVisitor);
162  return;
163  }
164  this.filterConfig = filterConfig;
166  if (!removePrefix(")")) {
167  throw new NumberFormatException("syntax error");
168  }
169  } finally {
170  this.filterConfig = prevFilterConfig;
171  }
172  }
173 
179  private boolean removePrefix(@NotNull final String string) {
180  final int length = string.length();
181  if (length > sb.length() || !sb.substring(0, length).equals(string)) {
182  return false;
183  }
184 
185  sb.delete(0, length);
186  return true;
187  }
188 
189 }
net.sf.gridarta.model.filter.FilterConfigDecoder.sb
final StringBuilder sb
Definition: FilterConfigDecoder.java:35
net.sf.gridarta.model.filter.FilterConfig.getFilter
F getFilter()
net.sf.gridarta.model.filter.NamedFilterConfig
Definition: NamedFilterConfig.java:34
net.sf.gridarta.model.filter.FilterConfig<?, ?>
net.sf.gridarta.model.filter.FilterCodecUtils.decodeString
static String decodeString(@NotNull final StringBuilder sb)
Definition: FilterCodecUtils.java:41
net.sf.gridarta.model.filter.FilterConfig.accept
void accept(@NotNull FilterConfigVisitor visitor)
net.sf.gridarta.model.filter.FilterCodecUtils
Definition: FilterCodecUtils.java:8
net.sf.gridarta.model.filter.FilterConfigVisitor
Definition: FilterConfigVisitor.java:28
net.sf.gridarta.model.filter.FilterConfigDecoder.visitor
final FilterConfigVisitor visitor
Definition: FilterConfigDecoder.java:42
net.sf.gridarta.model.filter.FilterConfigDecoder.decodeInternal
void decodeInternal(@NotNull final FilterConfig<?, ?> filterConfig)
Definition: FilterConfigDecoder.java:157
net.sf.gridarta.model.filter.FilterConfigDecoder.resetToDefaultsVisitor
final FilterConfigVisitor resetToDefaultsVisitor
Definition: FilterConfigDecoder.java:110
net.sf.gridarta.model.filter.FilterConfigDecoder.filterConfig
FilterConfig<?, ?> filterConfig
Definition: FilterConfigDecoder.java:133
net.sf.gridarta.model.filter.FilterConfigDecoder.decode
boolean decode(@NotNull final String string, @NotNull final FilterConfig<?, ?> filterConfig)
Definition: FilterConfigDecoder.java:142
net.sf.gridarta.model.filter.NamedGameObjectMatcherFilterConfig
Definition: NamedGameObjectMatcherFilterConfig.java:33
net.sf.gridarta.model.filter.FilterConfigDecoder.removePrefix
boolean removePrefix(@NotNull final String string)
Definition: FilterConfigDecoder.java:179
net.sf.gridarta.model.filter.FilterConfig.setEnabled
void setEnabled(boolean enabled)
net.sf.gridarta.model.filter.FilterConfigDecoder
Definition: FilterConfigDecoder.java:29