package org.textmapper.lapg.ui;
import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.textmapper.lapg.ui.settings.SettingsPersister;
import org.textmapper.tool.gen.TMOptions;
public class LapgProjectSettings {
public static final IPath SETTINGS_FILE = new Path(".textmapper");
private final IFile myFile;
private volatile Map<IPath, TMOptions> mySettings;
public LapgProjectSettings(IProject project) {
myFile = project.getFile(SETTINGS_FILE);
}
public IProject getProject() {
return myFile.getProject();
}
public IProject[] getReferencedProjects() {
Collection<IProject> usedProjects = new LinkedHashSet<IProject>();
for(TMOptions opts : getSettings().values()) {
List<String> folders = opts.getIncludeFolders();
if(folders == null) {
continue;
}
for(String folder : folders) {
Path path = new Path(folder);
if(path.isAbsolute()) {
IResource resource = ResourcesPlugin.getWorkspace().getRoot().findMember(path);
if(resource instanceof IFolder) {
IProject p = resource.getProject();
if(p != null && p.isAccessible()) {
usedProjects.add(p);
}
}
}
}
}
return usedProjects.isEmpty() ? null : usedProjects.toArray(new IProject[usedProjects.size()]);
}
public Map<IPath, TMOptions> getSettings() {
Map<IPath, TMOptions> result = mySettings;
if(result == null) {
result = readSettings();
mySettings = result;
}
return result;
}
public void reloadSettings() {
mySettings = null;
}
private Map<IPath, TMOptions> readSettings() {
if (!myFile.exists()) {
return Collections.emptyMap();
}
try {
String content = FileUtil.getStreamContents(myFile.getContents(), myFile.getCharset());
return SettingsPersister.load(content);
} catch (IOException ex) {
} catch (CoreException e) {
}
return Collections.emptyMap();
}
}