// Copyright (c) 2003-2005 by Leif Frenzel - see http://leiffrenzel.de
package net.sf.eclipsefp.haskell.core.code;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import net.sf.eclipsefp.haskell.core.HaskellCorePlugin;
import net.sf.eclipsefp.haskell.core.internal.code.CodeGenerator;
import net.sf.eclipsefp.haskell.core.internal.util.CoreTexts;
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.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubProgressMonitor;
/** <p>helper to generate the code in the new module.</p>
*
* @author Leif Frenzel
*/
public class SourceFileGenerator {
private final CodeGenerator fCodeGenerator;
/**
* should we overwrite existing files?
*/
private boolean overwrite=true;
public SourceFileGenerator( final CodeGenerator codeGenerator ) {
fCodeGenerator = codeGenerator;
}
public SourceFileGenerator() {
this(new CodeGenerator());
}
/** 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( CoreTexts.sourceFileGenerator_creating, 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;
if (!result.exists()){
result.getLocation().toFile().mkdirs();
}
}
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 pName=info.getProject()!=null?info.getProject().getName():""; //$NON-NLS-1$
String pref=info.getTemplatePreferenceName();
String fileContent = fCodeGenerator.createModuleContent( pName,segments,
moduleName,
style,pref );
String fileName = createFileName( style, moduleName );
IFile result = destFolder.getFile( new Path( fileName ) );
try {
SubProgressMonitor subMon = monitor==null?null:new SubProgressMonitor( monitor, 4 );
if (!result.exists()){
String charSet=destFolder.getDefaultCharset( true );
InputStream isContent = new ByteArrayInputStream( fileContent.getBytes(charSet) );
result.create( isContent, true, subMon );
} else if (overwrite){
String charSet=result.getCharset();
InputStream isContent = new ByteArrayInputStream( fileContent.getBytes(charSet) );
result.setContents( isContent,true,true,subMon);
}
return result;
} catch (UnsupportedEncodingException uee){
throw new CoreException( new Status(IStatus.ERROR,HaskellCorePlugin.getPluginId(),uee.getLocalizedMessage(),uee) );
}
}
private static String[] getPathSegments( final ModuleCreationInfo info ) {
IPath path = info.getFolders();
return ( path == null || !info.isFoldersQualify() ) ? new String[ 0 ] : path.segments();
}
protected String createFileName(final EHaskellCommentStyle style, final String moduleName ) {
return moduleName + "." + style.getFileExtension(); //$NON-NLS-1$
}
public boolean isOverwrite() {
return overwrite;
}
public void setOverwrite( final boolean overwrite ) {
this.overwrite = overwrite;
}
}