/** * Copyright (C) 2002-2012 The FreeCol Team * * This file is part of FreeCol. * * FreeCol is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * FreeCol is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with FreeCol. If not, see <http://www.gnu.org/licenses/>. */ package net.sf.freecol.common.io; import java.io.File; import java.io.FileFilter; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.logging.Logger; import net.sf.freecol.FreeCol; /** * Contains methods for getting a list of available mods. */ public class Mods { private static final Logger logger = Logger.getLogger(Mods.class.getName()); private static final Map<String, FreeColModFile> allMods = new HashMap<String, FreeColModFile>(); public static final FileFilter MOD_FILTER = new FileFilter() { public boolean accept(File f) { final String name = f.getName(); if (name.startsWith(".")) { // Ignore `hidden' files. return false; } else if (f.isDirectory()) { return true; } else { for (String ending : FreeColModFile.FILE_ENDINGS) { if (name.endsWith(ending)) { return true; } } return false; } } }; static { getDirectoryMods(FreeCol.getUserModsDirectory()); getDirectoryMods(FreeCol.getStandardModsDirectory()); } /** * Gets a mod file from a file (possibly a directory). * * @param file The <code>File</code> to test. * @return A <code>FreeColModFile</code> if the file contains a mod, * or null if it did not. */ public static FreeColModFile getModFile(File file) { try { /* The constructor will throw on IO problems, and if there * is no valid mod.xml. That is all we require ATM to * consider this a valid mod. */ return new FreeColModFile(file); } catch (IOException e) { return null; } } /** * Returns the <code>FreeColModFile</code> with the given ID. * * @param id a <code>String</code> value * @return a <code>FreeColModFile</code> value */ public static FreeColModFile getModFile(String id) { return allMods.get(id); } /** * Loads all valid mods from a specified directory. * * @param directory The directory to load from. * @return A list of valid mods. */ private static void getDirectoryMods(File directory) { if (directory != null && directory.isDirectory()) { for (File f : directory.listFiles(MOD_FILTER)) { FreeColModFile fcmf = getModFile(f); if (fcmf != null) { allMods.put(fcmf.getId(), fcmf); } else { logger.warning("Failed to load mod from: " + f.getName()); } } } } /** * Gets all available mods. * User mods before standard mods to allow user override. * * @return A list of <code>FreeColModFile</code>s contain mods. */ public static Collection<FreeColModFile> getAllMods() { return allMods.values(); } /** * Gets all available rules. * * @return A list of <code>FreeColModFile</code>s contain mods. */ public static List<FreeColTcFile> getRuleSets() { List<FreeColTcFile> result = new ArrayList<FreeColTcFile>(); File directory = FreeColTcFile.getRulesDirectory(); for (File dir : directory.listFiles()) { if (dir.isDirectory()) { File modDescription = new File(dir, FreeColModFile.MOD_DESCRIPTOR_FILE); if (modDescription.exists()) { try { result.add(new FreeColTcFile(dir)); } catch(IOException e) { logger.warning("Failed to create rule set " + dir); } } } } return result; } }