package org.eclipselabs.spray.xtext.ui.wizard; import java.io.IOException; import java.net.URL; import java.util.Enumeration; 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.resources.IWorkspaceRoot; import org.eclipse.core.resources.IncrementalProjectBuilder; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.xtext.builder.EclipseResourceFileSystemAccess; import org.eclipse.xtext.ui.wizard.AbstractPluginProjectCreator; import org.eclipse.xtext.util.IAcceptor; import org.eclipselabs.spray.xtext.ui.internal.SprayActivator; import org.eclipselabs.spray.xtext.ui.wizard.codegen.NewProjectGenerator; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import com.google.inject.Inject; public class SprayProjectCreator extends AbstractPluginProjectCreator { protected static final String DSL_GENERATOR_PROJECT_NAME = "org.eclipselabs.spray.generator.graphiti"; protected static final String SRC_ROOT = "src"; protected static final String SRC_GEN_ROOT = "src-gen"; protected static final String MODEL_ROOT = "model"; protected final List<String> SRC_FOLDER_LIST = ImmutableList.of(SRC_ROOT, SRC_GEN_ROOT, MODEL_ROOT); protected final String rootpath = "/resources/newProjectFiles"; @Inject private EclipseResourceFileSystemAccess fileSystemAccess; @Inject private NewProjectGenerator newProjectGenerator; @Inject private IWorkspaceRoot root; @Override protected SprayProjectInfo getProjectInfo() { return (SprayProjectInfo) super.getProjectInfo(); } protected String getModelFolderName() { return MODEL_ROOT; } @Override protected List<String> getAllFolders() { SprayProjectInfo info = getProjectInfo(); return Lists.newArrayList(info.getJavaMainSrcDir(), info.getJavaGenSrcDir(), info.getSprayModelDir()); } protected void enhanceProject(final IProject project, final IProgressMonitor monitor) throws CoreException { createRootFiles(project, monitor); project.build(IncrementalProjectBuilder.FULL_BUILD, monitor); IFile generatedPluginXml = project.getFile(getProjectInfo().getJavaGenSrcDir() + "/plugin.xml"); if (generatedPluginXml.exists()) { generatedPluginXml.copy(project.getFullPath().append("/plugin.xml"), true, new NullProgressMonitor()); } } protected void createRootFiles(final IProject project, final IProgressMonitor monitor) throws CoreException { copyRootFiles(project, monitor, rootpath); generateFiles(project, monitor); } protected void copyRootFiles(final IProject project, final IProgressMonitor monitor, String basepath) throws CoreException { Enumeration<String> entries = SprayActivator.getInstance().getBundle().getEntryPaths(basepath); while (entries.hasMoreElements()) { String entry = entries.nextElement(); URL url = SprayActivator.getInstance().getBundle().getResource(entry); String targetPath = entry.substring(rootpath.length()); if (entry.endsWith("/")) { IFolder folder = project.getFolder(targetPath); if (!folder.exists()) { folder.create(true, true, monitor); } copyRootFiles(project, monitor, entry); } else { try { IFile targetFile = project.getFile(targetPath); if (targetFile.exists()) targetFile.delete(true, monitor); targetFile.create(url.openStream(), true, monitor); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } protected void generateFiles(final IProject project, final IProgressMonitor monitor) throws CoreException { // Register the names of all projects as outlet names for (IProject p : root.getProjects()) { fileSystemAccess.setOutputPath(p.getName(), p.getName()); } fileSystemAccess.setNewFileAcceptor(new IAcceptor<String>() { @Override public void accept(String t) { IFile file = root.getFile(new Path(t)); try { file.setDerived(false, monitor); } catch (CoreException e) { ; // can be ignored } } }); newProjectGenerator.doGenerate(getProjectInfo(), fileSystemAccess); } @Override protected IFile getModelFile(IProject project) throws CoreException { return project.getFile(getProjectInfo().getSprayModelDir() + "/" + getProjectInfo().getDiagramTypeName() + ".spray"); } @Override protected String getActivatorClassName() { return getProjectInfo().getBasePackage() + ".Activator"; } @Override protected List<String> getImportedPackages() { return Lists.newArrayList("org.apache.log4j", "org.apache.commons.logging", "org.eclipse.xtext.xbase.lib", "org.eclipse.xtext.xtend2.lib"); } @Override protected List<String> getRequiredBundles() { List<String> result = Lists.newArrayList("org.eclipse.ui", "org.eclipse.core.runtime", "org.eclipse.emf.ecore", "org.eclipse.graphiti;bundle-version=\"0.8.0\"", "org.eclipse.graphiti.mm;bundle-version=\"0.8.0\"", "org.eclipse.graphiti.pattern;bundle-version=\"0.8.0\"", "org.eclipse.graphiti.ui;bundle-version=\"0.8.0\"", "org.eclipse.graphiti.ui.capabilities;bundle-version=\"0.8.0\"", "org.eclipselabs.spray.runtime.graphiti", "org.eclipse.ui.views.properties.tabbed;bundle-version=\"3.5.200\"", "org.eclipse.emf;bundle-version=\"2.6.0\"", "org.eclipse.emf.transaction;bundle-version=\"1.4.0\"", "org.eclipselabs.spray.xtext", "org.eclipse.xtext.ui"); String mmBundle = getProjectInfo().getMetamodelBundleName(); if (mmBundle != null && !result.contains(mmBundle)) { result.add(mmBundle); } return result; } }