package jhydra.core.config;
import jhydra.core.config.exceptions.InvalidProjectNameException;
import jhydra.core.exceptions.FatalException;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.filefilter.IOFileFilter;
import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.List;
/**
* Author: jantic
* Date: 1/14/13
*/
public class ProjectConfigFactory {
private final IProgramConfig programConfig;
public ProjectConfigFactory(IProgramConfig programConfig){
this.programConfig = programConfig;
}
public IProjectConfig getProjectConfigByName(String name) throws FatalException {
final List<IProjectConfig> projectConfigs = getAllProjectConfigs();
for(IProjectConfig projectConfig : projectConfigs){
final String projectName = projectConfig.getProjectName();
if(projectName.equalsIgnoreCase(name)){
return projectConfig;
}
}
throw new InvalidProjectNameException(name);
}
public List<IProjectConfig> getAllProjectConfigs() throws FatalException {
final File projectsDirectory = new File(programConfig.getProjectsDirectory());
return getAllProjectConfigs(projectsDirectory);
}
//recursively searches until a hit is made.
public List<IProjectConfig> getAllProjectConfigs(File directory) throws FatalException {
final File file = FileUtils.getFile(directory, "jhydra.project");
final List<IProjectConfig> projectConfigs = new ArrayList<>();
if(file.exists()){
final IProjectConfig projectConfig = new ProjectConfig(programConfig, file.toURI());
projectConfigs.add(projectConfig);
}
else{
final FileFilter directoryFilter = getDirectoryFilter();
final File[] subDirectories = directory.listFiles(directoryFilter);
if(subDirectories != null){
for(File subDirectory : subDirectories){
projectConfigs.addAll(getAllProjectConfigs(subDirectory));
}
}
}
return projectConfigs;
}
private IOFileFilter getDirectoryFilter(){
return new IOFileFilter() {
@Override
public boolean accept(File file) {
return file.isDirectory() && !isTempDirectory(file) && !isHiddenDirectory(file);
}
@Override
public boolean accept(File file, String s) {
return file.isDirectory() && !isTempDirectory(file) && !isHiddenDirectory(file);
}
};
}
private Boolean isTempDirectory(File file){
return FilenameUtils.getName(file.getName()).equalsIgnoreCase("temp");
}
private Boolean isHiddenDirectory(File file){
return file.isHidden();
}
}