diff --git a/src/main/java/it/unibz/inf/isochrone/config/ConfigDataset.java b/src/main/java/it/unibz/inf/isochrone/config/ConfigDataset.java index 2a9085a65ca199158a94fb64835d601f67b822a9..d797249aab360c0db60204621f49b30aff0b4904 100644 --- a/src/main/java/it/unibz/inf/isochrone/config/ConfigDataset.java +++ b/src/main/java/it/unibz/inf/isochrone/config/ConfigDataset.java @@ -12,12 +12,12 @@ import com.tngtech.configbuilder.annotation.valueextractor.PropertyValue; import it.unibz.inf.isochrone.util.EnumContainer.TableType; import it.unibz.inf.isochrone.util.Point; +import it.unibz.inf.isochrone.util.ResourceHelper; import it.unibz.inf.isoga.db.DatabaseWeb; import it.unibz.inf.isoga.db.TableEntry; import it.unibz.inf.isoga.geometry.BBox; -import java.io.File; -import java.net.URISyntaxException; +import java.io.IOException; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -29,10 +29,11 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import javax.validation.constraints.NotNull; -import org.apache.commons.io.FileUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -72,11 +73,10 @@ public class ConfigDataset { } } - private static Map<String, ConfigDataset> instanceMap = new HashMap<>(); private static final Logger LOGGER = LoggerFactory.getLogger(ConfigDataset.class); private static final Collection<String> ALL_DATASETS = initDatasets(); - private static final String[] DS_CONFIG_EXT_ARR = new String[] {"xml"}; - private static final String DS_CONFIG_PREFIX = "config_"; + private static final String DS_CONFIG_PATTERN = ".*config\\_(.*)\\.xml"; + private static Map<String, ConfigDataset> instanceMap = new HashMap<>(); @PropertyValue("client.tArrival") @TypeTransformers(CalendarTransformer.class) @@ -396,32 +396,31 @@ public class ConfigDataset { } private static Collection<String> initDatasets() { - File resourceDir = null; + final Pattern dsConfigPattern = Pattern.compile(DS_CONFIG_PATTERN); + + Collection<String> fileCollection = null; try { - resourceDir = new File(ConfigDataset.class.getResource("/").toURI()); - } catch (URISyntaxException e) { + fileCollection = ResourceHelper.getResources(dsConfigPattern); + } catch (IOException e) { + fileCollection = null; LOGGER.warn("Datasets could not be read. There might be no configured datasets available!"); } - if (resourceDir == null) { + if (fileCollection == null) { return Collections.emptyList(); } - final Collection<File> fileCollection = FileUtils.listFiles(resourceDir, DS_CONFIG_EXT_ARR, false); final List<String> dsConfigCollection = new ArrayList<>(fileCollection.size()); - - // TODO: Only add datasets that are also configured in the db - final int prefixLength = DS_CONFIG_PREFIX.length(); - for (File file : fileCollection) { - final String fileName = file.getName(); - if (fileName.startsWith(DS_CONFIG_PREFIX)) { - String datasetName = fileName.substring(prefixLength); - datasetName = datasetName.substring(0, datasetName.lastIndexOf(".")); - dsConfigCollection.add(datasetName); + for (String fileName : fileCollection) { + final Matcher m = dsConfigPattern.matcher(fileName); + if (m.matches()) { + dsConfigCollection.add(m.group(1)); } } + // TODO: Remove datasets, which are not configured correctly or have no data (or datatables) int Collections.sort(dsConfigCollection); + return dsConfigCollection; } } diff --git a/src/main/java/it/unibz/inf/isochrone/util/ResourceHelper.java b/src/main/java/it/unibz/inf/isochrone/util/ResourceHelper.java new file mode 100644 index 0000000000000000000000000000000000000000..54d6c290e9b1239acb3b08d17f0a062404d88b6d --- /dev/null +++ b/src/main/java/it/unibz/inf/isochrone/util/ResourceHelper.java @@ -0,0 +1,104 @@ +package it.unibz.inf.isochrone.util; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Enumeration; +import java.util.regex.Pattern; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +/** + * Gets available resources (from the classpath) by a regular expression pattern. + */ +public final class ResourceHelper { + + // Constructor + + private ResourceHelper() {} + + // Public static methods + + /** + * Gets all resources matching the given pattern. + * + * @param pattern the pattern to match against (as string) + * @return the resources in the order they are found + * @throws IOException if an I/O error occurs + */ + public static Collection<String> getResources(final String pattern) throws IOException { + return getResources(Pattern.compile(pattern)); + } + + /** + * Gets all resources matching the given pattern. + * + * @param pattern the pattern to match against + * @return the resources in the order they are found + * @throws IOException if an I/O error occurs + */ + public static Collection<String> getResources(final Pattern pattern) throws IOException { + final Collection<String> retval = new ArrayList<String>(); + final String classPath = System.getProperty("java.class.path", "."); + final String[] classPathElements = classPath.split(File.pathSeparator); + for (final String element : classPathElements) { + retval.addAll(getResources(element, pattern)); + } + + return retval; + } + + // Private static methods + + private static Collection<String> getResources(final String element, final Pattern pattern) throws IOException { + final Collection<String> retval = new ArrayList<String>(); + + final File file = new File(element); + if (file.isDirectory()) { + retval.addAll(getResourcesFromDirectory(file, pattern)); + } else { + retval.addAll(getResourcesFromJarFile(file, pattern)); + } + + return retval; + } + + private static Collection<String> getResourcesFromJarFile(final File file, final Pattern pattern) throws IOException { + final Collection<String> retval = new ArrayList<String>(); + try (final ZipFile zf = new ZipFile(file)) { + final Enumeration<? extends ZipEntry> e = zf.entries(); + while (e.hasMoreElements()) { + final ZipEntry ze = e.nextElement(); + final String fileName = ze.getName(); + final boolean accept = pattern.matcher(fileName).matches(); + if (accept) { + retval.add(fileName); + } + } + } catch (final IOException ioe) { + throw ioe; + } + + return retval; + } + + private static Collection<String> getResourcesFromDirectory(final File directory, final Pattern pattern) throws IOException { + final Collection<String> retval = new ArrayList<String>(); + + final File[] fileList = directory.listFiles(); + for (final File file : fileList) { + if (file.isDirectory()) { + retval.addAll(getResourcesFromDirectory(file, pattern)); + } else { + final String fileName = file.getCanonicalPath(); + final boolean accept = pattern.matcher(fileName).matches(); + if (accept) { + retval.add(fileName); + } + } + } + + return retval; + } +}