package appproperties;
import java.io.File;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Singleton that will contain the real application root so that
* it can contain code to load properties files or be subclassed
* to be used as an application wide configuration holder.
*
*
* class AppRoot {
* public static void main(String... args) {
*
* AppProperties props = AppProperties.getInstance();
*
* String applicationRoot = null;
* applicationRoot = props.getApplicationRoot();
*
* System.out.println(applicationRoot);
* }
* }
*
*
* @author noname
*/
public class AppProperties {
private static final String CLASS_NAME = "AppProperties.class";
private static final Class CLASS_REF = AppProperties.class;
private static AppProperties me;
private String applicationRoot;
private AppProperties() {
}
/**
* Get instance
* @return instance
*/
public static AppProperties getInstance() {
if (me == null) {
me = new AppProperties();
me.setApplicationRoot(me.parsePath());
}
return me;
}
public String getApplicationRoot() {
return applicationRoot;
}
public void setApplicationRoot(String applicationRoot) {
this.applicationRoot = applicationRoot;
}
/**
* Get the real location on dist where this application
* is installed.
*
* @return
*/
private String parsePath() {
String path = null;
String thisPackage = null;
/**
* Get packag name, if it's directly in the root
* of the classpath then it's empty
*/
try {
thisPackage = File.separator + CLASS_REF.getPackage().getName() + File.separator;
} catch (NullPointerException npe) {
// No packag
thisPackage = "";
}
/**
* Get unparsed path
*/
try {
// If it is being run from the class directly
path = "file:" + new File(new URI(CLASS_REF.getResource(CLASS_NAME).toString())).toString();
} catch (Exception ex) {
try {
// if it is begin run from a jar
path = new URI(CLASS_REF.getResource(CLASS_NAME).toString()).toString();
} catch (URISyntaxException ex1) {
throw new RuntimeException("Failed to get application root.\nApplication may not work correctly.");
}
}
/**
* Parse path
*/
int start = 0;
int end = 0;
if (path.startsWith("file:")) {
start = 5;
end = path.indexOf(thisPackage);
} else if (path.startsWith("jar:file:")) {
start = 9;
Pattern p = Pattern.compile("([^" + File.separator + ".]+\\.jar!)");
Matcher m = p.matcher(path);
while (m.find()) {
end = m.start();
}
}
// real path
path = path.substring(start, end);
return path;
}
@Override
protected Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException();
}
}