package org.eclipse.xtext.xdoc.ui.utils; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URI; import java.net.URL; import org.apache.log4j.Logger; import org.eclipse.core.resources.ICommand; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.SubMonitor; import org.eclipse.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaCore; import org.eclipse.xtext.ui.XtextProjectHelper; import org.eclipse.xtext.xdoc.ui.internal.XdocActivator; public class ProjectUtils { private String name; private URI location; private Logger logger = Logger.getLogger(this.getClass()); private String[] folders = {"src", "contents", "website", "META-INF" }; private String[] natures = { JavaCore.NATURE_ID, XtextProjectHelper.NATURE_ID, "org.eclipse.pde.PluginNature", }; private String[] builders = {JavaCore.BUILDER_ID, "org.eclipse.pde.SchemaBuilder", XtextProjectHelper.BUILDER_ID}; private IWorkspace workspace; public IWorkspace getWorkspace() { return workspace; } public void setWorkspace(IWorkspace workspace) { this.workspace = workspace; } public ProjectUtils() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public URI getLocation() { return location; } public void setLocation(URI location) { this.location = location; } public void createFile(IProject project, SubMonitor monitor, String string, String fileName) { IFile file = project.getFile(fileName); if(!file.exists()){ ByteArrayInputStream stream; try { stream = new ByteArrayInputStream(string.getBytes(file.getCharset(true))); file.create(stream, false, monitor.newChild(1)); stream.close(); } catch (Exception e) { logger.error(e.getMessage(), e); } finally{ monitor.done(); } } } public void createFile(IProject project, SubMonitor monitor, InputStream stream, String fileName) { IFile file = project.getFile(fileName); if(!file.exists()){ try { file.create(stream, false, monitor.newChild(1)); } catch (Exception e) { logger.error(e.getMessage(), e); } finally{ monitor.done(); } } } public void createProject(IProgressMonitor monitor) { IProject project = null; try { IProjectDescription description = workspace.newProjectDescription(this.getName()); if (this.getLocation() != null) { description.setLocationURI(this.getLocation()); } project = workspace.getRoot().getProject(this.getName()); description.setNatureIds(this.natures); addBuilders(description); SubMonitor subMonitor = SubMonitor.convert(monitor, 10); project.create(description, subMonitor.newChild(1)); project.open(subMonitor.newChild(1)); project.setDescription(description, subMonitor.newChild(1)); setupProject(project, subMonitor); subMonitor.done(); } catch (CoreException e) { logger.error(e.getMessage(), e); } } private void addBuilders(IProjectDescription description) { ICommand[] commands = new ICommand[builders.length]; for (int i = 0; i < commands.length; i++) { ICommand cmd = description.newCommand(); cmd.setBuilderName(builders[i]); commands[i] = cmd; } description.setBuildSpec(commands); } private void setupProject(IProject project, SubMonitor subMonitor) throws CoreException { for (String folderName : folders) { IFolder folder = project.getFolder(folderName); if(!folder.exists()){ folder.create(false, true, subMonitor.newChild(1)); } } IJavaProject jProject = JavaCore.create(project); IClasspathEntry[] cp = new IClasspathEntry[3]; cp[0] = JavaCore.newContainerEntry(new Path("org.eclipse.jdt.launching.JRE_CONTAINER")); cp[1] = JavaCore.newContainerEntry(new Path("org.eclipse.pde.core.requiredPlugins")); IClasspathEntry src = JavaCore.newSourceEntry(project.getFolder("src").getFullPath()); cp[2] = src; jProject.setRawClasspath(cp, subMonitor.newChild(1)); setupFiles(project, subMonitor); } private void setupFiles(IProject project, SubMonitor subMonitor) throws CoreException { createManifest(project, subMonitor); createDocumentAndChapter(project, subMonitor); // createWorkflow(project, subMonitor); createPluginXML(project, subMonitor); createCSSFiles(project, subMonitor); createImages(project, subMonitor); } private void createImages(IProject project, SubMonitor subMonitor) { try{ URL url = XdocActivator.getInstance().getBundle().getResource("resources/triangle.gif"); this.createFile(project, subMonitor, url.openStream(), "website/triangle.gif"); url = XdocActivator.getInstance().getBundle().getResource("resources/triangle-90.gif"); this.createFile(project, subMonitor, url.openStream(), "website/triangle-90.gif"); } catch (IOException e) { logger.error(e.getMessage(), e); throw new RuntimeException(e); } } private void createCSSFiles(IProject project, SubMonitor subMonitor) { try { URL url = XdocActivator.getInstance().getBundle().getResource("resources/code.css"); this.createFile(project, subMonitor, url.openStream(), "contents/code.css"); this.createFile(project, subMonitor, url.openStream(), "website/code.css"); url = XdocActivator.getInstance().getBundle().getResource("resources/book.css"); this.createFile(project, subMonitor, url.openStream(), "contents/book.css"); this.createFile(project, subMonitor, url.openStream(), "website/book.css"); url = XdocActivator.getInstance().getBundle().getResource("resources/novaAddon.css"); this.createFile(project, subMonitor, url.openStream(), "website/novaAddon.css"); } catch (IOException e) { logger.error(e.getMessage(), e); throw new RuntimeException(e); } } private void createManifest(IProject project, SubMonitor monitor) { StringBuilder fileContents = new StringBuilder(); fileContents.append("Manifest-Version: 1.0\n"); fileContents.append("Bundle-ManifestVersion: 2\n"); fileContents.append("Bundle-Name: " + project.getName().trim() + "\n"); fileContents.append("Bundle-SymbolicName: " + project.getName().trim() + ";singleton:=true\n"); fileContents.append("Bundle-Version: 1.0.0.qualifier\n"); fileContents.append("Bundle-Vendor: My Company\n"); fileContents.append("Require-Bundle: org.eclipse.help"); this.createFile(project, monitor, fileContents.toString(), "META-INF/MANIFEST.MF"); } private void createDocumentAndChapter(IProject project, SubMonitor monitor) { try { URL url = XdocActivator.getInstance().getBundle().getResource("resources/00-Main.xdoc"); this.createFile(project, monitor, url.openStream(), "src/00-Main.xdoc"); url = XdocActivator.getInstance().getBundle().getResource("resources/01-Introduction.xdoc"); this.createFile(project, monitor, url.openStream(), "src/01-Introduction.xdoc"); url = XdocActivator.getInstance().getBundle().getResource("resources/02-GettingStarted.xdoc"); this.createFile(project, monitor, url.openStream(), "src/02-GettingStarted.xdoc"); } catch (IOException e) { logger.error(e.getMessage(), e); throw new RuntimeException(e); } } // private void createWorkflow(IProject project, SubMonitor monitor) { // StringBuilder fileContents = new StringBuilder(); // fileContents.append("module GenerateDocs\n\n"); // fileContents.append("import org.eclipse.emf.mwe.utils.*\n\n"); // fileContents.append("var targetDir = \"src-gen\"\n"); // fileContents.append("var modelPath = \"src\"\n"); // fileContents.append("//var texbin = \"/usr/bin/pdflatex\"\n\n"); // fileContents.append("Workflow {\n\n"); // // fileContents.append("//\tcomponent = @workflow.XDocGenerator {\n"); // fileContents.append("//\t\t// or define search scope explicitly\n"); // fileContents.append("//\t\tmodelPath = modelPath\n"); // fileContents.append("//\t\ttargetDir = targetDir\n"); // fileContents.append("//\t\tpdfLatex = texbin\n"); // fileContents.append("//\t}\n\n"); // fileContents.append("\tcomponent = @workflow.XdocEclipseHelpGenerator{\n"); // fileContents.append("\t\t// or define search scope explicitly\n"); // fileContents.append("\t\tmodelPath = modelPath\n"); // fileContents.append("\t\ttargetDir = targetDir\n"); // fileContents.append("\t}\n}\n"); // this.createFile(project, monitor, fileContents.toString(), "workflow/generateDocs.mwe2"); // } private void createPluginXML(IProject project, SubMonitor monitor){ StringBuilder fileContents = new StringBuilder(); fileContents.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); fileContents.append("<?eclipse version=\"3.4\"?>\n"); fileContents.append("<plugin>\n"); fileContents.append(" <extension\n"); fileContents.append(" point=\"org.eclipse.help.toc\">\n"); fileContents.append(" <toc\n"); fileContents.append(" file=\"contents/toc.xml\"\n"); fileContents.append(" primary=\"true\">\n"); fileContents.append(" </toc>\n"); fileContents.append(" </extension>\n\n"); fileContents.append("</plugin>\n"); this.createFile(project, monitor, fileContents.toString(), "plugin.xml"); } }