// Copyright (c) 2003-2005 by Leif Frenzel - see http://leiffrenzel.de
package net.sf.eclipsefp.haskell.ui.wizards;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.Scanner;
import net.sf.eclipsefp.haskell.core.code.ModuleCreationInfo;
import net.sf.eclipsefp.haskell.ui.internal.util.UITexts;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.SubProgressMonitor;
/**
* <p>
* helper to generate the code in the new module from a template.
* </p>
*
* @author Leif Frenzel
* @author Alejandro Serrano
*/
public class TemplateFileGenerator {
public static String MODULE_REPLACEMENT = "${module}";
String contents;
String fileExtension;
public TemplateFileGenerator(final String contents, final String extension) {
this.contents = contents;
this.fileExtension = extension;
}
public TemplateFileGenerator(final InputStream stream, final String extension) {
@SuppressWarnings("resource")
Scanner scanner = new Scanner(stream);
this.contents = scanner.useDelimiter("\\Z").next();
this.fileExtension = extension;
}
/** Creates the new type using the specified information values. */
public IFile createFile( final IProgressMonitor monitor,
final ModuleCreationInfo info ) throws CoreException {
if( monitor != null ) {
monitor.beginTask( UITexts.creating_file, 12 );
}
IContainer destFolder = createFolders( info, monitor ); // (6)
IFile result = createFile( info, destFolder, monitor ); // (4)
refresh( info, monitor ); // (2)
if( monitor != null ) {
monitor.done();
}
return result;
}
// helping methods
// ////////////////
private IContainer createFolders( final ModuleCreationInfo info,
final IProgressMonitor monitor ) throws CoreException {
IPath foldersPath = info.getFolders();
IContainer sourceContainer = info.getSourceContainer();
IContainer result = null;
if( foldersPath != null && foldersPath.segmentCount() > 0 ) {
String[] segments = foldersPath.segments();
IContainer folder = sourceContainer;
for( int i = 0; i < segments.length; i++ ) {
IPath path = new Path( segments[ i ] );
folder = folder.getFolder( path );
if( !folder.exists() && folder instanceof IFolder ) {
SubProgressMonitor subMon = new SubProgressMonitor( monitor, 1 );
( ( IFolder )folder ).create( false, true, subMon );
}
}
result = folder;
} else {
result = sourceContainer;
}
return result;
}
private void refresh( final ModuleCreationInfo info,
final IProgressMonitor monitor ) throws CoreException {
SubProgressMonitor refMon = monitor == null ? null
: new SubProgressMonitor( monitor, 2 );
IContainer srcContainer = info.getSourceContainer();
srcContainer.refreshLocal( IResource.DEPTH_INFINITE, refMon );
}
private IFile createFile( final ModuleCreationInfo info,
final IContainer destFolder, final IProgressMonitor monitor )
throws CoreException {
//final String[] segments = getPathSegments( info );
final String moduleName = info.getModuleName();
//final EHaskellCommentStyle style = info.getCommentStyle();
String fileContent = contents.replace( MODULE_REPLACEMENT, info.getQualifiedModuleName() );
String fileName = createFileName( moduleName );
IFile result = destFolder.getFile( new Path( fileName ) );
InputStream isContent = new ByteArrayInputStream( fileContent.getBytes() );
SubProgressMonitor subMon = monitor == null ? null
: new SubProgressMonitor( monitor, 4 );
result.create( isContent, true, subMon );
return result;
}
// private static String[] getPathSegments( final ModuleCreationInfo info ) {
// IPath path = info.getFolders();
// return ( path == null ) ? new String[ 0 ] : path.segments();
// }
private String createFileName( final String moduleName ) {
return moduleName + "." + fileExtension; //$NON-NLS-1$
}
}