You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ace.apache.org by br...@apache.org on 2013/04/29 16:42:59 UTC
svn commit: r1477108 -
/ace/trunk/org.apache.ace.obr/src/org/apache/ace/obr/storage/file/BundleFileStore.java
Author: bramk
Date: Mon Apr 29 14:42:58 2013
New Revision: 1477108
URL: http://svn.apache.org/r1477108
Log:
ACE-346 Consider file changes in all sub directories
Modified:
ace/trunk/org.apache.ace.obr/src/org/apache/ace/obr/storage/file/BundleFileStore.java
Modified: ace/trunk/org.apache.ace.obr/src/org/apache/ace/obr/storage/file/BundleFileStore.java
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.obr/src/org/apache/ace/obr/storage/file/BundleFileStore.java?rev=1477108&r1=1477107&r2=1477108&view=diff
==============================================================================
--- ace/trunk/org.apache.ace.obr/src/org/apache/ace/obr/storage/file/BundleFileStore.java (original)
+++ ace/trunk/org.apache.ace.obr/src/org/apache/ace/obr/storage/file/BundleFileStore.java Mon Apr 29 14:42:58 2013
@@ -26,8 +26,12 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.channels.FileChannel;
+import java.util.ArrayList;
import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.List;
import java.util.Map;
+import java.util.Stack;
import java.util.concurrent.ConcurrentHashMap;
import java.util.jar.Attributes;
import java.util.jar.JarInputStream;
@@ -55,28 +59,24 @@ public class BundleFileStore implements
private static int BUFFER_SIZE = 8 * 1024;
private static final String REPOSITORY_XML = "repository.xml";
- private final Map<String, Long> m_foundFiles = new ConcurrentHashMap<String, Long>();
private final Object m_dirLock = new Object();
private volatile MetadataGenerator m_metadata; /* will be injected by dependencymanager */
private volatile LogService m_log; /* will be injected by dependencymanager */
+ private volatile Map<String, Long> m_foundFiles;;
+
/** protected by m_dirLock. */
private File m_dir;
public void generateMetadata() throws IOException {
File dir = getWorkingDir();
- File[] files = dir.listFiles();
-
m_metadata.generateMetadata(dir);
-
- for (File current : files) {
- m_foundFiles.put(current.getAbsolutePath(), current.lastModified() ^ current.length());
- }
+ m_foundFiles = mapDirectory(dir);
}
public InputStream get(String fileName) throws IOException {
- if (REPOSITORY_XML.equals(fileName) && directoryChanged(getWorkingDir())) {
+ if (REPOSITORY_XML.equals(fileName) && directoryChanged(getWorkingDir(), m_foundFiles)) {
generateMetadata(); // might be called too often
}
FileInputStream result = null;
@@ -153,13 +153,12 @@ public class BundleFileStore implements
synchronized (m_dirLock) {
m_dir = newDir;
}
-
- m_foundFiles.clear();
+ m_foundFiles = null;
}
}
else {
// clean up after getting a null as dictionary, as the service is going to be pulled afterwards
- m_foundFiles.clear();
+ m_foundFiles = null;
}
}
@@ -175,28 +174,47 @@ public class BundleFileStore implements
}
}
- @SuppressWarnings("boxing")
- private boolean directoryChanged(File dir) {
- File[] files = dir.listFiles();
+ private Map<String, Long> mapDirectory(File dir) {
+ Map<String, Long> foundFiles = new HashMap<String, Long>();
+ Stack<File> dirs = new Stack<File>();
+ dirs.push(dir);
+ while(!dirs.isEmpty()){
+ File pwd = dirs.pop();
+ for(File file : pwd.listFiles()){
+ if(file.isDirectory()){
+ dirs.push(file);
+ } else {
+ foundFiles.put(file.getAbsolutePath(), file.lastModified() ^ file.length());
+ }
+ }
+ }
+ return foundFiles;
+ }
- // if number of files changed, create new metadata
- if (files.length != m_foundFiles.size()) {
+ private boolean directoryChanged(File dir, Map<String, Long> foundFiles) {
+ if(foundFiles == null){
return true;
}
-
- // iterate over the current files
- for (File current : files) {
- Long modifiedDateAndLengthXOR = m_foundFiles.get(current.getAbsolutePath());
- // if one of the current files is not in the old set of files, create new metadata
- if (modifiedDateAndLengthXOR == null) {
- return true;
- }
- // else if of one of the files the size or the date has been changed, create new metadata
- if ((current.lastModified() ^ current.length()) != modifiedDateAndLengthXOR) {
- return true;
+ Stack<File> dirs = new Stack<File>();
+ dirs.push(dir);
+ int fileCount = 0;
+ while(!dirs.isEmpty()){
+ File pwd = dirs.pop();
+ for(File file : pwd.listFiles()){
+ if(file.isDirectory()){
+ dirs.push(file);
+ } else {
+ fileCount++;
+ Long modifiedDateAndLengthXOR = foundFiles.get(file.getAbsolutePath());
+ if(modifiedDateAndLengthXOR == null || (file.lastModified() ^ file.length()) != modifiedDateAndLengthXOR){
+ return true;
+ }
+ }
}
}
-
+ if(fileCount != foundFiles.size()){
+ return true;
+ }
return false;
}