Gridarta Editor
AbstractFilesResourcesReader.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.resource;
21 
22 import java.io.BufferedReader;
23 import java.io.File;
24 import java.io.FileInputStream;
25 import java.io.IOException;
26 import java.io.InputStreamReader;
27 import java.io.Reader;
28 import java.util.ArrayList;
29 import java.util.Arrays;
30 import java.util.Collection;
31 import java.util.List;
47 import net.sf.gridarta.utils.IOUtils;
48 import net.sf.gridarta.utils.Pair;
49 import org.apache.log4j.Category;
50 import org.apache.log4j.Logger;
51 import org.jetbrains.annotations.NotNull;
52 import org.jetbrains.annotations.Nullable;
53 
59 public abstract class AbstractFilesResourcesReader<G extends GameObject<G, A, R>, A extends MapArchObject<A>, R extends Archetype<G, A, R>> extends AbstractResourcesReader<G> {
60 
64  private static final Category LOG = Logger.getLogger(AbstractFilesResourcesReader.class);
65 
69  @NotNull
70  private final File archDirectory;
71 
75  @NotNull
77 
81  @NotNull
83 
87  @NotNull
89 
93  @NotNull
95 
99  @NotNull
101 
117  this.archDirectory = archDirectory;
118  this.archetypeSet = archetypeSet;
119  this.archetypeParser = archetypeParser;
120  this.archFaceProvider = archFaceProvider;
121  this.animationObjects = animationObjects;
122  this.animationObjectsReader = animationObjectsReader;
123  }
124 
125  @NotNull
126  @Override
127  public FaceProvider read(@NotNull final ErrorView errorView, @NotNull final List<G> invObjects) {
129  final int animationObjectsSize = animationObjects.size();
130  final int archetypeCount = archetypeSet.getArchetypeCount();
131  final Collection<Pair<String, File>> animFiles = new ArrayList<>();
132  final ErrorViewCollector archDirectoryErrorViewCollector = new ErrorViewCollector(errorView, archDirectory);
133  loadArchetypesFromFiles(archDirectoryErrorViewCollector, archetypeParser, "", archDirectory, 0, "default", "default", invObjects, archFaceProvider, errorView, animFiles);
134  loadAnimationsFromFiles(archDirectoryErrorViewCollector, animFiles);
135  if (LOG.isInfoEnabled()) {
136  LOG.info("Loaded " + (animationObjects.size() - animationObjectsSize) + " animations from '" + archDirectory + "'.");
137  }
138  if (LOG.isInfoEnabled()) {
139  LOG.info("Loaded " + (archetypeSet.getArchetypeCount() - archetypeCount) + " archetypes from '" + archDirectory + "'.");
140  }
141  if (LOG.isInfoEnabled()) {
142  LOG.info("Loaded " + archFaceProvider.size() + " faces from '" + archDirectory + "'.");
143  }
144  return archFaceProvider;
145  }
146 
162  private void loadArchetypesFromFiles(@NotNull final ErrorViewCollector errorViewCollector, @NotNull final AbstractArchetypeParser<G, A, R, ?> archetypeParser, @NotNull final String path, @NotNull final File f, final int folderLevel, @NotNull final String panelName, @NotNull final String folderName, @NotNull final List<G> invObjects, @NotNull final ArchFaceProvider archFaceProvider, @NotNull final ErrorView errorView, @NotNull final Collection<Pair<String, File>> animFiles) {
163  final String name = f.getName();
164  if (f.isDirectory()) {
165  // now, setup the archetype panels
166  if (isValidEntry(folderLevel, name)) {
167  final String[] entries = f.list();
168  if (entries == null) {
169  errorViewCollector.addWarning(ErrorViewCategory.ARCHETYPE_DIR_INVALID, f.getPath());
170  } else {
171  Arrays.sort(entries);
172  final String thisPanelName = folderLevel == 1 ? name : panelName;
173  final String thisFolderName = folderLevel == 1 || folderLevel == 2 ? name : folderName;
174  final String newPath = folderLevel == 0 ? "" : path + "/" + name;
175  for (final String entry : entries) {
176  loadArchetypesFromFiles(errorViewCollector, archetypeParser, newPath, new File(f, entry), folderLevel + 1, thisPanelName, thisFolderName, invObjects, archFaceProvider, errorView, animFiles);
177  }
178  }
179  }
180  } else if (f.isFile()) { // watch out for stuff that's not a file and not a directory!!!
181  if (FileFilters.ARC_FILE_FILTER.accept(f)) {
182  try {
183  try (FileInputStream fis = new FileInputStream(f)) {
184  try (InputStreamReader isr = new InputStreamReader(fis, IOUtils.MAP_ENCODING)) {
185  try (BufferedReader in = new BufferedReader(isr)) {
186  archetypeParser.parseArchetypeFromStream(in, null, null, null, panelName, folderName, path, invObjects, new ErrorViewCollector(errorView, f));
187  }
188  }
189  }
190  } catch (final IOException ex) {
191  new ErrorViewCollector(errorView, f).addWarning(ErrorViewCategory.ARCHETYPE_FILE_INVALID, ex.getMessage());
192  }
193  } else if (FileFilters.PNG_FILE_FILTER.accept(f)) {
194  if (archetypeSet.getImageSet() == null || name.contains("." + archetypeSet.getImageSet() + ".")) {
195  addPNGFace(f.getAbsolutePath(), path, name, errorView, archFaceProvider);
196  }
197  } else if (FileFilters.FACE_FILE_FILTER.accept(f)) {
198  parseDefFace(errorView, f.getAbsolutePath(), path);
199  } else if (FileFilters.ANIM_FILE_FILTER.accept(f)) {
200  animFiles.add(new Pair<>(path, f));
201  }
202  }
203  }
204 
211  private void parseDefFace(@NotNull final ErrorView errorView, @NotNull final String path, @NotNull final String filename) {
212  final ErrorViewCollector errorViewCollector = new ErrorViewCollector(errorView, new File(path));
213  try {
214  try (FileInputStream fis = new FileInputStream(path)) {
215  try (InputStreamReader isr = new InputStreamReader(fis, IOUtils.MAP_ENCODING)) {
216  try (Reader in = new BufferedReader(isr)) {
217  animationObjectsReader.loadAnimations(animationObjects, errorViewCollector, in, "animation ", filename, null);
218  }
219  }
220  }
221  } catch (final IOException ex) {
222  errorViewCollector.addWarning(ErrorViewCategory.FACE_FILE_INVALID, ex.getMessage());
223  } catch (final AnimationParseException ex) {
224  errorViewCollector.addWarning(ErrorViewCategory.FACE_FILE_INVALID, "line " + ex.getLineNumber() + ": parsing error: " + ex.getMessage());
225  }
226  }
227 
238  private void loadAnimationsFromFiles(@NotNull final ErrorViewCollector errorViewCollector, @NotNull final Iterable<Pair<String, File>> animFiles) {
239  for (final Pair<String, File> pair : animFiles) {
240  final String animPath = pair.getFirst();
241  final File animFile = pair.getSecond();
242  try {
243  animationObjectsReader.loadAnimations(animationObjects, errorViewCollector, animPath, animFile, "anim ");
244  } catch (final IOException ex) {
245  errorViewCollector.addWarning(ErrorViewCategory.ANIM_FILE_INVALID, ex.getMessage() + ", " + animFile);
246  } catch (final AnimationParseException ex) {
247  errorViewCollector.addWarning(ErrorViewCategory.ANIM_ENTRY_INVALID, "line " + ex.getLineNumber() + ": parsing error: " + ex.getMessage() + ", " + animFile);
248  }
249  }
250  }
251 
258  protected abstract boolean isValidEntry(int folderLevel, String name);
259 
260 }
net.sf.gridarta.model.errorview.ErrorViewCategory.ANIM_FILE_INVALID
ANIM_FILE_INVALID
Definition: ErrorViewCategory.java:32
net.sf.gridarta.model.face.FaceProvider
This interface represents a lazy loader that provides images on demand.
Definition: FaceProvider.java:30
name
name
Definition: ArchetypeTypeSetParserTest-ignoreDefaultAttribute1-result.txt:2
net.sf.gridarta.model.errorview.ErrorViewCollector.addWarning
void addWarning(@NotNull final ErrorViewCategory category)
Adds a warning message.
Definition: ErrorViewCollector.java:68
net.sf.gridarta.model.errorview.ErrorViewCategory.ANIM_ENTRY_INVALID
ANIM_ENTRY_INVALID
Definition: ErrorViewCategory.java:30
net.sf.gridarta.model.resource.AbstractResourcesReader< G >::addPNGFace
void addPNGFace( @NotNull final String filename, @NotNull final String path, @NotNull final String name, @NotNull final ErrorView errorView, @NotNull final ArchFaceProvider archFaceProvider)
Loads a png from the file, convert it to IconImage and attach it to the face list.
Definition: AbstractResourcesReader.java:157
net.sf.gridarta.model.resource.AbstractFilesResourcesReader.animationObjects
final AnimationObjects animationObjects
The AnimationObjects to use.
Definition: AbstractFilesResourcesReader.java:88
net.sf.gridarta
Base package of all Gridarta classes.
net.sf.gridarta.model.io.AbstractArchetypeParser
Abstract base implementation of ArchetypeParser.
Definition: AbstractArchetypeParser.java:47
net.sf.gridarta.model.anim.AnimationObjects
AnimationObjects is a container for AnimationObjects.
Definition: AnimationObjects.java:30
net.sf.gridarta.model.face.ArchFaceProvider
Implementation of FaceProvider which reads images from the arch directory.
Definition: ArchFaceProvider.java:38
net.sf.gridarta.model.resource.AbstractResourcesReader
Abstract base class for archetype set loader classes.
Definition: AbstractResourcesReader.java:60
net.sf.gridarta.model.archetypeset.ArchetypeSet.setLoadedFromArchive
void setLoadedFromArchive(boolean loadedFromArchive)
Sets whether Archetypes were loaded from an archive.
net.sf
net.sf.gridarta.model.io.AbstractAnimationObjectsReader
Utility class for reading AnimationObjects from files.
Definition: AbstractAnimationObjectsReader.java:44
net.sf.gridarta.model.data.NamedObjects.size
int size()
Get the number of objects.
net.sf.gridarta.model.errorview.ErrorView
Interface for classes displaying error messages.
Definition: ErrorView.java:28
net.sf.gridarta.model.resource.AbstractFilesResourcesReader.archetypeSet
final ArchetypeSet< G, A, R > archetypeSet
The ArchetypeSet to update.
Definition: AbstractFilesResourcesReader.java:76
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.errorview.ErrorViewCategory.FACE_FILE_INVALID
FACE_FILE_INVALID
Definition: ErrorViewCategory.java:62
net.sf.gridarta.model.anim.AnimationParseException.getLineNumber
int getLineNumber()
Returns the number of the erroneous line.
Definition: AnimationParseException.java:59
net.sf.gridarta.model.resource.AbstractResourcesReader< G >::collectedDirectory
final File collectedDirectory
The collected directory.
Definition: AbstractResourcesReader.java:78
net.sf.gridarta.model.gameobject
GameObjects are the objects based on Archetypes found on maps.
Definition: AbstractGameObject.java:20
net.sf.gridarta.model.resource.AbstractFilesResourcesReader.archFaceProvider
final ArchFaceProvider archFaceProvider
The ArchFaceProvider to use.
Definition: AbstractFilesResourcesReader.java:94
net
net.sf.gridarta.model.errorview
Definition: ErrorView.java:20
net.sf.gridarta.model.resource.AbstractFilesResourcesReader.read
FaceProvider read(@NotNull final ErrorView errorView, @NotNull final List< G > invObjects)
Definition: AbstractFilesResourcesReader.java:127
net.sf.gridarta.model.archetypeset.ArchetypeSet.getArchetypeCount
int getArchetypeCount()
Returns the number of Archetypes available.
net.sf.gridarta.model.errorview.ErrorViewCollector
Convenience class for adding messages to a ErrorView instance using a fixed category name.
Definition: ErrorViewCollector.java:31
net.sf.gridarta.model.errorview.ErrorViewCategory.ARCHETYPE_FILE_INVALID
ARCHETYPE_FILE_INVALID
Definition: ErrorViewCategory.java:48
net.sf.gridarta.utils.FileFilters.ANIM_FILE_FILTER
static final FileFilter ANIM_FILE_FILTER
Swing FileFilter for .anim files.
Definition: FileFilters.java:56
net.sf.gridarta.model.anim.AnimationParseException
This exception is thrown when parsing an animation definition file (.
Definition: AnimationParseException.java:31
net.sf.gridarta.model.errorview.ErrorViewCategory
Defines possible error categories for ErrorView instances.
Definition: ErrorViewCategory.java:28
net.sf.gridarta.model.archetypeset.ArchetypeSet.getImageSet
String getImageSet()
Returns the image set.
net.sf.gridarta.model.resource.AbstractFilesResourcesReader.AbstractFilesResourcesReader
AbstractFilesResourcesReader(@NotNull final File archDirectory, @NotNull final ArchetypeSet< G, A, R > archetypeSet, @NotNull final AbstractArchetypeParser< G, A, R, ?> archetypeParser, @NotNull final ArchFaceProvider archFaceProvider, @NotNull final File collectedDirectory, @Nullable final String imageSet, @NotNull final AnimationObjects animationObjects, @NotNull final FaceObjects faceObjects, @NotNull final AbstractAnimationObjectsReader animationObjectsReader)
Creates a new instance.
Definition: AbstractFilesResourcesReader.java:115
net.sf.gridarta.utils.Pair
Stores a pair of values.
Definition: Pair.java:26
net.sf.gridarta.model.maparchobject.MapArchObject
Interface for MapArchObjects.
Definition: MapArchObject.java:40
net.sf.gridarta.model.resource.AbstractResourcesReader< G >::imageSet
final String imageSet
The current image set.
Definition: AbstractResourcesReader.java:85
net.sf.gridarta.model.resource.AbstractFilesResourcesReader.loadAnimationsFromFiles
void loadAnimationsFromFiles(@NotNull final ErrorViewCollector errorViewCollector, @NotNull final Iterable< Pair< String, File >> animFiles)
This method loads animations that are separately defined by looping through all files that were previ...
Definition: AbstractFilesResourcesReader.java:238
net.sf.gridarta.model.resource.AbstractFilesResourcesReader.LOG
static final Category LOG
The logger for printing log messages.
Definition: AbstractFilesResourcesReader.java:64
net.sf.gridarta.model.face.FaceObjects
FaceObjects is a container for FaceObjects.
Definition: FaceObjects.java:31
net.sf.gridarta.model.resource.AbstractFilesResourcesReader.archDirectory
final File archDirectory
The "arch" directory to read.
Definition: AbstractFilesResourcesReader.java:70
net.sf.gridarta.model.archetypeset.ArchetypeSet
Interface that captures similarities between different ArchetypeSet implementations.
Definition: ArchetypeSet.java:37
net.sf.gridarta.model.resource.AbstractFilesResourcesReader.loadArchetypesFromFiles
void loadArchetypesFromFiles(@NotNull final ErrorViewCollector errorViewCollector, @NotNull final AbstractArchetypeParser< G, A, R, ?> archetypeParser, @NotNull final String path, @NotNull final File f, final int folderLevel, @NotNull final String panelName, @NotNull final String folderName, @NotNull final List< G > invObjects, @NotNull final ArchFaceProvider archFaceProvider, @NotNull final ErrorView errorView, @NotNull final Collection< Pair< String, File >> animFiles)
Loads all archetypes and faces by recursing through the.
Definition: AbstractFilesResourcesReader.java:162
net.sf.gridarta.model.resource.AbstractFilesResourcesReader.isValidEntry
abstract boolean isValidEntry(int folderLevel, String name)
Returns whether a file name should be processed.
net.sf.gridarta.model.resource.AbstractFilesResourcesReader
Abstract base class for AbstractResourcesReaders that read from individual files.
Definition: AbstractFilesResourcesReader.java:59
net.sf.gridarta.model.io
Reading and writing of maps, handling of paths.
Definition: AbstractAnimationObjectsReader.java:20
net.sf.gridarta.utils.FileFilters.ARC_FILE_FILTER
static final FileFilter ARC_FILE_FILTER
Swing FileFilter for .arc files.
Definition: FileFilters.java:50
net.sf.gridarta.model
net.sf.gridarta.model.archetype.Archetype
Reflects an Archetype.
Definition: Archetype.java:41
net.sf.gridarta.model.io.AbstractAnimationObjectsReader.loadAnimations
void loadAnimations(@NotNull final AnimationObjects animationObjects, @NotNull final ErrorViewCollector errorViewCollector, @NotNull final String path, @NotNull final File animFile, @NotNull final String startKey)
Loads animations from a file.
Definition: AbstractAnimationObjectsReader.java:66
net.sf.gridarta.model.resource.AbstractResourcesReader< G >::faceObjects
final FaceObjects faceObjects
The face objects instance.
Definition: AbstractResourcesReader.java:97
net.sf.gridarta.utils.FileFilters
Utility class defining FileFilters.
Definition: FileFilters.java:32
net.sf.gridarta.utils.IOUtils
Utility-class for Gridarta's I/O.
Definition: IOUtils.java:40
net.sf.gridarta.model.face
The face is the appearance of an object.
Definition: AbstractFaceObjects.java:20
net.sf.gridarta.model.anim
Gridarta can handle frame information of animations and allow the selection of an animation using a t...
Definition: AbstractAnimationObjects.java:20
net.sf.gridarta.model.resource.AbstractFilesResourcesReader.parseDefFace
void parseDefFace(@NotNull final ErrorView errorView, @NotNull final String path, @NotNull final String filename)
Loads a .face file.
Definition: AbstractFilesResourcesReader.java:211
net.sf.gridarta.model.face.ArchFaceProvider.size
int size()
Returns the number of faces.
Definition: ArchFaceProvider.java:50
net.sf.gridarta.model.maparchobject
Definition: AbstractMapArchObject.java:20
net.sf.gridarta.model.errorview.ErrorViewCategory.ARCHETYPE_DIR_INVALID
ARCHETYPE_DIR_INVALID
Definition: ErrorViewCategory.java:46
net.sf.gridarta.utils.FileFilters.PNG_FILE_FILTER
static final FileFilter PNG_FILE_FILTER
Swing FileFilter for png graphics.
Definition: FileFilters.java:68
net.sf.gridarta.model.archetypeset
Definition: ArchetypeSet.java:20
net.sf.gridarta.model.io.AbstractArchetypeParser.parseArchetypeFromStream
void parseArchetypeFromStream(@NotNull final BufferedReader in, @Nullable final R prototype, @Nullable final String line, @Nullable final String archName, @NotNull final String panelName, @NotNull final String folderName, @NotNull final String archPath, @NotNull final List< G > invObjects, @NotNull final ErrorViewCollector errorViewCollector)
Definition: AbstractArchetypeParser.java:86
net.sf.gridarta.model.resource.AbstractFilesResourcesReader.archetypeParser
final AbstractArchetypeParser< G, A, R, ?> archetypeParser
The AbstractArchetypeParser to use.
Definition: AbstractFilesResourcesReader.java:82
net.sf.gridarta.utils
Definition: ActionBuilderUtils.java:20
net.sf.gridarta.utils.FileFilters.FACE_FILE_FILTER
static final FileFilter FACE_FILE_FILTER
Swing FileFilter for .face files.
Definition: FileFilters.java:62
net.sf.gridarta.utils.IOUtils.MAP_ENCODING
static final String MAP_ENCODING
Encoding to use for maps and other data.
Definition: IOUtils.java:52
net.sf.gridarta.model.resource.AbstractFilesResourcesReader.animationObjectsReader
final AbstractAnimationObjectsReader animationObjectsReader
The animation objects reader to use.
Definition: AbstractFilesResourcesReader.java:100