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-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.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 
107  protected 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) {
109  this.archDirectory = archDirectory;
110  this.archetypeSet = archetypeSet;
111  this.archetypeParser = archetypeParser;
112  this.archFaceProvider = archFaceProvider;
113  this.animationObjects = animationObjects;
114  }
115 
116  @NotNull
117  @Override
118  public FaceProvider read(@NotNull final ErrorView errorView, @NotNull final List<G> invObjects) {
120  final int animationObjectsSize = animationObjects.size();
121  final int archetypeCount = archetypeSet.getArchetypeCount();
122  final Collection<Pair<String, File>> animFiles = new ArrayList<>();
123  final ErrorViewCollector archDirectoryErrorViewCollector = new ErrorViewCollector(errorView, archDirectory);
124  loadArchetypesFromFiles(archDirectoryErrorViewCollector, archetypeParser, "", archDirectory, 0, "default", "default", invObjects, archFaceProvider, errorView, animFiles);
125  loadAnimationsFromFiles(archDirectoryErrorViewCollector, animFiles);
126  if (LOG.isInfoEnabled()) {
127  LOG.info("Loaded " + (animationObjects.size() - animationObjectsSize) + " animations from '" + archDirectory + "'.");
128  }
129  if (LOG.isInfoEnabled()) {
130  LOG.info("Loaded " + (archetypeSet.getArchetypeCount() - archetypeCount) + " archetypes from '" + archDirectory + "'.");
131  }
132  if (LOG.isInfoEnabled()) {
133  LOG.info("Loaded " + archFaceProvider.size() + " faces from '" + archDirectory + "'.");
134  }
135  return archFaceProvider;
136  }
137 
153  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) {
154  final String name = f.getName();
155  if (f.isDirectory()) {
156  // now, setup the archetype panels
157  if (isValidEntry(folderLevel, name)) {
158  final String[] entries = f.list();
159  if (entries == null) {
160  errorViewCollector.addWarning(ErrorViewCategory.ARCHETYPE_DIR_INVALID, f.getPath());
161  } else {
162  Arrays.sort(entries);
163  final String thisPanelName = folderLevel == 1 ? name : panelName;
164  final String thisFolderName = folderLevel == 1 || folderLevel == 2 ? name : folderName;
165  final String newPath = folderLevel == 0 ? "" : path + "/" + name;
166  for (final String entry : entries) {
167  loadArchetypesFromFiles(errorViewCollector, archetypeParser, newPath, new File(f, entry), folderLevel + 1, thisPanelName, thisFolderName, invObjects, archFaceProvider, errorView, animFiles);
168  }
169  }
170  }
171  } else if (f.isFile()) { // watch out for stuff that's not a file and not a directory!!!
172  if (FileFilters.ARC_FILE_FILTER.accept(f)) {
173  try {
174  try (FileInputStream fis = new FileInputStream(f)) {
175  try (InputStreamReader isr = new InputStreamReader(fis, IOUtils.MAP_ENCODING)) {
176  try (BufferedReader in = new BufferedReader(isr)) {
177  archetypeParser.parseArchetypeFromStream(in, null, null, null, panelName, folderName, path, invObjects, new ErrorViewCollector(errorView, f));
178  }
179  }
180  }
181  } catch (final IOException ex) {
182  new ErrorViewCollector(errorView, f).addWarning(ErrorViewCategory.ARCHETYPE_FILE_INVALID, ex.getMessage());
183  }
184  } else if (FileFilters.PNG_FILE_FILTER.accept(f)) {
185  if (archetypeSet.getImageSet() == null || name.contains("." + archetypeSet.getImageSet() + ".")) {
186  addPNGFace(f.getAbsolutePath(), path, name, errorView, archFaceProvider);
187  }
188  } else if (FileFilters.FACE_FILE_FILTER.accept(f)) {
189  parseDefFace(errorView, f.getAbsolutePath(), path);
190  } else if (FileFilters.ANIM_FILE_FILTER.accept(f)) {
191  animFiles.add(new Pair<>(path, f));
192  }
193  }
194  }
195 
202  private void parseDefFace(@NotNull final ErrorView errorView, @NotNull final String path, @NotNull final String filename) {
203  final ErrorViewCollector errorViewCollector = new ErrorViewCollector(errorView, new File(path));
204  try {
205  try (FileInputStream fis = new FileInputStream(path)) {
206  try (InputStreamReader isr = new InputStreamReader(fis, IOUtils.MAP_ENCODING)) {
207  try (Reader in = new BufferedReader(isr)) {
208  AnimationObjectsReader.loadAnimations(animationObjects, errorViewCollector, in, "animation ", true, filename, null);
209  }
210  }
211  }
212  } catch (final IOException ex) {
213  errorViewCollector.addWarning(ErrorViewCategory.FACE_FILE_INVALID, ex.getMessage());
214  } catch (final AnimationParseException ex) {
215  errorViewCollector.addWarning(ErrorViewCategory.FACE_FILE_INVALID, "line " + ex.getLineNumber() + ": parsing error: " + ex.getMessage());
216  }
217  }
218 
229  private void loadAnimationsFromFiles(@NotNull final ErrorViewCollector errorViewCollector, @NotNull final Iterable<Pair<String, File>> animFiles) {
230  for (final Pair<String, File> pair : animFiles) {
231  final String animPath = pair.getFirst();
232  final File animFile = pair.getSecond();
233  try {
234  AnimationObjectsReader.loadAnimations(animationObjects, errorViewCollector, animPath, animFile, "anim ", false);
235  } catch (final IOException ex) {
236  errorViewCollector.addWarning(ErrorViewCategory.ANIM_FILE_INVALID, ex.getMessage() + ", " + animFile);
237  } catch (final AnimationParseException ex) {
238  errorViewCollector.addWarning(ErrorViewCategory.ANIM_ENTRY_INVALID, "line " + ex.getLineNumber() + ": parsing error: " + ex.getMessage() + ", " + animFile);
239  }
240  }
241  }
242 
249  protected abstract boolean isValidEntry(int folderLevel, String name);
250 
251 }
net.sf.gridarta.model.errorview.ErrorViewCategory.ANIM_FILE_INVALID
ANIM_FILE_INVALID
Definition: ErrorViewCategory.java:32
net.sf.gridarta.model.face.FaceProvider
Definition: FaceProvider.java:30
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)
Definition: AbstractFilesResourcesReader.java:107
net.sf.gridarta.model.errorview.ErrorViewCollector.addWarning
void addWarning(@NotNull final ErrorViewCategory category)
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)
Definition: AbstractResourcesReader.java:155
net.sf.gridarta.model.resource.AbstractFilesResourcesReader.animationObjects
final AnimationObjects animationObjects
Definition: AbstractFilesResourcesReader.java:88
net.sf.gridarta
net.sf.gridarta.model.io.AbstractArchetypeParser
Definition: AbstractArchetypeParser.java:47
net.sf.gridarta.model.anim.AnimationObjects
Definition: AnimationObjects.java:30
net.sf.gridarta.model.face.ArchFaceProvider
Definition: ArchFaceProvider.java:38
net.sf.gridarta.model.resource.AbstractResourcesReader
Definition: AbstractResourcesReader.java:60
net.sf.gridarta.model.archetypeset.ArchetypeSet.setLoadedFromArchive
void setLoadedFromArchive(boolean loadedFromArchive)
net.sf
net.sf.gridarta.model.data.NamedObjects.size
int size()
net.sf.gridarta.model.io.AnimationObjectsReader
Definition: AnimationObjectsReader.java:44
net.sf.gridarta.model.errorview.ErrorView
Definition: ErrorView.java:28
net.sf.gridarta.model.resource.AbstractFilesResourcesReader.archetypeSet
final ArchetypeSet< G, A, R > archetypeSet
Definition: AbstractFilesResourcesReader.java:76
net.sf.gridarta.model.archetype
Definition: AbstractArchetype.java:20
net.sf.gridarta.model.gameobject.GameObject
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()
Definition: AnimationParseException.java:59
net.sf.gridarta.model.resource.AbstractResourcesReader< G >::collectedDirectory
final File collectedDirectory
Definition: AbstractResourcesReader.java:78
net.sf.gridarta.model.gameobject
Definition: AbstractGameObject.java:20
net.sf.gridarta.model.resource.AbstractFilesResourcesReader.archFaceProvider
final ArchFaceProvider archFaceProvider
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:118
net.sf.gridarta.model.archetypeset.ArchetypeSet.getArchetypeCount
int getArchetypeCount()
net.sf.gridarta.model.errorview.ErrorViewCollector
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
Definition: FileFilters.java:56
net.sf.gridarta.model.anim.AnimationParseException
Definition: AnimationParseException.java:31
net.sf.gridarta.model.errorview.ErrorViewCategory
Definition: ErrorViewCategory.java:28
net.sf.gridarta.model.archetypeset.ArchetypeSet.getImageSet
String getImageSet()
net.sf.gridarta.model.io.AnimationObjectsReader.loadAnimations
static void loadAnimations(@NotNull final AnimationObjects animationObjects, @NotNull final ErrorViewCollector errorViewCollector, @NotNull final String path, @NotNull final File animFile, @NotNull final String startKey, final boolean ignoreOtherText)
Definition: AnimationObjectsReader.java:68
net.sf.gridarta.utils.Pair
Definition: Pair.java:26
net.sf.gridarta.model.maparchobject.MapArchObject
Definition: MapArchObject.java:40
net.sf.gridarta.model.resource.AbstractResourcesReader< G >::imageSet
final String imageSet
Definition: AbstractResourcesReader.java:85
net.sf.gridarta.model.resource.AbstractFilesResourcesReader.loadAnimationsFromFiles
void loadAnimationsFromFiles(@NotNull final ErrorViewCollector errorViewCollector, @NotNull final Iterable< Pair< String, File >> animFiles)
Definition: AbstractFilesResourcesReader.java:229
net.sf.gridarta.model.resource.AbstractFilesResourcesReader.LOG
static final Category LOG
Definition: AbstractFilesResourcesReader.java:64
net.sf.gridarta.model.face.FaceObjects
Definition: FaceObjects.java:31
net.sf.gridarta.model.resource.AbstractFilesResourcesReader.archDirectory
final File archDirectory
Definition: AbstractFilesResourcesReader.java:70
net.sf.gridarta.model.archetypeset.ArchetypeSet
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)
Definition: AbstractFilesResourcesReader.java:153
net.sf.gridarta.model.resource.AbstractFilesResourcesReader.isValidEntry
abstract boolean isValidEntry(int folderLevel, String name)
net.sf.gridarta.model.resource.AbstractFilesResourcesReader
Definition: AbstractFilesResourcesReader.java:59
net.sf.gridarta.model.io
Definition: AbstractArchetypeParser.java:20
net.sf.gridarta.utils.FileFilters.ARC_FILE_FILTER
static final FileFilter ARC_FILE_FILTER
Definition: FileFilters.java:50
net.sf.gridarta.model
net.sf.gridarta.model.archetype.Archetype
Definition: Archetype.java:41
net.sf.gridarta.model.resource.AbstractResourcesReader< G >::faceObjects
final FaceObjects faceObjects
Definition: AbstractResourcesReader.java:97
net.sf.gridarta.utils.FileFilters
Definition: FileFilters.java:32
net.sf.gridarta.utils.IOUtils
Definition: IOUtils.java:40
net.sf.gridarta.model.face
Definition: AbstractFaceObjects.java:20
net.sf.gridarta.model.anim
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)
Definition: AbstractFilesResourcesReader.java:202
net.sf.gridarta.model.face.ArchFaceProvider.size
int size()
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
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
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
Definition: FileFilters.java:62
net.sf.gridarta.utils.IOUtils.MAP_ENCODING
static final String MAP_ENCODING
Definition: IOUtils.java:52