package org.orienteer.core.util; import java.io.File; import java.net.MalformedURLException; import java.net.URL; import org.apache.wicket.util.string.Strings; import org.orienteer.core.service.OrienteerModule; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Utility class to help in lookuping of startup properties files. * Plugable architecture. Please see {@link OrienteerModule} for lookups order specification */ public class LookupResourceHelper { private final static Logger LOG = LoggerFactory.getLogger(LookupResourceHelper.class); /** * Interface for classes that can find a resource by specified identifier */ public static interface IResourceLookuper { /** * Lookup file according to lookuper politics * @param identifier identifier to use for lookup * @return file or null of file was not found */ public URL lookup(String identifier); } private LookupResourceHelper() { } /** * Lookup file specified by system property */ public static class SystemPropertyFileLookuper implements IResourceLookuper { public static final SystemPropertyFileLookuper INSTANCE = new SystemPropertyFileLookuper(); @Override public URL lookup(String identifier) { String path = System.getProperty(identifier); if(!Strings.isEmpty(path)) { File file = new File(path); return convertFileToURL(file); } else return null; } } /** * Lookup classpath resource specified by system property */ public static class SystemPropertyResourceLookuper implements IResourceLookuper { public static final SystemPropertyResourceLookuper INSTANCE = new SystemPropertyResourceLookuper(); @Override public URL lookup(String identifier) { return Thread.currentThread().getContextClassLoader().getResource(identifier); } } /** * Lookup property URL by system property */ public static class SystemPropertyURLLookuper implements IResourceLookuper { public static final SystemPropertyURLLookuper INSTANCE = new SystemPropertyURLLookuper(); @Override public URL lookup(String identifier) { String path = System.getProperty(identifier); if(!Strings.isEmpty(path)) { try { return new URL(path); } catch (MalformedURLException e) { LOG.debug(String.format("URL '%s' is malformed. Specified by system property '%s'", path, identifier), e); return null; } } else return null; } } /** * Lookup file by looking up from start directory. By default start directory is current one. */ public static class UpDirectoriesFileLookuper implements IResourceLookuper { public static final UpDirectoriesFileLookuper INSTANCE = new UpDirectoriesFileLookuper(); private File startDir = new File("").getAbsoluteFile(); public UpDirectoriesFileLookuper() { } public UpDirectoriesFileLookuper(File startDir) { this.startDir = startDir; } @Override public URL lookup(String identifier) { File dir = startDir; File file = new File(identifier); while(!file.exists() && dir!=null) { dir = dir.getParentFile(); file = new File(dir, identifier); } return convertFileToURL(file); } } /** * Lookup file in specified directory */ public static class DirFileLookuper implements IResourceLookuper { public static final DirFileLookuper CURRENT_DIR_INSTANCE = new DirFileLookuper(); public static final DirFileLookuper CONFIG_DIR_INSTANCE = new DirFileLookuper(System.getProperty("user.home")+File.separatorChar+".orienteer"); private File dir = new File("").getAbsoluteFile(); public DirFileLookuper() { } public DirFileLookuper(File startDir) { this.dir = startDir; } public DirFileLookuper(String path) { this.dir = new File(path); } @Override public URL lookup(String identifier) { File file = new File(dir, identifier); return convertFileToURL(file); } } /** * Stacked lookuper */ public static class StackedResourceLookuper implements IResourceLookuper { private final IResourceLookuper[] lookupers; public StackedResourceLookuper(IResourceLookuper... lookupers) { this.lookupers = lookupers; } @Override public URL lookup(String identifier) { URL ret; for(IResourceLookuper lookuper:lookupers) { ret = lookuper.lookup(identifier); if(ret!=null) return ret; } return null; } } /** * Utility method to convert file to URL * @param file local for * @return URL of a provided file */ public static URL convertFileToURL(File file) { if(file==null || !file.exists()) return null; if(!file.isAbsolute()) file = file.getAbsoluteFile(); try { return file.toURI().toURL(); } catch (MalformedURLException e) { LOG.debug(String.format("File '%s' can't be converted to URL", file), e); return null; } } }