package com.sap.furcas.ide.projectwizard.util;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
/**
* This class is called by the doFinish() method of the Wizard. It creates the Language Project and the necessary files etc with
* the help of the classes {@link SourceCodeFactory} and {@link WizardProjectHelper}.
*
* @author Frederik Petersen (D054528)
*
*/
public class CreateProject {
private static final String ORIGINAL_FILE_LOCATION_ROOT = "src";
private final ProjectInfo projectInfo;
private final SourceCodeFactory codeFactory;
/**
* Give the user input to the instance.
*/
public CreateProject(ProjectInfo pi) {
this.projectInfo = pi;
this.codeFactory = new SourceCodeFactory();
}
/**
* This class does all the needed steps to set the variables for the {@link WizardProjectHelper} and the calling of it's
* methods. Afterwords all other furcas specific files are built.
*
* @param monitor
* The progress monitor for the process of file creation
* @return The generated project.
* @throws CodeGenerationException
*/
public IProject createProject(IProgressMonitor monitor) throws CodeGenerationException {
List<String> srcfolders = new ArrayList<String>();
srcfolders.add("src");
srcfolders.add("generated");
List<String> exportedPackages = new ArrayList<String>();
exportedPackages.add(projectInfo.getProjectName() + ".editor");
exportedPackages.add(projectInfo.getProjectName() + ".parser");
List<String> nonSrcFolders = new ArrayList<String>();
nonSrcFolders.add("mapping");
nonSrcFolders.add("syntaxdefinition");
IProject dslProject = WizardProjectHelper.createPlugInProject(projectInfo, srcfolders, nonSrcFolders, exportedPackages, monitor, false);
if (dslProject == null) {
return null;
}
monitor.worked(1);
WizardProjectHelper.createFile("plugin.xml", dslProject, codeFactory.createPluginXML(projectInfo), monitor);
IFolder sourceTargetRootFolder = dslProject.getFolder(ORIGINAL_FILE_LOCATION_ROOT);
assert (sourceTargetRootFolder.exists());
createSourceFolder(projectInfo, sourceTargetRootFolder, monitor);
IFolder genRootFolder = dslProject.getFolder('/' + "generated");
assert (genRootFolder.exists());
createGeneratedFolder(genRootFolder, monitor, "");
IFolder syntaxDefFolder = dslProject.getFolder("syntaxdefinition");
assert (syntaxDefFolder.exists());
String templateString = codeFactory.createSampleTCS(projectInfo);
IFile grammar = WizardProjectHelper.createFile(projectInfo.getTCSFileName(), syntaxDefFolder, templateString, monitor);
// Opening the file for editing. Note that the wizard later on opens the .ecore file if the user
// chose to build a new metamodel project, so you won't see the effect of this coding in that case.
//
monitor.setTaskName("Opening file for editing...");
// FIXME: Disabled because it prevents the this class from being used in headless mode and subsequently
// from working in our hudson infrastructure.
//BasicNewResourceWizard.selectAndReveal(grammar, PlatformUI.getWorkbench().getActiveWorkbenchWindow());
monitor.worked(1);
return dslProject;
}
private IFolder createSourceFolder(ProjectInfo pi, IFolder srcDir, IProgressMonitor monitor) throws CodeGenerationException {
String basePath = "";
String[] split = pi.getProjectName().split("\\.");
for (int i = 0; i < split.length; i++) {
basePath += '/' + split[i];
IFolder f = srcDir.getFolder(basePath);
if (!f.exists()) {
try {
f.create(false, true, monitor);
} catch (CoreException e) {
throw new CodeGenerationException("Failed to create source: " + srcDir.getName(), e.getCause());
}
}
}
createEditorFolder(srcDir, monitor, basePath, pi);
createParserFolder(srcDir, monitor, basePath, pi);
return srcDir;
}
private IFolder createGeneratedFolder(IFolder srcDir, IProgressMonitor monitor, String basePath)
throws CodeGenerationException {
IFolder generatedFolder = srcDir.getFolder(basePath + "/generated");
if (!generatedFolder.exists()) {
try {
generatedFolder.create(false, true, monitor);
} catch (CoreException e) {
throw new CodeGenerationException("Failed to create folder '/generated'", e.getCause());
}
}
return generatedFolder;
}
private IFolder createParserFolder(IFolder srcDir, IProgressMonitor monitor, String basePath, ProjectInfo pi)
throws CodeGenerationException {
IFolder parserFolder = srcDir.getFolder(basePath + "/parser");
if (!parserFolder.exists()) {
try {
parserFolder.create(false, true, monitor);
} catch (CoreException e) {
throw new CodeGenerationException("Failed to create folder '/parser'", e.getCause());
}
}
WizardProjectHelper.createFile(capitalizeFirstChar(pi.getLanguageName()) + "ParserFactory.java", parserFolder,
codeFactory.createParserFactory(pi), monitor);
return parserFolder;
}
private IFolder createEditorFolder(IFolder srcDir, IProgressMonitor monitor, String basePath, ProjectInfo pi)
throws CodeGenerationException {
String editorFolderPath = basePath + "/editor";
IFolder editorFolder = srcDir.getFolder(editorFolderPath);
if (!editorFolder.exists()) {
try {
editorFolder.create(false, true, monitor);
} catch (CoreException e) {
throw new CodeGenerationException("Failed to create folder '/editor'", e.getCause());
}
}
WizardProjectHelper.createFile("Activator.java", editorFolder, codeFactory.createActivator(pi), monitor);
WizardProjectHelper.createFile(capitalizeFirstChar(pi.getLanguageName()) + "Editor.java", editorFolder,
codeFactory.createEditorCode(pi), monitor);
WizardProjectHelper.createFile(capitalizeFirstChar(pi.getLanguageName()) + "TokenColorer.java", editorFolder,
codeFactory.createColorerCode(pi), monitor);
WizardProjectHelper.createFile(capitalizeFirstChar(pi.getLanguageName()) + "ParseController.java", editorFolder,
codeFactory.crateParseController(pi), monitor);
return editorFolder;
}
/**
* Makes the first char of a string an upper case letter.
*
* @param s
* The string where the first letter will be set to upper case.
* @return The string with an upper case letter in first place.
*/
public static String capitalizeFirstChar(String s) {
return ("" + s.charAt(0)).toUpperCase() + s.substring(1);
}
}