/******************************************************************************* * Copyright (c) 2015 * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *******************************************************************************/ package jsettlers.logic.map.loading.list; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.text.SimpleDateFormat; import java.util.Date; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; import jsettlers.common.CommonConstants; import jsettlers.common.utils.FileUtils; import jsettlers.common.utils.FileUtils.IFileVisitor; import jsettlers.logic.map.loading.MapLoader; import jsettlers.logic.map.loading.newmap.MapFileHeader; /** * Lists all maps in a directory. * * @author michael * */ public class DirectoryMapLister implements IMapLister { private final File directory; public static class ListedMapFile implements IListedMap { private final File file; public ListedMapFile(File file) { this.file = file; } @Override public String getFileName() { return file.getName().replaceFirst(".*/", ""); } @Override public InputStream getInputStream() throws FileNotFoundException { return new FileInputStream(file); } @Override public void delete() { file.delete(); } @Override public boolean isCompressed() { return file.getName().endsWith(MapLoader.MAP_EXTENSION_COMPRESSED); } @Override public File getFile() { return file; } } public DirectoryMapLister(File directory, boolean createIfMissing) { this.directory = directory; if (createIfMissing && !directory.exists()) { directory.mkdirs(); } } @Override public void listMaps(final IMapListerCallable callback) { if (directory == null || !directory.isDirectory() || directory.listFiles() == null) { return; } try { // traverse all files and sub-folders FileUtils.walkFileTree(directory, new IFileVisitor() { @Override public void visitFile(File file) throws IOException { String fileName = file.getName(); if (!file.isDirectory() && MapLoader.isExtensionKnown(fileName)) { callback.foundMap(new ListedMapFile(file)); } } }); } catch (IOException e) { e.printStackTrace(); } } @Override public OutputStream getOutputStream(MapFileHeader header) throws IOException { String name = header.getName().toLowerCase().replaceAll("^\\W+|\\W+$", "").replaceAll("\\W+", "_"); if (name.isEmpty()) { name = "map"; } String sizePrefix; if (header.getWidth() == header.getHeight()) { sizePrefix = "" + header.getWidth(); } else { sizePrefix = header.getWidth() + "x" + header.getHeight(); } name = sizePrefix + "-" + header.getMaxPlayers() + "-" + name; Date date = header.getCreationDate(); if (date != null) { SimpleDateFormat format = new SimpleDateFormat("-yyyy-MM-dd_HH-mm-ss"); name += format.format(date); } String mapFileExtension = MapList.getMapExtension(); String actualName = name; File file = new File(directory, actualName + mapFileExtension); int i = 1; while (file.exists()) { actualName = name + "-" + i; file = new File(directory, actualName + mapFileExtension); i++; } if (!directory.exists()) { directory.mkdirs(); } if (!directory.isDirectory()) { throw new IOException("maps directory does not exist."); } try { OutputStream outputStream = new BufferedOutputStream(new FileOutputStream(file)); if (CommonConstants.USE_SAVEGAME_COMPRESSION) { System.out.println("Using savegame compression!"); ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream); ZipEntry zipEntry = new ZipEntry(actualName + MapLoader.MAP_EXTENSION); zipOutputStream.putNextEntry(zipEntry); return zipOutputStream; } else { System.out.println("No savegame compression!"); return outputStream; } } catch (FileNotFoundException e) { throw new IOException(e); } } }