
org.kuali.common.util.FileSystemUtils Maven / Gradle / Ivy
/**
* Copyright 2010-2012 The Kuali Foundation
*
* Licensed under the Educational Community License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.opensource.org/licenses/ecl2.php
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.kuali.common.util;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class FileSystemUtils {
private static final Logger logger = LoggerFactory.getLogger(FileSystemUtils.class);
public static List syncFiles(List requests) throws IOException {
List results = new ArrayList();
for (SyncRequest request : requests) {
SyncResult result = syncFiles(request);
results.add(result);
}
return results;
}
public static SyncResult syncFiles(SyncRequest request) throws IOException {
logger.info("Sync [{}] -> [{}]", request.getSrcDir(), request.getDstDir());
List dstFiles = getAllFiles(request.getDstDir());
List srcFiles = request.getSrcFiles();
List dstPaths = getRelativePaths(request.getDstDir(), dstFiles);
List srcPaths = getRelativePaths(request.getSrcDir(), srcFiles);
List adds = new ArrayList();
List updates = new ArrayList();
List deletes = new ArrayList();
for (String srcPath : srcPaths) {
boolean existing = dstPaths.contains(srcPath);
if (existing) {
updates.add(srcPath);
} else {
adds.add(srcPath);
}
}
for (String dstPath : dstPaths) {
boolean extra = !srcPaths.contains(dstPath);
if (extra) {
deletes.add(dstPath);
}
}
copyFiles(request.getSrcDir(), request.getSrcFiles(), request.getDstDir());
SyncResult result = new SyncResult();
result.setAdds(getFullPaths(request.getDstDir(), adds));
result.setUpdates(getFullPaths(request.getDstDir(), updates));
result.setDeletes(getFullPaths(request.getDstDir(), deletes));
return result;
}
protected static void copyFiles(File srcDir, List files, File dstDir) throws IOException {
for (File file : files) {
String relativePath = getRelativePath(srcDir, file);
File dstFile = new File(dstDir, relativePath);
FileUtils.copyFile(file, dstFile);
}
}
protected static List getFullPaths(File dir, List relativePaths) {
List files = new ArrayList();
for (String relativePath : relativePaths) {
File file = new File(dir, relativePath);
files.add(file);
}
return files;
}
protected static List getRelativePaths(File dir, List files) {
List relativePaths = new ArrayList();
for (File file : files) {
String relativePath = getRelativePath(dir, file);
relativePaths.add(relativePath);
}
return relativePaths;
}
protected static String getRelativePath(File dir, File file) {
String dirPath = LocationUtils.getCanonicalPath(dir);
String filePath = LocationUtils.getCanonicalPath(file);
if (!StringUtils.contains(filePath, dirPath)) {
throw new IllegalArgumentException(file + " does not reside under " + dir);
}
return StringUtils.remove(filePath, dirPath);
}
protected static List getAllFiles(File dir) {
SimpleScanner scanner = new SimpleScanner(dir, Arrays.asList("**/*"), Arrays.asList("**/.svn/**", "**/.git/**"));
return scanner.getFiles();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy