Author: gnodet
Date: Mon Dec 14 16:33:26 2015
New Revision: 1719952
URL: http://svn.apache.org/viewvc?rev=1719952&view=rev
Log:
FELIX-5137 Added felix.fileinstall.subdir.mode = jar | skip | recurse
Modified:
felix/trunk/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/DirectoryWatcher.java
felix/trunk/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/FileInstall.java
felix/trunk/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/Scanner.java
felix/trunk/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/WatcherScanner.java
Modified:
felix/trunk/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/DirectoryWatcher.java
URL:
http://svn.apache.org/viewvc/felix/trunk/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/DirectoryWatcher.java?rev=1719952&r1=1719951&r2=1719952&view=diff
==============================================================================
---
felix/trunk/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/DirectoryWatcher.java
(original)
+++
felix/trunk/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/DirectoryWatcher.java
Mon Dec 14 16:33:26 2015
@@ -106,6 +106,7 @@ public class DirectoryWatcher extends Th
public final static String OPTIONAL_SCOPE =
"felix.fileinstall.optionalImportRefreshScope";
public final static String FRAGMENT_SCOPE =
"felix.fileinstall.fragmentRefreshScope";
public final static String DISABLE_NIO2 = "felix.fileinstall.disableNio2";
+ public final static String SUBDIR_MODE = "felix.fileinstall.subdir.mode";
public final static String SCOPE_NONE = "none";
public final static String SCOPE_MANAGED = "managed";
@@ -185,12 +186,12 @@ public class DirectoryWatcher extends Th
this.context.addBundleListener(this);
if (disableNio2) {
- scanner = new Scanner(watchedDirectory, filter);
+ scanner = new Scanner(watchedDirectory, filter,
properties.get(SUBDIR_MODE));
} else {
try {
- scanner = new WatcherScanner(context, watchedDirectory,
filter);
+ scanner = new WatcherScanner(context, watchedDirectory,
filter, properties.get(SUBDIR_MODE));
} catch (Throwable t) {
- scanner = new Scanner(watchedDirectory, filter);
+ scanner = new Scanner(watchedDirectory, filter,
properties.get(SUBDIR_MODE));
}
}
}
Modified:
felix/trunk/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/FileInstall.java
URL:
http://svn.apache.org/viewvc/felix/trunk/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/FileInstall.java?rev=1719952&r1=1719951&r2=1719952&view=diff
==============================================================================
---
felix/trunk/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/FileInstall.java
(original)
+++
felix/trunk/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/FileInstall.java
Mon Dec 14 16:33:26 2015
@@ -104,6 +104,7 @@ public class FileInstall implements Bund
set(ht, DirectoryWatcher.NO_INITIAL_DELAY);
set(ht, DirectoryWatcher.START_LEVEL);
set(ht, DirectoryWatcher.OPTIONAL_SCOPE);
+ set(ht, DirectoryWatcher.SUBDIR_MODE);
// check if dir is an array of dirs
String dirs = ht.get(DirectoryWatcher.DIR);
Modified:
felix/trunk/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/Scanner.java
URL:
http://svn.apache.org/viewvc/felix/trunk/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/Scanner.java?rev=1719952&r1=1719951&r2=1719952&view=diff
==============================================================================
---
felix/trunk/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/Scanner.java
(original)
+++
felix/trunk/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/Scanner.java
Mon Dec 14 16:33:26 2015
@@ -44,8 +44,15 @@ import java.util.zip.CRC32;
*/
public class Scanner implements Closeable {
+ public final static String SUBDIR_MODE_JAR = "jar";
+ public final static String SUBDIR_MODE_SKIP = "skip";
+ public final static String SUBDIR_MODE_RECURSE = "recurse";
+
final File directory;
final FilenameFilter filter;
+ final boolean jarSubdir;
+ final boolean skipSubdir;
+ final boolean recurseSubdir;
// Store checksums of files or directories
Map<File, Long> lastChecksums = new HashMap<File, Long>();
@@ -58,7 +65,7 @@ public class Scanner implements Closeabl
*/
public Scanner(File directory)
{
- this(directory, null);
+ this(directory, null, null);
}
/**
@@ -66,8 +73,9 @@ public class Scanner implements Closeabl
*
* @param directory the directory to scan
* @param filterString a filter for file names
+ * @param subdirMode to use when scanning
*/
- public Scanner(File directory, final String filterString)
+ public Scanner(File directory, final String filterString, String
subdirMode)
{
this.directory = canon(directory);
if (filterString != null && filterString.length() > 0)
@@ -85,6 +93,9 @@ public class Scanner implements Closeabl
{
this.filter = null;
}
+ this.jarSubdir = subdirMode == null ||
SUBDIR_MODE_JAR.equals(subdirMode);
+ this.skipSubdir = SUBDIR_MODE_SKIP.equals(subdirMode);
+ this.recurseSubdir = SUBDIR_MODE_RECURSE.equals(subdirMode);
}
/**
@@ -117,25 +128,44 @@ public class Scanner implements Closeabl
{
return null;
}
+ return processFiles(reportImmediately, list);
+ }
+
+ private Set<File> processFiles(boolean reportImmediately, File[] list)
+ {
Set<File> files = new HashSet<File>();
Set<File> removed = new HashSet<File>(storedChecksums.keySet());
for (File file : list)
{
+ if (file.isDirectory())
+ {
+ if (skipSubdir)
+ {
+ continue;
+ }
+ else if (recurseSubdir)
+ {
+ files.addAll(processFiles(reportImmediately,
file.listFiles(filter)));
+ continue;
+ }
+ }
long lastChecksum = lastChecksums.get(file) != null ? (Long)
lastChecksums.get(file) : 0;
long storedChecksum = storedChecksums.get(file) != null ? (Long)
storedChecksums.get(file) : 0;
long newChecksum = checksum(file);
lastChecksums.put(file, newChecksum);
- // Only handle file when it does not change anymore and it has
changed since last reported
- if ((newChecksum == lastChecksum || reportImmediately) &&
newChecksum != storedChecksum) {
+ // Only handle file when it does not change anymore and it has
changed
+ // since last reported
+ if ((newChecksum == lastChecksum || reportImmediately) &&
newChecksum != storedChecksum)
+ {
storedChecksums.put(file, newChecksum);
files.add(file);
}
removed.remove(file);
}
+ // Make sure we'll handle a file that has been deleted
+ files.addAll(removed);
for (File file : removed)
{
- // Make sure we'll handle a file that has been deleted
- files.addAll(removed);
// Remove no longer used checksums
lastChecksums.remove(file);
storedChecksums.remove(file);
Modified:
felix/trunk/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/WatcherScanner.java
URL:
http://svn.apache.org/viewvc/felix/trunk/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/WatcherScanner.java?rev=1719952&r1=1719951&r2=1719952&view=diff
==============================================================================
---
felix/trunk/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/WatcherScanner.java
(original)
+++
felix/trunk/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/WatcherScanner.java
Mon Dec 14 16:33:26 2015
@@ -42,9 +42,10 @@ public class WatcherScanner extends Scan
*
* @param directory the directory to scan
* @param filterString a filter for file names
+ * @param subdirMode to use when scanning
*/
- public WatcherScanner(BundleContext bundleContext, File directory, String
filterString) throws IOException {
- super(directory, filterString);
+ public WatcherScanner(BundleContext bundleContext, File directory, String
filterString, String subdirMode) throws IOException {
+ super(directory, filterString, subdirMode);
this.bundleContext = bundleContext;
if (filterString != null) {
this.fileMatcher =
FileSystems.getDefault().getPathMatcher("regex:" + filterString);
@@ -115,11 +116,23 @@ public class WatcherScanner extends Scan
@Override
protected void process(Path path) {
File file = path.toFile();
- while (!file.getParentFile().equals(directory)) {
- file = file.getParentFile();
- if (file == null) {
+ if (!file.getParentFile().equals(directory)) {
+ // File is in a sub directory.
+ if (skipSubdir) {
+ return;
+ }
+ if (jarSubdir) {
+ // Walk up until the first level sub-directory.
+ do {
+ file = file.getParentFile();
+ if (file == null) {
+ // The file was not actually inside the watched directory.
+ // Should not happen.
return;
- }
+ }
+ } while (!file.getParentFile().equals(directory));
+ }
+ // Otherwise we recurse by adding the file as-is.
}
synchronized (changed) {
changed.add(file);
@@ -128,16 +141,7 @@ public class WatcherScanner extends Scan
@Override
protected void onRemove(Path path) {
- File file = path.toFile();
- while (!file.getParentFile().equals(directory)) {
- file = file.getParentFile();
- if (file == null) {
- return;
- }
- }
- synchronized (changed) {
- changed.add(file);
- }
+ process(path);
}
@Override