package org.xpect.xtext.lib.setup.workspace;
import java.util.List;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.xtext.IGrammarAccess;
import org.xpect.Environment;
import org.xpect.XpectImport;
import org.xpect.XpectRequiredEnvironment;
import org.xpect.setup.ISetupInitializer;
import org.xpect.setup.XpectSetupFactory;
import org.xpect.setup.XpectSetupRoot;
import org.xpect.state.Creates;
import org.xpect.xtext.lib.setup.InjectorSetup;
import org.xpect.xtext.lib.util.GrammarAnalyzer;
import com.google.common.collect.Lists;
import com.google.inject.Injector;
@XpectSetupRoot
@XpectSetupFactory
@XpectRequiredEnvironment(Environment.PLUGIN_TEST)
@XpectImport({ InjectorSetup.class, File.class, Folder.class, JavaProject.class, Project.class, SrcFolder.class, ThisFile.class })
public class WorkspaceDefaultsSetup {
public static final Path XTEND_LIBRARY_PATH = new Path("org.eclipse.xtend.XTEND_CONTAINER");
private List<org.xpect.xtext.lib.setup.generic.Resource> genericResources = Lists.newArrayList();
private Workspace workspace;
public WorkspaceDefaultsSetup(ISetupInitializer<WorkspaceDefaultsSetup> initializer, Injector injector) {
super();
initialize(initializer, injector);
}
public void add(org.xpect.xtext.lib.setup.generic.Resource file) {
this.genericResources.add(file);
}
public void add(Workspace workspace) {
if (this.workspace != null)
throw new IllegalStateException("Only one workspace per setup is supported.");
this.workspace = workspace;
}
protected IResourceFactory<? extends IResource, IContainer> convert(org.xpect.xtext.lib.setup.generic.Resource res) {
if (res instanceof org.xpect.xtext.lib.setup.generic.ThisFile)
return new org.xpect.xtext.lib.setup.workspace.ThisFile((org.xpect.xtext.lib.setup.generic.ThisFile) res);
if (res instanceof org.xpect.xtext.lib.setup.generic.File)
return new File((org.xpect.xtext.lib.setup.generic.File) res);
if (res instanceof org.xpect.xtext.lib.setup.generic.Folder)
return new Folder((org.xpect.xtext.lib.setup.generic.Folder) res);
throw new IllegalStateException();
}
protected Workspace createWorkspace() {
return new Workspace();
}
public List<org.xpect.xtext.lib.setup.generic.Resource> getGenericResources() {
return genericResources;
}
@Creates
public Workspace getWorkspace() {
return this.workspace;
}
protected void initialize(ISetupInitializer<WorkspaceDefaultsSetup> initializer, Injector injector) {
initializer.initialize(this);
if (workspace == null)
add(createWorkspace());
initializeProject(injector);
}
protected void initializeDefaultProject() {
if (workspace.getDefaultProject() == null)
workspace.add(new Project("default_project"));
Project defaultProject = workspace.getDefaultProject();
for (org.xpect.xtext.lib.setup.generic.Resource res : getGenericResources())
defaultProject.add(convert(res));
if (workspace.getThisFile() == null)
defaultProject.add(new org.xpect.xtext.lib.setup.workspace.ThisFile());
}
protected void initializeJavaProject() {
if (workspace.getMember(JavaProject.class) == null)
workspace.add(new JavaProject("default_java_project"));
JavaProject javaProject = workspace.getMember(JavaProject.class);
initializeJavaProject(javaProject);
}
protected void initializeJavaProject(JavaProject javaProject) {
if (javaProject.getMember(SrcFolder.class) == null)
javaProject.add(new SrcFolder("src"));
SrcFolder srcFolder = javaProject.getMember(SrcFolder.class);
for (org.xpect.xtext.lib.setup.generic.Resource res : getGenericResources())
srcFolder.add(convert(res));
if (workspace.getThisFile() == null)
srcFolder.add(new org.xpect.xtext.lib.setup.workspace.ThisFile());
}
protected void initializeProject(Injector injector) {
GrammarAnalyzer ga = new GrammarAnalyzer(injector.getInstance(IGrammarAccess.class).getGrammar());
switch (ga.getLanguageKind()) {
case XBASE:
initializeXbaseProject();
break;
case JAVA:
initializeJavaProject();
break;
default:
initializeDefaultProject();
break;
}
}
protected void initializeXbaseProject() {
initializeJavaProject();
JavaProject javaProject = workspace.getMember(JavaProject.class);
javaProject.addClasspathEntry(JavaCore.newContainerEntry(XTEND_LIBRARY_PATH));
}
}