package org.opennms.netmgt.jasper.helper;
import java.io.File;
import java.io.FileInputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
public class ResourcePathFileTraversal{
private final File m_file;
private List<String> m_dataSourceFilterList = new ArrayList<String>();
public ResourcePathFileTraversal(File f) {
m_file = f;
if(!m_file.exists()) {
System.err.println("Directory does not exist: " + f.getAbsolutePath());
}
}
public List<String> traverseDirectory() {
List<String> paths = new ArrayList<String>();
addTopLevelIfNecessary(paths);
traverseDirectory(m_file, paths);
return paths;
}
private void addTopLevelIfNecessary(List<String> paths) {
File[] fList = m_file.listFiles();
if(fList != null) {
for(File f : fList) {
if(f.isFile()) {
onDirectory(m_file, paths);
break;
}
}
}
}
private void traverseDirectory(File f, List<String> dirPaths) {
if(f.isDirectory()) {
final File[] children = f.listFiles();
for(File child : children) {
if(child.isDirectory()) {
onDirectory(child, dirPaths);
traverseDirectory(child, dirPaths);
}
}
return;
}
onFile(f);
}
private void onFile(File f) {
System.err.println(f.getName());
}
private void onDirectory(File f, List<String> dirPaths) {
if(System.getProperty("org.opennms.rrd.storeByGroup") != null && System.getProperty("org.opennms.rrd.storeByGroup").toLowerCase().equals("true")) {
try {
if(validateDataSource(f)) {
dirPaths.add(f.getAbsolutePath());
}
}catch(IOException ioException) {
}
}else {
if(validateFiles(f)) {
dirPaths.add(f.getAbsolutePath());
}
}
}
private boolean validateDataSource(File f) throws IOException {
FilenameFilter dsFilenameFilter = new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.equals("ds.properties");
}
};
if(f.list(dsFilenameFilter).length > 0) {
Properties prop = new Properties();
FileInputStream fis = new FileInputStream(f.getAbsolutePath() + "/ds.properties");
prop.load(fis);
fis.close();
for(String datasource : m_dataSourceFilterList) {
if(prop.get(datasource) == null) {
return false;
}
}
}
return true;
}
private boolean validateFiles(final File f) {
List<FilenameFilter> filterList = getFilenameFilters();
for(FilenameFilter filter : filterList) {
String[] files = f.list(filter);
if(files.length == 0) {
return false;
}
}
return true;
}
private List<FilenameFilter> getFilenameFilters() {
List<FilenameFilter> filters = new ArrayList<FilenameFilter>();
for(final String dsName : m_dataSourceFilterList) {
filters.add(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.contains(dsName);
}
});
}
return filters;
}
public void addDatasourceFilters(String[] dsNames) {
if(dsNames != null) {
for(String dsName : dsNames) {
m_dataSourceFilterList.add(dsName);
}
}
}
public void addDatasourceFilter(String dataSource) {
m_dataSourceFilterList.add(dataSource);
}
}