package de.janthomae.leiningenplugin.run;
import com.intellij.openapi.components.PersistentStateComponent;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.components.State;
import com.intellij.openapi.components.Storage;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.xmlb.XmlSerializerUtil;
import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.io.FilenameFilter;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
/**
* @author <a href="janthomae@janthomae.de">Jan Thomä</a>
* @version $Id:$
*/
@State(
name = "LeiningenRunnerSettings",
storages = {@Storage(
id = "LeiningenRunnerSettings",
file = "$APP_CONFIG$/leiningen.xml"
)
})
public class LeiningenRunnerSettings implements PersistentStateComponent<LeiningenRunnerSettings> {
public static final String LeinHomeName = ".lein";
@NotNull
public String leiningenPath = "/please/set/me/up/in/settings/leiningen";
@NotNull
public String leiningenHome;
@NotNull
public String leiningenJar = "";
public boolean overrideLeiningenHome = false;
public boolean overrideLeiningenJar = false;
/**
* Returns the real leiningen home.
* @return the real leiningen home.
*/
@NotNull
public String getRealLeiningenHome() {
if (overrideLeiningenHome) {
return leiningenHome;
}
// first check LEIN_HOME env variable
String env = System.getenv("LEIN_HOME");
if (!StringUtil.isEmpty(env)) {
return env;
}
File leinExec = new File(leiningenPath);
if (leinExec.exists()) {
// check if bundled mode
File bundledLein = new File(leinExec.getParentFile(), LeinHomeName);
if (bundledLein.exists()) {
return bundledLein.getPath();
}
}
// Fallback to user home
return System.getProperty("user.home") + File.separator + LeinHomeName;
}
/**
* Returns the real leiningen jar.
* @return the real leiningen jar
*/
@NotNull
public String getRealLeiningenJar() {
if (overrideLeiningenJar) {
return leiningenJar;
}
// first check LEIN_JAR env variable
String env = System.getenv("LEIN_JAR");
if (!StringUtil.isEmpty(env)) {
return env;
}
// ok it's not set, look for a file below the lein home
File leinHome = new File(getRealLeiningenHome());
if ( leinHome.exists() && leinHome.isDirectory() ) {
File selfInstalls = new File(leinHome, "self-installs");
if ( selfInstalls.exists() && selfInstalls.isDirectory() ) {
File[] files = selfInstalls.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.startsWith("leiningen-") && name.endsWith("-standalone.jar");
}
});
if ( files.length > 0 ) {
return files[0].getPath();
}
}
}
// fallback
return "leiningen-standalone.jar";
}
/**
* Returns the URLs that form the leiningen classpath, that is the leiningen.jar and all plugins.
* @return an array of urls.
*/
@NotNull
public URL[] getLeiningenClasspathUrls() {
File leinHome = new File(getRealLeiningenHome());
ArrayList<URL> urls = new ArrayList<URL>();
File leinJar = new File(getRealLeiningenJar());
if ( leinJar.exists()) {
try {
urls.add(leinJar.toURI().toURL());
} catch (MalformedURLException e) {
// ignore.
}
}
if (leinHome.exists() && leinHome.isDirectory()) {
File plugins = new File(leinHome, "plugins");
if ( plugins.exists() && plugins.isDirectory() ) {
File[] files = plugins.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".jar");
}
});
for (File file : files) {
try {
urls.add(file.toURI().toURL());
} catch (MalformedURLException e) {
// ignore
}
}
}
}
return urls.toArray(new URL[urls.size()]);
}
public static LeiningenRunnerSettings getInstance() {
return ServiceManager.getService(LeiningenRunnerSettings.class);
}
public LeiningenRunnerSettings getState() {
return this;
}
public void loadState(LeiningenRunnerSettings leiningenRunnerSettings) {
XmlSerializerUtil.copyBean(leiningenRunnerSettings, this);
}
}