package jenkins.security.s2m;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Bit of a hack to expand {@link ConfigFile} to support conf.d format that assembles the fragment.
*
* <p>
* {@link #file} points to the "primary" file that we programmatically write to.
*
* @author Kohsuke Kawaguchi
*/
abstract class ConfigDirectory<T,COL extends Collection<T>> extends ConfigFile<T,COL> {
private final File dir;
protected ConfigDirectory(File file) {
super(file);
this.dir = file.getParentFile();
}
@Override
public synchronized void load() {
COL result = create();
if (dir.exists()) {
String[] fragments = dir.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".conf");
}
});
if (fragments!=null) {
Arrays.sort(fragments);
for (String fragment : fragments) {
File f = new File(dir, fragment);
try {
BufferedReader reader = new BufferedReader(new FileReader(f));
String line;
while ((line=reader.readLine())!=null) {
if (line.startsWith("#")) continue; // comment
T r = parse(line);
if (r != null)
result.add(r);
}
} catch (IOException e) {
LOGGER.log(Level.WARNING, "Failed to parse "+f,e);
}
}
}
}
parsed = readOnly(result);
}
private static final Logger LOGGER = Logger.getLogger(ConfigDirectory.class.getName());
}