package org.netmelody.cieye.server.configuration; import java.io.File; import java.io.IOException; import java.io.InputStream; import org.apache.commons.io.FileUtils; import com.google.common.collect.ImmutableList; public final class SettingsInitialiser { private final File homeDir; private final File viewsFile; private final File picturesFile; private final File picturesDir; private final File pluginsDir; public SettingsInitialiser() { this(new File(FileUtils.getUserDirectory(), ".ci-eye")); } public SettingsInitialiser(File directory) { this.homeDir = directory; this.viewsFile = new File(homeDir, "views.txt"); this.picturesFile = new File(homeDir, "pictures.txt"); this.picturesDir = new File(homeDir, "pictures"); this.pluginsDir = new File(homeDir, "plugins"); try { startLogger(); terraform(); } catch (IOException e) { throw new IllegalStateException("Unable to initialise ci-eye server", e); } } private void startLogger() throws IOException { final File loggingPropertiesFile = new File(homeDir, "logging.properties"); if (!loggingPropertiesFile.exists()) { initialiseLogging(loggingPropertiesFile); } System.setProperty("java.util.logging.config.file", loggingPropertiesFile.getCanonicalPath()); } public void initialiseLogging(final File loggingPropertiesFile) throws IOException { FileUtils.copyInputStreamToFile(resource("logging.properties.template"), loggingPropertiesFile); final String logsDirName = "logs"; final boolean createdLogsDir = new File(homeDir, logsDirName).mkdir(); if (!createdLogsDir) { System.err.println("Failed to create logs directory at" + homeDir.getPath() + File.pathSeparator + logsDirName); } } private void terraform() throws IOException { if (!viewsFile.exists()) { FileUtils.copyInputStreamToFile(resource("views.txt.template"), viewsFile); } if (!picturesFile.exists()) { FileUtils.copyInputStreamToFile(resource("pictures.txt.template"), picturesFile); includePicture("vlad.png", "picture1.png.template"); includePicture("stupid.png", "picture2.png.template"); } if (!pluginsDir.exists()) { pluginsDir.mkdir(); } ensureSpecialPicturePresent("-doh-", "doh.png", "picture3.png.template"); ensureSpecialPicturePresent("-all-green-", "all-green.gif", "picture4.gif.template"); } private void ensureSpecialPicturePresent(String targetHandle, String targetFileName, String templateName) throws IOException { if (FileUtils.readFileToString(picturesFile).contains(targetHandle)) { return; } includePicture(targetFileName, templateName); FileUtils.writeLines(picturesFile, ImmutableList.of("", "[" + targetFileName + "]", targetHandle), true); } private void includePicture(String targetName, String templateName) throws IOException { final File target = new File(picturesDir, targetName); if (!target.exists()) { FileUtils.copyInputStreamToFile(resource(templateName), target); } } private InputStream resource(String name) { return SettingsInitialiser.class.getResourceAsStream("templates/" + name); } public SettingsFile viewsFile() { return new SettingsFile(viewsFile); } public SettingsFile picturesFile() { return new SettingsFile(picturesFile); } public File picturesDirectory() { return picturesDir; } public String settingsLocation() { try { return homeDir.getCanonicalPath(); } catch (IOException e) { throw new IllegalStateException("Unable to get settings directory", e); } } public PluginDirectory pluginDirectory() { return new PluginDirectory(pluginsDir); } }