Gridarta Editor
ValidationError.java
Go to the documentation of this file.
1 /*
2  * Gridarta MMORPG map editor for Crossfire, Daimonin and similar games.
3  * Copyright (C) 2000-2023 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.validation.errors;
21 
22 import java.io.Serializable;
23 import java.util.ArrayList;
24 import java.util.Collection;
25 import java.util.Collections;
26 import java.util.List;
33 import net.sf.japi.swing.action.ActionBuilder;
34 import net.sf.japi.swing.action.ActionBuilderFactory;
35 import org.jetbrains.annotations.NotNull;
36 import org.jetbrains.annotations.Nullable;
37 
45 public abstract class ValidationError<G extends GameObject<G, A, R>, A extends MapArchObject<A>, R extends Archetype<G, A, R>> implements Serializable {
46 
50  private static final int TITLE_MAP_SQUARES = 3;
51 
55  private static final int TITLE_GAME_OBJECTS = 5;
56 
60  private static final long serialVersionUID = 1L;
61 
65  @NotNull
66  private static final ActionBuilder ACTION_BUILDER = ActionBuilderFactory.getInstance().getActionBuilder("net.sf.gridarta");
67 
72  @NotNull
73  private final String key;
74 
79  @NotNull
80  private final MapModel<G, A, R> mapModel;
81 
86  @NotNull
87  private final List<MapSquare<G, A, R>> mapSquares = new ArrayList<>(0);
88 
93  @NotNull
94  private final List<G> gameObjects = new ArrayList<>(0);
95 
101  @NotNull
103 
109  @NotNull
111 
119  protected ValidationError(@NotNull final MapModel<G, A, R> mapModel) throws IllegalArgumentException {
120  final String name = getClass().getSimpleName();
121  if (!name.endsWith("Error")) {
122  throw new IllegalArgumentException("Class name must end with \"Error\"");
123  }
124  key = "Validator." + name.substring(0, name.indexOf("Error"));
125  this.mapModel = mapModel;
126  }
127 
133  protected ValidationError(@NotNull final String key, @NotNull final MapModel<G, A, R> mapModel) {
134  this.key = key;
135  this.mapModel = mapModel;
136  }
137 
142  @NotNull
144  return mapModel;
145  }
146 
151  @NotNull
152  public Iterable<MapSquare<G, A, R>> getMapSquares() {
153  return Collections.unmodifiableList(mapSquares);
154  }
155 
160  protected void addMapSquare(@NotNull final MapSquare<G, A, R> mapSquare) {
161  if (!mapSquares.contains(mapSquare)) {
162  if (mapSquare.getMapModel() != mapModel) {
163  throw new IllegalArgumentException("map square is not part of this map");
164  }
165  mapSquares.add(mapSquare);
166  }
167  }
168 
173  @NotNull
174  public List<G> getGameObjects() {
175  return Collections.unmodifiableList(gameObjects);
176  }
177 
182  protected void addGameObject(@NotNull final G gameObject) {
183  if (!gameObjects.contains(gameObject)) {
184  gameObjects.add(gameObject);
185  addMapSquare(gameObject.getMapSquare());
186  }
187  }
188 
195  @Nullable
196  public abstract String getParameter(int id);
197 
204  @NotNull
205  public String getMessage() {
206  final int x;
207  final int y;
208  if (mapSquares.isEmpty()) {
209  x = 0;
210  y = 0;
211  } else {
212  final MapSquare<G, A, R> mapSquare = mapSquares.get(0);
213  x = mapSquare == null ? -1 : mapSquare.getMapX();
214  y = mapSquare == null ? -1 : mapSquare.getMapY();
215  }
216  final String archName = gameObjects.isEmpty() ? null : gameObjects.get(0).getBestName();
217  final String parameter0 = getParameter(0);
218  final String parameter1 = getParameter(1);
219  final String parameter2 = getParameter(2);
220  final String parameter3 = getParameter(3);
221  final StringBuilder sb = new StringBuilder();
222  if (mapSquares.size() > 1) {
223  appendMapSquares(sb);
224  }
225  appendTitle(sb);
226  appendGameObjects(sb);
227  return ACTION_BUILDER.format(key + ".msg", HtmlUtils.encode(sb.toString()), x, y, HtmlUtils.encodeOptional(archName), HtmlUtils.encodeOptional(parameter0), HtmlUtils.encodeOptional(parameter1), HtmlUtils.encodeOptional(parameter2), HtmlUtils.encodeOptional(parameter3));
228  }
229 
233  @Nullable
234  @Override
235  public String toString() {
236  final StringBuilder sb = new StringBuilder();
237  appendMapSquares(sb);
238  appendTitle(sb);
239  appendGameObjects(sb);
240  return sb.toString();
241  }
242 
247  private void appendMapSquares(@NotNull final StringBuilder sb) {
249  }
250 
255  private void appendTitle(@NotNull final StringBuilder sb) {
256  final String title = ACTION_BUILDER.getString(key + ".title");
257  sb.append(title == null ? key : title);
258  }
259 
264  private void appendGameObjects(@NotNull final StringBuilder sb) {
266  }
267 
277  private <O> void appendObjects(@NotNull final StringBuilder sb, @NotNull final Collection<O> objects, @NotNull final Formatter<G, A, R, O> formatter, @NotNull final String prefix, @NotNull final String postfix, final int maxObjects) {
278  if (objects.isEmpty()) {
279  return;
280  }
281 
282  final List<O> sortedObjects = new ArrayList<>(objects);
283  sortedObjects.sort(formatter);
284 
285  sb.append(prefix);
286  int count = 0;
287  for (final O object : sortedObjects) {
288  if (count > 0) {
289  sb.append(' ');
290  }
291  sb.append(formatter.toString(object));
292  count++;
293  if (count >= maxObjects && sortedObjects.size() > maxObjects + 1) {
294  sb.append("...");
295  break;
296  }
297  }
298  sb.append(postfix);
299  }
300 
301 }
net.sf.gridarta.model.mapmodel.MapSquare.getMapY
int getMapY()
Returns the y coordinate on the map.
Definition: MapSquare.java:115
name
name
Definition: ArchetypeTypeSetParserTest-ignoreDefaultAttribute1-result.txt:2
net.sf.gridarta.model.mapmodel.MapModel
A MapModel reflects the data of a map.
Definition: MapModel.java:75
net.sf.gridarta.model.validation.errors.ValidationError.key
final String key
Key.
Definition: ValidationError.java:73
net.sf.gridarta.model.validation.errors.ValidationError.mapSquares
final List< MapSquare< G, A, R > > mapSquares
The MapSquares that caused the error.
Definition: ValidationError.java:87
net.sf.gridarta.model.validation.errors.ValidationError.gameObjectFormatter
final Formatter< G, A, R, G > gameObjectFormatter
The MapSquareFormatter for formatting GameObject instances.
Definition: ValidationError.java:110
net.sf.gridarta.model.mapmodel.MapSquare.getMapX
int getMapX()
Returns the x coordinate on the map.
Definition: MapSquare.java:107
net.sf.gridarta.model.validation.errors.ValidationError.getMapSquares
Iterable< MapSquare< G, A, R > > getMapSquares()
Returns the MapSquares that caused the error.
Definition: ValidationError.java:152
net.sf.gridarta
Base package of all Gridarta classes.
net.sf.gridarta.model.validation.errors.ValidationError
Super class of all errors that could occur during map validation.
Definition: ValidationError.java:45
net.sf.gridarta.model.mapmodel.MapSquare
A single Map Square.
Definition: MapSquare.java:45
net.sf
net.sf.gridarta.model.mapmodel
Definition: AboveFloorInsertionMode.java:20
net.sf.gridarta.model.validation.errors.ValidationError.ValidationError
ValidationError(@NotNull final MapModel< G, A, R > mapModel)
Creates a new instance.
Definition: ValidationError.java:119
net.sf.gridarta.utils.HtmlUtils
Utility class for HTML related functions.
Definition: HtmlUtils.java:28
net.sf.gridarta.model.validation.errors.ValidationError.appendGameObjects
void appendGameObjects(@NotNull final StringBuilder sb)
Appends the game objects of this error to a StringBuilder.
Definition: ValidationError.java:264
net.sf.gridarta.model.validation.errors.GameObjectFormatter
A Formatter for GameObjects.
Definition: GameObjectFormatter.java:31
net.sf.gridarta.model.archetype
Definition: AbstractArchetype.java:20
net.sf.gridarta.model.gameobject.GameObject
Reflects a game object (object on a map).
Definition: GameObject.java:36
net.sf.gridarta.model.validation.errors.ValidationError.addGameObject
void addGameObject(@NotNull final G gameObject)
Adds an erroneous GameObject.
Definition: ValidationError.java:182
net.sf.gridarta.model.validation.errors.ValidationError.appendMapSquares
void appendMapSquares(@NotNull final StringBuilder sb)
Appends the map squares of this error to a StringBuilder.
Definition: ValidationError.java:247
net.sf.gridarta.utils.HtmlUtils.encode
static String encode(@NotNull final String str)
Encodes a string so that the result can be embedded into HTML.
Definition: HtmlUtils.java:53
net.sf.gridarta.model.gameobject
GameObjects are the objects based on Archetypes found on maps.
Definition: AbstractGameObject.java:20
net
net.sf.gridarta.model.validation.errors.ValidationError.appendObjects
private< O > void appendObjects(@NotNull final StringBuilder sb, @NotNull final Collection< O > objects, @NotNull final Formatter< G, A, R, O > formatter, @NotNull final String prefix, @NotNull final String postfix, final int maxObjects)
Appends the given objects to a StringBuilder.
Definition: ValidationError.java:277
net.sf.gridarta.model.validation.errors.ValidationError.gameObjects
final List< G > gameObjects
The GameObjects that caused the error.
Definition: ValidationError.java:94
net.sf.gridarta.model.validation.errors.ValidationError.TITLE_MAP_SQUARES
static final int TITLE_MAP_SQUARES
The maximum number of map squares to show in the title.
Definition: ValidationError.java:50
net.sf.gridarta.model.maparchobject.MapArchObject
Interface for MapArchObjects.
Definition: MapArchObject.java:40
net.sf.gridarta.model.validation.errors.ValidationError.ACTION_BUILDER
static final ActionBuilder ACTION_BUILDER
Action Builder.
Definition: ValidationError.java:66
net.sf.gridarta.model.validation.errors.ValidationError.appendTitle
void appendTitle(@NotNull final StringBuilder sb)
Appends the title of this error to a StringBuilder.
Definition: ValidationError.java:255
net.sf.gridarta.model.validation.errors.ValidationError.mapModel
final MapModel< G, A, R > mapModel
The MapModel that caused the error.
Definition: ValidationError.java:80
net.sf.gridarta.utils.HtmlUtils.encodeOptional
static String encodeOptional(@Nullable final String str)
Encodes an optional string so that the result can be embedded into HTML.
Definition: HtmlUtils.java:43
net.sf.gridarta.model.validation.errors.ValidationError.getMapModel
MapModel< G, A, R > getMapModel()
Return the map on which the error occurred.
Definition: ValidationError.java:143
net.sf.gridarta.model
net.sf.gridarta.model.archetype.Archetype
Reflects an Archetype.
Definition: Archetype.java:41
net.sf.gridarta.model.validation.errors.ValidationError.getGameObjects
List< G > getGameObjects()
Returns the GameObjects that caused the error.
Definition: ValidationError.java:174
net.sf.gridarta.model.validation.errors.ValidationError.TITLE_GAME_OBJECTS
static final int TITLE_GAME_OBJECTS
The maximum number of game objects to show in the title.
Definition: ValidationError.java:55
net.sf.gridarta.model.validation.errors.ValidationError.addMapSquare
void addMapSquare(@NotNull final MapSquare< G, A, R > mapSquare)
Adds an erroneous MapSquare.
Definition: ValidationError.java:160
net.sf.gridarta.model.validation.errors.Formatter
Interface for formatting objects.
Definition: Formatter.java:34
net.sf.gridarta.model.validation.errors.ValidationError.getParameter
abstract String getParameter(int id)
Returns a parameter string to be used in the error message.
net.sf.gridarta.model.maparchobject
Definition: AbstractMapArchObject.java:20
net.sf.gridarta.model.validation.errors.ValidationError.serialVersionUID
static final long serialVersionUID
The serial version UID.
Definition: ValidationError.java:60
net.sf.gridarta.model.validation.errors.ValidationError.getMessage
String getMessage()
Returns the error message for this validation error.
Definition: ValidationError.java:205
net.sf.gridarta.model.validation.errors.MapSquareFormatter
A Formatter for MapSquares.
Definition: MapSquareFormatter.java:32
net.sf.gridarta.model.validation.errors.ValidationError.toString
String toString()
The String representation of an error is its title.
Definition: ValidationError.java:235
net.sf.gridarta.utils
Definition: ActionBuilderUtils.java:20
net.sf.gridarta.model.validation.errors.ValidationError.ValidationError
ValidationError(@NotNull final String key, @NotNull final MapModel< G, A, R > mapModel)
Creates a new instance.
Definition: ValidationError.java:133
net.sf.gridarta.model.validation.errors.ValidationError.mapSquareFormatter
final Formatter< G, A, R, MapSquare< G, A, R > > mapSquareFormatter
The MapSquareFormatter for formatting MapSquare instances.
Definition: ValidationError.java:102