Project: acceleo-webapp-generator
package org.eclipse.acceleo.tutorial.wizard;
 
import java.io.BufferedReader; 
import java.io.ByteArrayInputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.StringReader; 
import java.lang.reflect.InvocationTargetException; 
import java.net.URL; 
import java.nio.charset.Charset; 
import java.util.Enumeration; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 
 
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.ResourcesPlugin; 
import org.eclipse.core.runtime.CoreException; 
import org.eclipse.core.runtime.IPath; 
import org.eclipse.core.runtime.IProgressMonitor; 
import org.eclipse.core.runtime.Platform; 
import org.eclipse.jface.operation.IRunnableWithProgress; 
import org.eclipse.jface.viewers.IStructuredSelection; 
import org.eclipse.jface.wizard.IWizardContainer; 
import org.eclipse.jface.wizard.Wizard; 
import org.eclipse.ui.INewWizard; 
import org.eclipse.ui.IWorkbench; 
import org.eclipse.ui.dialogs.WizardNewProjectCreationPage; 
 
public class EclipseConWizard extends Wizard implements INewWizard { 
 
 protected WizardNewProjectCreationPage newEclipseConProjectPage = new WizardNewProjectCreationPage( 
   "Web app"); 
 
 public EclipseConWizard() { 
  super(); 
  setWindowTitle("WebApp tutorial"); //$NON-NLS-1$ 
  this.newEclipseConProjectPage 
    .setDescription("Creates a new webapp project and its matching extension project."); 
 
 
 public void init(IWorkbench workbench, IStructuredSelection selection) { 
 
 
 @Override 
 public void addPages() { 
  addPage(newEclipseConProjectPage); 
 
 
 @Override 
 public boolean performFinish() { 
  try { 
   IWizardContainer iWizardContainer = this.getContainer(); 
 
   IRunnableWithProgress projectWebappCreation = new IRunnableWithProgress() { 
    public void run(IProgressMonitor monitor) { 
     try { 
      IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject( 
        newEclipseConProjectPage.getProjectName()); 
      IPath location = newEclipseConProjectPage.getLocationPath(); 
      if (!project.exists()) { 
       IProjectDescription desc = project.getWorkspace().newProjectDescription( 
         newEclipseConProjectPage.getProjectName()); 
       if (ResourcesPlugin.getWorkspace().getRoot().getLocation().equals(location)) { 
        location = null
       
       desc.setLocation(location); 
       project.create(desc, monitor); 
       project.open(monitor); 
       initProject(project, monitor, "data/webapp"true); 
      
     catch (CoreException e) { 
      System.err.println(e.getMessage() + " -3"); 
     
    
   }; 
   IRunnableWithProgress projectExtensionCreation = new IRunnableWithProgress() { 
    public void run(IProgressMonitor monitor) { 
     try { 
      IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject( 
        newEclipseConProjectPage.getProjectName() + ".extension"); 
      IPath location = newEclipseConProjectPage.getLocationPath(); 
      if (!project.exists()) { 
       IProjectDescription desc = project.getWorkspace().newProjectDescription( 
         newEclipseConProjectPage.getProjectName()); 
       if (ResourcesPlugin.getWorkspace().getRoot().getLocation().equals(location)) { 
        location = null
       
       desc.setLocation(location); 
       project.create(desc, monitor); 
       project.open(monitor); 
       initProject(project, monitor, "data/extension"false); 
      
     catch (CoreException e) { 
      System.err.println(e + " -2"); 
     
    
   }; 
   iWizardContainer.run(falsefalse, projectWebappCreation); 
   iWizardContainer.run(falsefalse, projectExtensionCreation); 
   return true
  catch (InvocationTargetException e) { 
   System.err.println(e + "-1"); 
  catch (InterruptedException e) { 
   System.err.println(e + " 0"); 
  
  return false
 
 
 public void initProject(IProject project, IProgressMonitor monitor, String resourcesPath, 
   boolean withModelDirectory) { 
 
  try { 
   IFolder modelFolder = project.getFolder("model"); //$NON-NLS-1$ 
   if (withModelDirectory && !modelFolder.exists()) { 
    modelFolder.create(truetrue, monitor); 
   
 
   IFolder assetFolder = project.getFolder("assets"); //$NON-NLS-1$ 
   if (!assetFolder.exists()) { 
    assetFolder.create(truetrue, monitor); 
   
 
   IFolder cssFolder = assetFolder.getFolder("css"); //$NON-NLS-1$ 
   if (!cssFolder.exists()) { 
    cssFolder.create(truetrue, monitor); 
   
 
   IFolder imagesFolder = assetFolder.getFolder("images"); //$NON-NLS-1$ 
   if (!imagesFolder.exists()) { 
    imagesFolder.create(truetrue, monitor); 
   
 
   IFolder jsFolder = assetFolder.getFolder("js"); //$NON-NLS-1$ 
   if (!jsFolder.exists()) { 
    jsFolder.create(truetrue, monitor); 
   
 
   IFolder libFolder = jsFolder.getFolder("lib"); //$NON-NLS-1$ 
   if (!libFolder.exists()) { 
    libFolder.create(truetrue, monitor); 
   
 
   Enumeration<URL> findEntries = Platform.getBundle("org.eclipse.acceleo.tutorial").findEntries( 
     resourcesPath, "*.js"true); 
 
   while (findEntries.hasMoreElements()) { 
 
    String relativeFilePath = findEntries.nextElement().getPath(); 
    String fullFilePath = Platform.getBundle("org.eclipse.acceleo.tutorial").getLocation() 
      + relativeFilePath.substring(1); 
    if (fullFilePath.startsWith("reference:file:/")) { 
     fullFilePath = fullFilePath.substring("reference:file:/".length()); 
    
    File emtl = null
    try { 
     emtl = new File(java.net.URI.create(fullFilePath).getPath()); 
    catch (IllegalArgumentException a) { 
     // space in file path ? 
     emtl = new File(fullFilePath); 
    
    writeFile(emtl, libFolder, monitor); 
   
 
   findEntries = Platform.getBundle("org.eclipse.acceleo.tutorial").findEntries(resourcesPath, 
     "*.css"true); 
 
   while (findEntries.hasMoreElements()) { 
 
    String relativeFilePath = findEntries.nextElement().getPath(); 
    String fullFilePath = Platform.getBundle("org.eclipse.acceleo.tutorial").getLocation() 
      + relativeFilePath.substring(1); 
    if (fullFilePath.startsWith("reference:file:/")) { 
     fullFilePath = fullFilePath.substring("reference:file:/".length()); 
    
    File emtl = null
    try { 
     emtl = new File(java.net.URI.create(fullFilePath).getPath()); 
    catch (IllegalArgumentException a) { 
     // space in file path ? 
     emtl = new File(fullFilePath); 
    
    writeFile(emtl, cssFolder, monitor); 
   
  catch (CoreException e) { 
   System.err.println(e + " 1"); 
  
 
 
 public static void writeFile(File file, IFolder folder, IProgressMonitor monitor) { 
 
  String emtlContent = getFileContent(file); 
 
  IFile newFile = folder.getFile(file.getName()); 
  if (!newFile.exists()) { 
   InputStream contents = new ByteArrayInputStream(emtlContent.getBytes()); 
   try { 
    newFile.create(contents, true, monitor); 
   catch (CoreException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
   
  
 
 
 /**
  * Reads and return the given file's content as a String. If this file contains encoding information, 
  * we'll use this encoding to read its content. 
  *  
  * @param file 
  *            File we need to read. 
  * @return Content of the file, or the empty String if no such file exists. 
  */
 
 public static String getFileContent(File file) { 
  String content = readFileContent(file, null); 
  if (content.length() > 0) { 
   String charset = getCharset(content); 
   if (charset != null) { 
    content = readFileContent(file, charset); 
   
  
  return content; 
 
 
 /**
  * Tries and find an encoding value on the very first line of the file contents. 
  *  
  * @param fileContent 
  *            The content from which to read an encoding value. 
  * @return The charset name if it exists and is supported, <code>null</code> otherwise 
  */
 
 private static String getCharset(String fileContent) { 
  String trimmedContent = fileContent.trim(); 
  String charsetName = null
  if (trimmedContent.length() > 0) { 
   BufferedReader reader = new BufferedReader(new StringReader(trimmedContent)); 
   String firstLine = trimmedContent; 
   try { 
    firstLine = reader.readLine(); 
   catch (IOException e) { 
    // Cannot be thrown with a String Reader 
   
 
   Pattern encodingPattern = Pattern.compile("encoding\\s*=\\s*(\"|\')?([-a-zA-Z0-9]+)\1?"); //$NON-NLS-1$ 
   Matcher matcher = encodingPattern.matcher(firstLine); 
 
   if (matcher.find()) { 
    charsetName = matcher.group(2); 
   
  
  if (charsetName != null && Charset.isSupported(charsetName)) { 
   return charsetName; 
  
  return null
 
 
 /**
  * Reads and return the content of the given file as a String, given the charset name for this file's 
  * content. 
  *  
  * @param file 
  *            File we need to read. 
  * @param charsetName 
  *            Name of the charset we should use to read the file's content. 
  * @return Content of the file, or the empty String if no such file exists. 
  */
 
 private static String readFileContent(File file, String charsetName) { 
  StringBuffer buffer = new StringBuffer(); 
  FileInputStream input = null
  InputStreamReader streamReader = null
  try { 
   input = new FileInputStream(file); 
   if (charsetName != null) { 
    streamReader = new InputStreamReader(input, charsetName); 
   else { 
    streamReader = new InputStreamReader(input); 
   
 
   int size = 0
   final int buffLength = 8192
   char[] buff = new char[buffLength]; 
   while ((size = streamReader.read(buff)) > 0) { 
    buffer.append(buff, 0, size); 
   
  catch (IOException e) { 
   // continue and return an empty string 
  finally { 
   try { 
    if (streamReader != null) { 
     streamReader.close(); 
    
    if (input != null) { 
     input.close(); 
    
   catch (IOException e) { 
    // continue and return an empty string 
   
  
  return buffer.toString(); 
 
}