package org.fandev.actions.generation;
import com.intellij.ide.fileTemplates.*;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.fileTypes.FileTypeManager;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.util.IncorrectOperationException;
import org.fandev.module.pod.PodModel;
import org.fandev.utils.VirtualFileUtil;
import org.jetbrains.annotations.NonNls;
import org.fandev.icons.Icons;
import org.fandev.lang.fan.FanBundle;
import java.io.IOException;
import java.util.*;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
/**
* @author Dror Bereznitsky
* @date Apr 1, 2009 3:52:01 PM
*/
public class FanTemplatesFactory implements FileTemplateGroupDescriptorFactory {
@NonNls
public static final String[] TEMPLATES = {
"FanClass.fan", "FanMixin.fan", "FanEnum.fan", "FanBuildScript.fan"};
private ArrayList<String> myCustomTemplates = new ArrayList<String>();
private static final Logger logger = Logger.getInstance("org.fandev.actions.generation.FanTemplatesFactory");
private static FanTemplatesFactory myInstance = new FanTemplatesFactory();
public static FanTemplatesFactory getInstance() {
return myInstance;
}
public void registerCustomTemplates(final String... templates) {
for (final String template : templates) {
myCustomTemplates.add(template);
}
}
public FileTemplateGroupDescriptor getFileTemplatesDescriptor() {
final FileTemplateGroupDescriptor group =
new FileTemplateGroupDescriptor(FanBundle.message("file.template.group.title.fan"), Icons.FAN_16);
final FileTypeManager fileTypeManager = FileTypeManager.getInstance();
for (final String template : TEMPLATES) {
group.addTemplate(new FileTemplateDescriptor(template, fileTypeManager.getFileTypeByFileName(template).getIcon()));
}
// register custom templates
for (final String template : getInstance().getCustomTemplates()) {
group.addTemplate(new FileTemplateDescriptor(template, fileTypeManager.getFileTypeByFileName(template).getIcon()));
}
return group;
}
public static PsiFile createFromTemplate(final PsiDirectory directory,
final String fileName,
final String templateName,
@NonNls final EnumMap<TemplateProperty, String> parameters) throws IncorrectOperationException {
final FileTemplate template = FileTemplateManager.getInstance().getDefaultTemplate(templateName);
final Properties properties = new Properties(FileTemplateManager.getInstance().getDefaultProperties());
for (final TemplateProperty propertyName : parameters.keySet()) {
properties.setProperty(propertyName.toString(), parameters.get(propertyName));
}
String text;
try {
text = template.getText(properties);
}
catch (Exception e) {
throw new RuntimeException("Unable to load template for " + FileTemplateManager.getInstance().internalTemplateToSubject(templateName),
e);
}
// Get rid of parameters with null settings from being written to the build.fan file.
if (PodModel.BUILD_FAN.equals(fileName)) {
Pattern p = Pattern.compile("^.*\\[\\]$", Pattern.MULTILINE);
Matcher m = p.matcher(text);
text = m.replaceAll("");
p = Pattern.compile("^.*= $", Pattern.MULTILINE);
m = p.matcher(text);
text = m.replaceAll("");
p = Pattern.compile("^.*= \"\"$", Pattern.MULTILINE);
m = p.matcher(text);
text = m.replaceAll("");
p = Pattern.compile("^.*= Version.fromStr\\(\"\"\\)$", Pattern.MULTILINE);
m = p.matcher(text);
text = m.replaceAll("");
}
final VirtualFile v =
VirtualFileUtil.refreshAndFindFileByLocalPath(
VirtualFileUtil.buildUrl(directory.getVirtualFile().getPath(), fileName));
try {
v.setBinaryContent(text.getBytes());
final PsiManager manager = PsiManager.getInstance(directory.getProject());
final PsiFile file = manager.findFile(v);
return file;
}
catch (IOException e) {
logger.error("IOException writing to build.fan!");
}
return null;
}
public String[] getCustomTemplates() {
return myCustomTemplates.toArray(new String[0]);
}
}