package org.erlide.engine.internal.model.root;
import java.io.File;
import java.io.FilenameFilter;
import org.eclipse.core.resources.ProjectScope;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.erlide.engine.model.root.IErlProject;
import org.erlide.engine.model.root.IProjectConfigurator;
import org.erlide.engine.model.root.IProjectConfiguratorFactory;
import org.erlide.engine.model.root.OTPProjectConfigurator;
import org.erlide.engine.model.root.ProjectConfigType;
public class ProjectConfiguratorFactory implements IProjectConfiguratorFactory {
private static IProjectConfiguratorFactory instance;
public static IProjectConfiguratorFactory getDefault() {
if (instance == null) {
instance = new ProjectConfiguratorFactory();
}
return instance;
}
private ProjectConfiguratorFactory() {
}
@Override
public IProjectConfigurator getConfig(final ProjectConfigType configType,
final IErlProject project) {
IProjectConfigurator result = null;
switch (configType) {
case INTERNAL:
final String configName = configType.getConfigName();
final IEclipsePreferences node = new ProjectScope(
project.getWorkspaceProject()).getNode(configName);
result = new PreferencesProjectConfigurator(node);
break;
case REBAR:
case EMAKE:
result = getConfig(configType, new File(
project.getWorkspaceProject().getLocation().toPortableString()));
}
return result;
}
@Override
public IProjectConfigurator getConfig(final ProjectConfigType configType,
final File directory) {
IProjectConfigurator result = null;
switch (configType) {
case INTERNAL:
result = new PreferencesProjectConfigurator(null);
break;
case REBAR:
case EMAKE:
final String configName = configType.getConfigName();
final String[] resources = directory.list(new FilenameFilter() {
@Override
public boolean accept(final File dir, final String name) {
return dir.equals(directory) && name.equals(configName);
}
});
if (resources.length == 0) {
// TODO is this ok?
return new OTPProjectConfigurator();
}
final String path = directory.getAbsolutePath() + "/" + resources[0];
switch (configType) {
case REBAR:
result = new FileProjectConfigurator(new RebarConfigurationSerializer(),
path);
break;
case EMAKE:
result = new FileProjectConfigurator(new EmakeConfigurationSerializer(),
path);
break;
default:
break;
}
}
return result;
}
}