Util: Consolidate FileFilters

This commit is contained in:
zzz
2018-03-05 13:16:04 +00:00
parent 28923825d9
commit 0eb04facec
12 changed files with 117 additions and 100 deletions

View File

@ -34,6 +34,7 @@ import net.i2p.data.Base64;
import net.i2p.data.DataHelper; import net.i2p.data.DataHelper;
import net.i2p.update.*; import net.i2p.update.*;
import net.i2p.util.ConcurrentHashSet; import net.i2p.util.ConcurrentHashSet;
import net.i2p.util.FileSuffixFilter;
import net.i2p.util.FileUtil; import net.i2p.util.FileUtil;
import net.i2p.util.I2PAppThread; import net.i2p.util.I2PAppThread;
import net.i2p.util.Log; import net.i2p.util.Log;
@ -2577,14 +2578,14 @@ public class SnarkManager implements CompleteListener, ClientApp {
*/ */
private boolean monitorTorrents(File dir) { private boolean monitorTorrents(File dir) {
boolean rv = true; boolean rv = true;
String fileNames[] = dir.list(TorrentFilenameFilter.instance()); File files[] = dir.listFiles(new FileSuffixFilter(".torrent"));
List<String> foundNames = new ArrayList<String>(0); List<String> foundNames = new ArrayList<String>(0);
if (fileNames != null) { if (files != null) {
for (int i = 0; i < fileNames.length; i++) { for (int i = 0; i < files.length; i++) {
try { try {
foundNames.add(new File(dir, fileNames[i]).getCanonicalPath()); foundNames.add(files[i].getCanonicalPath());
} catch (IOException ioe) { } catch (IOException ioe) {
_log.error("Error resolving '" + fileNames[i] + "' in '" + dir, ioe); _log.error("Error resolving '" + files[i] + "' in '" + dir, ioe);
} }
} }
} }
@ -2731,14 +2732,6 @@ public class SnarkManager implements CompleteListener, ClientApp {
saveConfig(); saveConfig();
} }
private static class TorrentFilenameFilter implements FilenameFilter {
private static final TorrentFilenameFilter _filter = new TorrentFilenameFilter();
public static TorrentFilenameFilter instance() { return _filter; }
public boolean accept(File dir, String name) {
return (name != null) && (name.endsWith(".torrent"));
}
}
/** /**
* If not connected, thread it, otherwise inline * If not connected, thread it, otherwise inline
* @throws RuntimeException via Snark.fatal() * @throws RuntimeException via Snark.fatal()

View File

@ -19,6 +19,7 @@ import net.i2p.data.Base64;
import net.i2p.data.DataHelper; import net.i2p.data.DataHelper;
import net.i2p.data.Hash; import net.i2p.data.Hash;
import net.i2p.util.Log; import net.i2p.util.Log;
import net.i2p.util.FileSuffixFilter;
import net.i2p.util.SecureDirectory; import net.i2p.util.SecureDirectory;
import net.i2p.util.SecureFileOutputStream; import net.i2p.util.SecureFileOutputStream;
@ -98,13 +99,11 @@ class PersistNews {
Log log = ctx.logManager().getLog(PersistNews.class); Log log = ctx.logManager().getLog(PersistNews.class);
File dir = new File(ctx.getConfigDir(), DIR); File dir = new File(ctx.getConfigDir(), DIR);
List<NewsEntry> rv = new ArrayList<NewsEntry>(); List<NewsEntry> rv = new ArrayList<NewsEntry>();
File[] files = dir.listFiles(); File[] files = dir.listFiles(new FileSuffixFilter(PFX, SFX));
if (files == null) if (files == null)
return rv; return rv;
for (File file : files) { for (File file : files) {
String name = file.getName(); String name = file.getName();
if (!name.startsWith(PFX) || !name.endsWith(SFX))
continue;
XMLParser parser = new XMLParser(ctx); XMLParser parser = new XMLParser(ctx);
InputStream in = null; InputStream in = null;
Node node; Node node;

View File

@ -30,6 +30,7 @@ import net.i2p.router.startup.LoadClientAppsJob;
import net.i2p.router.update.ConsoleUpdateManager; import net.i2p.router.update.ConsoleUpdateManager;
import static net.i2p.update.UpdateType.*; import static net.i2p.update.UpdateType.*;
import net.i2p.util.ConcurrentHashSet; import net.i2p.util.ConcurrentHashSet;
import net.i2p.util.FileSuffixFilter;
import net.i2p.util.FileUtil; import net.i2p.util.FileUtil;
import net.i2p.util.I2PAppThread; import net.i2p.util.I2PAppThread;
import net.i2p.util.Log; import net.i2p.util.Log;
@ -415,13 +416,14 @@ public class PluginStarter implements Runnable {
File consoleDir = new File(pluginDir, "console"); File consoleDir = new File(pluginDir, "console");
Properties wprops = RouterConsoleRunner.webAppProperties(consoleDir.getAbsolutePath()); Properties wprops = RouterConsoleRunner.webAppProperties(consoleDir.getAbsolutePath());
File webappDir = new File(consoleDir, "webapps"); File webappDir = new File(consoleDir, "webapps");
String fileNames[] = webappDir.list(RouterConsoleRunner.WarFilenameFilter.instance()); File files[] = webappDir.listFiles(RouterConsoleRunner.WAR_FILTER);
if (fileNames != null) { if (files != null) {
if(!pluginWars.containsKey(appName)) if(!pluginWars.containsKey(appName))
pluginWars.put(appName, new ConcurrentHashSet<String>()); pluginWars.put(appName, new ConcurrentHashSet<String>());
for (int i = 0; i < fileNames.length; i++) { for (int i = 0; i < files.length; i++) {
try { try {
String warName = fileNames[i].substring(0, fileNames[i].lastIndexOf(".war")); String warName = files[i].getName();
warName = warName.substring(0, warName.lastIndexOf(".war"));
//log.error("Found webapp: " + warName); //log.error("Found webapp: " + warName);
// check for duplicates in $I2P // check for duplicates in $I2P
if (Arrays.asList(STANDARD_WEBAPPS).contains(warName)) { if (Arrays.asList(STANDARD_WEBAPPS).contains(warName)) {
@ -432,12 +434,12 @@ public class PluginStarter implements Runnable {
if (! "false".equals(enabled)) { if (! "false".equals(enabled)) {
if (log.shouldLog(Log.INFO)) if (log.shouldLog(Log.INFO))
log.info("Starting webapp: " + warName); log.info("Starting webapp: " + warName);
String path = new File(webappDir, fileNames[i]).getCanonicalPath(); String path = files[i].getCanonicalPath();
WebAppStarter.startWebApp(ctx, server, warName, path); WebAppStarter.startWebApp(ctx, server, warName, path);
pluginWars.get(appName).add(warName); pluginWars.get(appName).add(warName);
} }
} catch (IOException ioe) { } catch (IOException ioe) {
log.error("Error resolving '" + fileNames[i] + "' in '" + webappDir, ioe); log.error("Error resolving '" + files[i] + "' in '" + webappDir, ioe);
} }
} }
// Check for iconfile in plugin.properties // Check for iconfile in plugin.properties
@ -460,23 +462,21 @@ public class PluginStarter implements Runnable {
// later in the classpath. // later in the classpath.
File localeDir = new File(pluginDir, "console/locale"); File localeDir = new File(pluginDir, "console/locale");
if (localeDir.exists() && localeDir.isDirectory()) { if (localeDir.exists() && localeDir.isDirectory()) {
File[] files = localeDir.listFiles(); File[] files = localeDir.listFiles(new FileSuffixFilter(".jar"));
if (files != null) { if (files != null) {
boolean added = false; boolean added = false;
for (int i = 0; i < files.length; i++) { for (int i = 0; i < files.length; i++) {
File f = files[i]; File f = files[i];
if (f.getName().endsWith(".jar")) { try {
try { addPath(f.toURI().toURL());
addPath(f.toURI().toURL()); log.info("INFO: Adding translation plugin to classpath: " + f);
log.info("INFO: Adding translation plugin to classpath: " + f); added = true;
added = true; } catch (ClassCastException e) {
} catch (ClassCastException e) { log.logAlways(Log.WARN, "Java version: " + System.getProperty("java.version") +
log.logAlways(Log.WARN, "Java version: " + System.getProperty("java.version") + " does not support adding classpath element: " + f +
" does not support adding classpath element: " + f + " for plugin " + appName);
" for plugin " + appName); } catch (RuntimeException e) {
} catch (RuntimeException e) { log.error("Plugin " + appName + " bad classpath element: " + f, e);
log.error("Plugin " + appName + " bad classpath element: " + f, e);
}
} }
} }
if (added) if (added)

View File

@ -2,7 +2,7 @@ package net.i2p.router.web;
import java.awt.GraphicsEnvironment; import java.awt.GraphicsEnvironment;
import java.io.File; import java.io.File;
import java.io.FilenameFilter; import java.io.FileFilter;
import java.io.IOException; import java.io.IOException;
import java.io.Serializable; import java.io.Serializable;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
@ -35,6 +35,7 @@ import net.i2p.router.app.RouterApp;
import net.i2p.router.news.NewsManager; import net.i2p.router.news.NewsManager;
import net.i2p.router.update.ConsoleUpdateManager; import net.i2p.router.update.ConsoleUpdateManager;
import net.i2p.util.Addresses; import net.i2p.util.Addresses;
import net.i2p.util.FileSuffixFilter;
import net.i2p.util.FileUtil; import net.i2p.util.FileUtil;
import net.i2p.util.I2PAppThread; import net.i2p.util.I2PAppThread;
import net.i2p.util.PortMapper; import net.i2p.util.PortMapper;
@ -140,6 +141,8 @@ public class RouterConsoleRunner implements RouterApp {
private static final String THREAD_NAME = "RouterConsole Jetty"; private static final String THREAD_NAME = "RouterConsole Jetty";
public static final String PROP_DTG_ENABLED = "desktopgui.enabled"; public static final String PROP_DTG_ENABLED = "desktopgui.enabled";
static final String PROP_ALLOWED_HOSTS = "routerconsole.allowedHosts"; static final String PROP_ALLOWED_HOSTS = "routerconsole.allowedHosts";
/** @since 0.9.34 */
static final FileFilter WAR_FILTER = new WarFilenameFilter();
/** /**
* <pre> * <pre>
@ -763,10 +766,11 @@ public class RouterConsoleRunner implements RouterApp {
List<String> notStarted = new ArrayList<String>(); List<String> notStarted = new ArrayList<String>();
if (_server.isRunning()) { if (_server.isRunning()) {
File dir = new File(_webAppsDir); File dir = new File(_webAppsDir);
String fileNames[] = dir.list(WarFilenameFilter.instance()); File files[] = dir.listFiles(WAR_FILTER);
if (fileNames != null) { if (files != null) {
for (int i = 0; i < fileNames.length; i++) { for (int i = 0; i < files.length; i++) {
String appName = fileNames[i].substring(0, fileNames[i].lastIndexOf(".war")); String appName = files[i].getName();
appName = appName.substring(0, appName.lastIndexOf(".war"));
String enabled = props.getProperty(PREFIX + appName + ENABLED); String enabled = props.getProperty(PREFIX + appName + ENABLED);
if (appName.equals("addressbook")) { if (appName.equals("addressbook")) {
// addressbook.war is now empty, thread is started by SusiDNS // addressbook.war is now empty, thread is started by SusiDNS
@ -776,7 +780,7 @@ public class RouterConsoleRunner implements RouterApp {
} }
} else if (! "false".equals(enabled)) { } else if (! "false".equals(enabled)) {
try { try {
String path = new File(dir, fileNames[i]).getCanonicalPath(); String path = files[i].getCanonicalPath();
WebAppStarter.startWebApp(_context, chColl, appName, path); WebAppStarter.startWebApp(_context, chColl, appName, path);
if (enabled == null) { if (enabled == null) {
// do this so configclients.jsp knows about all apps from reading the config // do this so configclients.jsp knows about all apps from reading the config
@ -1115,11 +1119,13 @@ public class RouterConsoleRunner implements RouterApp {
} }
static class WarFilenameFilter implements FilenameFilter { private static class WarFilenameFilter extends FileSuffixFilter {
private static final WarFilenameFilter _filter = new WarFilenameFilter(); private static final String RCWAR = ROUTERCONSOLE + ".war";
public static WarFilenameFilter instance() { return _filter; }
public boolean accept(File dir, String name) { public WarFilenameFilter() { super(".war"); }
return (name != null) && (name.endsWith(".war") && !name.equals(ROUTERCONSOLE + ".war"));
public boolean accept(File file) {
return super.accept(file) && !file.getName().equals(RCWAR);
} }
} }

View File

@ -14,6 +14,7 @@ import java.util.Set;
import java.util.StringTokenizer; import java.util.StringTokenizer;
import net.i2p.I2PAppContext; import net.i2p.I2PAppContext;
import net.i2p.util.FileSuffixFilter;
import org.apache.tomcat.SimpleInstanceManager; import org.apache.tomcat.SimpleInstanceManager;
import org.eclipse.jetty.webapp.Configuration; import org.eclipse.jetty.webapp.Configuration;
@ -180,11 +181,11 @@ public class WebAppConfiguration implements Configuration {
// Java 9 - assume everything in lib/ is in the classpath // Java 9 - assume everything in lib/ is in the classpath
// except addressbook.jar // except addressbook.jar
File libDir = new File(ctx.getBaseDir(), "lib"); File libDir = new File(ctx.getBaseDir(), "lib");
File[] files = libDir.listFiles(); File[] files = libDir.listFiles(new FileSuffixFilter(".jar"));
if (files != null) { if (files != null) {
for (int i = 0; i < files.length; i++) { for (int i = 0; i < files.length; i++) {
String name = files[i].getName(); String name = files[i].getName();
if (name.endsWith(".jar") && !name.equals("addressbook.jar")) if (!name.equals("addressbook.jar"))
rv.add(files[i].toURI()); rv.add(files[i].toURI());
} }
} }

View File

@ -5,6 +5,7 @@ import java.io.IOException;
import net.i2p.data.DataHelper; import net.i2p.data.DataHelper;
import net.i2p.util.FileUtil; import net.i2p.util.FileUtil;
import net.i2p.util.FileSuffixFilter;
import net.i2p.router.crypto.FamilyKeyCrypto; import net.i2p.router.crypto.FamilyKeyCrypto;
import net.i2p.router.web.HelperBase; import net.i2p.router.web.HelperBase;
@ -37,17 +38,11 @@ public class CertHelper extends HelperBase {
// i2ptunnel clients // i2ptunnel clients
File tunnelDir = new File(_context.getConfigDir(), I2PTUNNEL_DIR); File tunnelDir = new File(_context.getConfigDir(), I2PTUNNEL_DIR);
boolean hasTunnels = false; boolean hasTunnels = false;
File[] tunnels = tunnelDir.listFiles(); File[] tunnels = tunnelDir.listFiles(new FileSuffixFilter("i2ptunnel-", ".local.crt"));
if (tunnels != null) { if (tunnels != null) {
for (int i = 0; i < tunnels.length; i++) { for (int i = 0; i < tunnels.length; i++) {
File f = tunnels[i]; File f = tunnels[i];
if (!f.isFile())
continue;
String name = f.getName(); String name = f.getName();
if (!name.endsWith(".local.crt"))
continue;
if (!name.startsWith("i2ptunnel-"))
continue;
String b32 = name.substring(10, name.length() - 10); String b32 = name.substring(10, name.length() - 10);
output(_t("I2PTunnel") + ' ' + b32, f); output(_t("I2PTunnel") + ' ' + b32, f);
hasTunnels = true; hasTunnels = true;
@ -59,17 +54,10 @@ public class CertHelper extends HelperBase {
// SAM // SAM
tunnelDir = new File(dir, SAM_DIR); tunnelDir = new File(dir, SAM_DIR);
hasTunnels = false; hasTunnels = false;
tunnels = tunnelDir.listFiles(); tunnels = tunnelDir.listFiles(new FileSuffixFilter("sam-", ".local.crt"));
if (tunnels != null) { if (tunnels != null) {
for (int i = 0; i < tunnels.length; i++) { for (int i = 0; i < tunnels.length; i++) {
File f = tunnels[i]; File f = tunnels[i];
if (!f.isFile())
continue;
String name = f.getName();
if (!name.endsWith(".local.crt"))
continue;
if (!name.startsWith("sam-"))
continue;
output("SAM", f); output("SAM", f);
hasTunnels = true; hasTunnels = true;
} }

View File

@ -20,6 +20,7 @@ import net.i2p.crypto.SHA256Generator;
import net.i2p.data.DataHelper; import net.i2p.data.DataHelper;
import net.i2p.router.web.HelperBase; import net.i2p.router.web.HelperBase;
import net.i2p.router.web.PluginStarter; import net.i2p.router.web.PluginStarter;
import net.i2p.util.FileSuffixFilter;
import net.i2p.util.FileUtil; import net.i2p.util.FileUtil;
import net.i2p.util.SystemVersion; import net.i2p.util.SystemVersion;
@ -97,13 +98,12 @@ public class FileDumpHelper extends HelperBase {
} }
private static void dumpDir(StringBuilder buf, File dir, String suffix) { private static void dumpDir(StringBuilder buf, File dir, String suffix) {
File[] files = dir.listFiles(); File[] files = dir.listFiles(new FileSuffixFilter(suffix));
if (files == null) if (files == null)
return; return;
Arrays.sort(files); Arrays.sort(files);
for (int i = 0; i < files.length; i++) { for (int i = 0; i < files.length; i++) {
if (files[i].getName().endsWith(suffix)) dumpFile(buf, files[i]);
dumpFile(buf, files[i]);
} }
} }

View File

@ -31,6 +31,7 @@ import java.util.zip.GZIPOutputStream;
import net.i2p.I2PAppContext; import net.i2p.I2PAppContext;
import net.i2p.data.Base64; import net.i2p.data.Base64;
import net.i2p.data.DataHelper; import net.i2p.data.DataHelper;
import net.i2p.util.FileSuffixFilter;
import net.i2p.util.I2PAppThread; import net.i2p.util.I2PAppThread;
import net.i2p.util.PasswordManager; import net.i2p.util.PasswordManager;
import net.i2p.util.SecureDirectory; import net.i2p.util.SecureDirectory;
@ -383,15 +384,11 @@ class PersistentMailCache {
private void importMail() { private void importMail() {
File importDir = new File(_cacheDir.getParentFile(), DIR_IMPORT); File importDir = new File(_cacheDir.getParentFile(), DIR_IMPORT);
if (importDir.exists() && importDir.isDirectory()) { if (importDir.exists() && importDir.isDirectory()) {
File[] files = importDir.listFiles(); File[] files = importDir.listFiles(new FileSuffixFilter(".eml"));
if (files == null) if (files == null)
return; return;
for (int i = 0; i < files.length; i++) { for (int i = 0; i < files.length; i++) {
File f = files[i]; File f = files[i];
if (!f.isFile())
continue;
if (!f.getName().toLowerCase(Locale.US).endsWith(".eml"))
continue;
// Read in the headers to get the X-UIDL that Thunderbird stuck in there // Read in the headers to get the X-UIDL that Thunderbird stuck in there
String uidl = Long.toString(_context.random().nextLong()); String uidl = Long.toString(_context.random().nextLong());
InputStream in = null; InputStream in = null;

View File

@ -40,6 +40,7 @@ import net.i2p.I2PAppContext;
import net.i2p.data.Base64; import net.i2p.data.Base64;
import net.i2p.data.DataHelper; import net.i2p.data.DataHelper;
import net.i2p.util.Log; import net.i2p.util.Log;
import net.i2p.util.FileSuffixFilter;
import net.i2p.util.SecureFileOutputStream; import net.i2p.util.SecureFileOutputStream;
import net.i2p.util.SystemVersion; import net.i2p.util.SystemVersion;
@ -486,21 +487,17 @@ public final class CertUtil {
*/ */
private static void loadCRLs(Set<X509CRL> crls, File dir) { private static void loadCRLs(Set<X509CRL> crls, File dir) {
if (dir.exists() && dir.isDirectory()) { if (dir.exists() && dir.isDirectory()) {
File[] files = dir.listFiles(); File[] files = dir.listFiles(new FileSuffixFilter(".crl"));
if (files != null) { if (files != null) {
for (int i = 0; i < files.length; i++) { for (int i = 0; i < files.length; i++) {
File f = files[i]; File f = files[i];
if (!f.isFile()) try {
continue; X509CRL crl = loadCRL(f);
if (f.getName().endsWith(".crl")) { crls.add(crl);
try { } catch (IOException ioe) {
X509CRL crl = loadCRL(f); error("Cannot load CRL from " + f, ioe);
crls.add(crl); } catch (GeneralSecurityException crle) {
} catch (IOException ioe) { error("Cannot load CRL from " + f, crle);
error("Cannot load CRL from " + f, ioe);
} catch (GeneralSecurityException crle) {
error("Cannot load CRL from " + f, crle);
}
} }
} }
} }

View File

@ -0,0 +1,42 @@
package net.i2p.util;
import java.io.File;
import java.io.FileFilter;
import java.util.Locale;
/**
* A FileFilter that accepts regular files
* with a suffix and optionally a prefix, case-insensitive.
*
* @since 0.9.34
*/
public class FileSuffixFilter implements FileFilter {
private final String begin, end;
/**
* A filter that accepts regular files that
* end with suffix, case-insensitive.
*/
public FileSuffixFilter(String suffix) {
begin = null;
end = suffix.toLowerCase(Locale.US);
}
/**
* A filter that accepts regular files that
* start with prefix and
* end with suffix, case-insensitive.
*/
public FileSuffixFilter(String prefix, String suffix) {
begin = prefix.toLowerCase(Locale.US);
end = suffix.toLowerCase(Locale.US);
}
public boolean accept(File file) {
String name = file.getName().toLowerCase(Locale.US);
return name.endsWith(end) &&
(begin == null || name.startsWith(begin)) &&
file.isFile();
}
}

View File

@ -123,7 +123,7 @@ public class BundleRouterInfos {
List<File> toRead = new ArrayList<File>(2048); List<File> toRead = new ArrayList<File>(2048);
for (int j = 0; j < Base64.ALPHABET_I2P.length(); j++) { for (int j = 0; j < Base64.ALPHABET_I2P.length(); j++) {
File subdir = new File(dbDir, PersistentDataStore.DIR_PREFIX + Base64.ALPHABET_I2P.charAt(j)); File subdir = new File(dbDir, PersistentDataStore.DIR_PREFIX + Base64.ALPHABET_I2P.charAt(j));
File[] files = subdir.listFiles(PersistentDataStore.RouterInfoFilter.getInstance()); File[] files = subdir.listFiles(PersistentDataStore.RI_FILTER);
if (files == null) if (files == null)
continue; continue;
routerCount += files.length; routerCount += files.length;

View File

@ -11,8 +11,8 @@ package net.i2p.router.networkdb.kademlia;
import java.io.BufferedInputStream; import java.io.BufferedInputStream;
import java.io.BufferedOutputStream; import java.io.BufferedOutputStream;
import java.io.File; import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FilenameFilter;
import java.io.Flushable; import java.io.Flushable;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
@ -34,6 +34,7 @@ import net.i2p.data.router.RouterInfo;
import net.i2p.router.JobImpl; import net.i2p.router.JobImpl;
import net.i2p.router.Router; import net.i2p.router.Router;
import net.i2p.router.RouterContext; import net.i2p.router.RouterContext;
import net.i2p.util.FileSuffixFilter;
import net.i2p.util.FileUtil; import net.i2p.util.FileUtil;
import net.i2p.util.I2PThread; import net.i2p.util.I2PThread;
import net.i2p.util.Log; import net.i2p.util.Log;
@ -392,7 +393,7 @@ public class PersistentDataStore extends TransientDataStore {
private void readFiles() { private void readFiles() {
int routerCount = 0; int routerCount = 0;
File routerInfoFiles[] = _dbDir.listFiles(RouterInfoFilter.getInstance()); File routerInfoFiles[] = _dbDir.listFiles(RI_FILTER);
if (_flat) { if (_flat) {
if (routerInfoFiles != null) { if (routerInfoFiles != null) {
routerCount = routerInfoFiles.length; routerCount = routerInfoFiles.length;
@ -421,7 +422,7 @@ public class PersistentDataStore extends TransientDataStore {
List<File> toRead = new ArrayList<File>(2048); List<File> toRead = new ArrayList<File>(2048);
for (int j = 0; j < B64.length(); j++) { for (int j = 0; j < B64.length(); j++) {
File subdir = new File(_dbDir, DIR_PREFIX + B64.charAt(j)); File subdir = new File(_dbDir, DIR_PREFIX + B64.charAt(j));
File[] files = subdir.listFiles(RouterInfoFilter.getInstance()); File[] files = subdir.listFiles(RI_FILTER);
if (files == null) if (files == null)
continue; continue;
long lastMod = subdir.lastModified(); long lastMod = subdir.lastModified();
@ -583,7 +584,7 @@ public class PersistentDataStore extends TransientDataStore {
if (!subdir.exists()) if (!subdir.exists())
subdir.mkdir(); subdir.mkdir();
} }
File routerInfoFiles[] = f.listFiles(RouterInfoFilter.getInstance()); File routerInfoFiles[] = f.listFiles(RI_FILTER);
if (routerInfoFiles != null) if (routerInfoFiles != null)
migrate(f, routerInfoFiles); migrate(f, routerInfoFiles);
} }
@ -597,7 +598,7 @@ public class PersistentDataStore extends TransientDataStore {
private static void unmigrate(File dbdir) { private static void unmigrate(File dbdir) {
for (int j = 0; j < B64.length(); j++) { for (int j = 0; j < B64.length(); j++) {
File subdir = new File(dbdir, DIR_PREFIX + B64.charAt(j)); File subdir = new File(dbdir, DIR_PREFIX + B64.charAt(j));
File[] files = subdir.listFiles(RouterInfoFilter.getInstance()); File[] files = subdir.listFiles(RI_FILTER);
if (files == null) if (files == null)
continue; continue;
for (int i = 0; i < files.length; i++) { for (int i = 0; i < files.length; i++) {
@ -628,6 +629,9 @@ public class PersistentDataStore extends TransientDataStore {
private final static String ROUTERINFO_PREFIX = "routerInfo-"; private final static String ROUTERINFO_PREFIX = "routerInfo-";
private final static String ROUTERINFO_SUFFIX = ".dat"; private final static String ROUTERINFO_SUFFIX = ".dat";
/** @since 0.9.34 */
public static final FileFilter RI_FILTER = new FileSuffixFilter(ROUTERINFO_PREFIX, ROUTERINFO_SUFFIX);
private static String getLeaseSetName(Hash hash) { private static String getLeaseSetName(Hash hash) {
return LEASESET_PREFIX + hash.toBase64() + LEASESET_SUFFIX; return LEASESET_PREFIX + hash.toBase64() + LEASESET_SUFFIX;
} }
@ -693,14 +697,4 @@ public class PersistentDataStore extends TransientDataStore {
return; return;
} }
} }
static class RouterInfoFilter implements FilenameFilter {
private static final FilenameFilter _instance = new RouterInfoFilter();
public static final FilenameFilter getInstance() { return _instance; }
public boolean accept(File dir, String name) {
if (name == null) return false;
name = name.toUpperCase(Locale.US);
return (name.startsWith(ROUTERINFO_PREFIX.toUpperCase(Locale.US)) && name.endsWith(ROUTERINFO_SUFFIX.toUpperCase(Locale.US)));
}
}
} }