package edu.harvard.wcfia.yoshikoder;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;
import edu.harvard.wcfia.yoshikoder.util.ApplicationDetails;
import edu.harvard.wcfia.yoshikoder.util.FileUtil;
public class YKFS {
private static Logger log =
Logger.getLogger("edu.harvard.wcfia.yoshikoder.YKFS");
private File dotYoshikoder;
private File versionFile;
private File pluginsDirectory;
private File pluginTokenizersDirectory;
private File onlinehelpDirectory;
private File runningFile; // a flag used to ensure we don't run two instances
private File logFile;
private String currentVersion =
ApplicationDetails.getString("Yoshikoder.application.version").trim();
private static YKFS instance;
public static YKFS getYKFS(){
if (instance == null)
instance = new YKFS();
return instance;
}
/**
* Removes all the local storage. This is mostly for testing purposes.
* @return whether cleanup succeeded
*/
public boolean cleanUp(){
return FileUtil.deleteDir(dotYoshikoder);
}
/**
* Gets the top level help file - usually
* <code>~/.yoshikoder/onlinehelp/index.html</code>
* @return index file for online help
*/
public File getOnlineHelpIndex(){
return new File(onlinehelpDirectory, "index.html");
}
public File getLogFile(){
return logFile;
}
protected YKFS(){
try {
dotYoshikoder = new File(System.getProperty("user.home"), ".yoshikoder");
if (!dotYoshikoder.exists()){
boolean b = dotYoshikoder.mkdir();
if (!b)
throw new IOException("Could not create " + dotYoshikoder.toString());
}
} catch (IOException ex1){
log.warning(ex1.getMessage());
try {
dotYoshikoder = File.createTempFile("yoshikoder", ".tmp" );
log.info("creating dotYoshikoder in " + dotYoshikoder);
} catch (IOException ex2){
ex2.printStackTrace();
}
}
versionFile = new File(dotYoshikoder, "version_number");
pluginsDirectory = new File(dotYoshikoder, "plugins");
pluginTokenizersDirectory = new File(pluginsDirectory, "tokenizers");
onlinehelpDirectory = new File(dotYoshikoder, "onlinehelp");
logFile = new File(dotYoshikoder, "logging");
runningFile = new File(dotYoshikoder, "RUNNING");
if (!isFileSystemPrepared())
prepareFileSystem();
else {
if (isOutOfDate())
updateOnlineHelp();
}
// setup loggers
try {
FileHandler handler =
new FileHandler(logFile.getAbsolutePath().toString());
handler.setFormatter(new SimpleFormatter());
// Add to the desired logger (the parent of all others)
Logger logger = Logger.getLogger("");
logger.addHandler(handler);
} catch (IOException e) {
e.printStackTrace();
}
}
protected boolean isOutOfDate(){
try {
BufferedReader reader =
new BufferedReader(new FileReader(versionFile));
String fileVersion = reader.readLine().trim();
reader.close();
return currentVersion.compareTo(fileVersion) > 0;
} catch (Exception ex){
log.log(Level.WARNING, "Error comparing version numbers", ex);
return true;
}
}
protected boolean isFileSystemPrepared(){
return (dotYoshikoder.exists() &&
versionFile.exists() &&
pluginsDirectory.exists() &&
pluginTokenizersDirectory.exists() &&
onlinehelpDirectory.exists());
}
protected boolean updateOnlineHelp(){
try {
FileUtil.deleteDir(onlinehelpDirectory);
ClassLoader cl = YKFS.class.getClassLoader();
InputStream str = cl.getResourceAsStream("onlinehelp.zip");
File helpzip = new File(dotYoshikoder, "onlinehelp.zip");
FileOutputStream fout = new FileOutputStream(helpzip);
log.info("Copying onlinehelp from resources into filesystem");
FileUtil.copyInputStream(str, fout);
log.info("Unzipping online help in filesystem");
FileUtil.unzip(helpzip);
log.info("Deleting online help zip file");
helpzip.delete();
return true;
} catch (Exception ex){
log.log(Level.WARNING, "Failed to update online help", ex);
return false;
}
}
public boolean getRunningYoshikoderFlag(){
return runningFile.exists();
}
protected boolean prepareFileSystem(){
try {
dotYoshikoder.mkdir();
pluginsDirectory.mkdir();
pluginTokenizersDirectory.mkdir();
onlinehelpDirectory.mkdir();
versionFile.createNewFile();
BufferedWriter writer =
new BufferedWriter(new FileWriter(versionFile));
writer.write(currentVersion);
writer.close();
updateOnlineHelp();
return true;
} catch (Exception ex){
log.log(Level.WARNING, "Failed to prepare filesystem", ex);
return false;
}
}
}