package me.desht.chesscraft; import me.desht.chesscraft.exceptions.ChessException; import me.desht.dhutils.JARUtil; import me.desht.dhutils.JARUtil.ExtractWhen; import me.desht.dhutils.LogUtils; import me.desht.dhutils.MiscUtil; import java.io.File; import java.io.FilenameFilter; import java.io.IOException; public class DirectoryStructure { private static File pluginDir = new File("plugins", "ChessCraft"); //$NON-NLS-1$ //$NON-NLS-2$ private static JARUtil jarUtil; private static File pgnDir, boardStyleDir, pieceStyleDir, schematicsDir; private static File dataDir, gamePersistDir, boardPersistDir, languagesDir, resultsDir; private static final String pgnFoldername = "pgn"; //$NON-NLS-1$ private static final String boardStyleFoldername = "board_styles"; //$NON-NLS-1$ private static final String pieceStyleFoldername = "piece_styles"; //$NON-NLS-1$ private static final String schematicsFoldername = "schematics"; //$NON-NLS-1$ private static final String languageFoldername = "lang"; //$NON-NLS-1$ private static final String datasaveFoldername = "data"; //$NON-NLS-1$ private static final String gamesFoldername = "games"; //$NON-NLS-1$ private static final String boardsFoldername = "boards"; //$NON-NLS-1$ private static final String resultsFoldername = "results"; //$NON-NLS-1$ private static File persistFile; private static final String persistFilename = "persist.yml"; //$NON-NLS-1$ public static void setup(ChessCraft plugin) { pluginDir = ChessCraft.getInstance().getDataFolder(); jarUtil = new JARUtil(plugin); setupDirectoryStructure(); try { extractResources(); } catch (IOException e) { e.printStackTrace(); } } public static File getPluginDirectory() { return pluginDir; } public static File getPGNDirectory() { return pgnDir; } public static File getBoardStyleDirectory() { return boardStyleDir; } public static File getPieceStyleDirectory() { return pieceStyleDir; } public static File getSchematicsDirectory() { return schematicsDir; } public static File getGamesPersistDirectory() { return gamePersistDir; } public static File getBoardPersistDirectory() { return boardPersistDir; } public static File getLanguagesDirectory() { return languagesDir; } public static File getPersistFile() { return persistFile; } public static File getResultsDir() { return resultsDir; } private static void setupDirectoryStructure() { // directories pgnDir = new File(pluginDir, pgnFoldername); boardStyleDir = new File(pluginDir, boardStyleFoldername); pieceStyleDir = new File(pluginDir, pieceStyleFoldername); dataDir = new File(pluginDir, datasaveFoldername); gamePersistDir = new File(dataDir, gamesFoldername); boardPersistDir = new File(dataDir, boardsFoldername); schematicsDir = new File(boardPersistDir, schematicsFoldername); languagesDir = new File(pluginDir, languageFoldername); resultsDir = new File(dataDir, resultsFoldername); // files persistFile = new File(dataDir, persistFilename); // [plugins]/ChessCraft createDir(pluginDir); // [plugins]/ChessCraft/pgn createDir(pgnDir); // [plugins]/ChessCraft/lang createDir(languagesDir); // [plugins]/ChessCraft/board_styles createDir(boardStyleDir); createDir(new File(boardStyleDir, "custom")); // [plugins]/ChessCraft/piece_styles createDir(pieceStyleDir); createDir(new File(pieceStyleDir, "custom")); // [plugins]/ChessCraft/data createDir(dataDir); // [plugins]/ChessCraft/data/games createDir(gamePersistDir); // [plugins]/ChessCraft/data/boards createDir(boardPersistDir); // [plugins]/ChessCraft/data/results createDir(resultsDir); // saved board schematics may need to be moved into their new location File oldSchematicsDir = new File(pluginDir, "schematics"); //$NON-NLS-1$ if (oldSchematicsDir.isDirectory()) { if (!oldSchematicsDir.renameTo(schematicsDir)) { LogUtils.warning("Can't move " + oldSchematicsDir + " to " + schematicsDir); //$NON-NLS-1$ //$NON-NLS-2$ } } else { // [plugins]/ChessCraft/data/boards/schematics createDir(schematicsDir); } } private static void extractResources() throws IOException { jarUtil.extractResource("/AI_settings.yml", pluginDir, ExtractWhen.IF_NEWER); //$NON-NLS-1$ jarUtil.extractResource("/AI.yml", pluginDir, ExtractWhen.IF_NOT_EXISTS); //$NON-NLS-1$ jarUtil.extractResource("/timecontrols.yml", pluginDir, ExtractWhen.IF_NOT_EXISTS); //$NON-NLS-1$ for (String s : MiscUtil.listFilesinJAR(jarUtil.getJarFile(), "datafiles/board_styles", ".yml")) { jarUtil.extractResource(s, boardStyleDir); } for (String s : MiscUtil.listFilesinJAR(jarUtil.getJarFile(), "datafiles/piece_styles", ".yml")) { jarUtil.extractResource(s, pieceStyleDir); } // message resources no longer extracted here - this is now done by Messages.loadMessages() } private static void createDir(File dir) { if (dir.isDirectory()) { return; } if (!dir.mkdir()) { LogUtils.warning("Can't make directory " + dir.getName()); //$NON-NLS-1$ } } /** * Find a YAML resource file in the given directory. Look first in the custom/ subdirectory * and then in the directory itself. * * @param dir * @param filename * @param saving * @return * @throws ChessException */ public static File getResourceFileForLoad(File dir, String filename) throws ChessException { // try the lower-cased form first, if that fails try the exact filename File f = new File(dir, "custom" + File.separator + filename.toLowerCase() + ".yml"); if (!f.exists()) { f = new File(dir, "custom" + File.separator + filename + ".yml"); } if (!f.exists()) { f = new File(dir, filename.toLowerCase() + ".yml"); } return f; } /** * Check if the given file is a custom resource, i.e. it's a custom/ subdirectory. * * @param path * @return */ public static boolean isCustom(File path) { return path.getParentFile().getName().equalsIgnoreCase("custom"); } /** * Find a YAML resource in the custom/ subdirectory of the given directory. * * @param dir * @param filename * @return * @throws ChessException */ public static File getResourceFileForSave(File dir, String filename) throws ChessException { return new File(dir, "custom" + File.separator + filename.toLowerCase() + ".yml"); } public static final FilenameFilter ymlFilter = new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.endsWith(".yml"); } }; }