package org.reuseware.air.comogen.output; import java.io.IOException; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.HashMap; import org.antlr.stringtemplate.AttributeRenderer; import org.antlr.stringtemplate.StringTemplate; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.jdt.core.IJavaProject; import org.osgi.framework.Bundle; import org.reuseware.air.comogen.ICompositionSystemContext; import org.reuseware.air.comogen.plugin.Activator; import org.antlr.stringtemplate.StringTemplateGroup; import org.antlr.stringtemplate.language.AngleBracketTemplateLexer; /** * Template generators use string templates to generate file system output. * * @author skarol * */ public abstract class TemplateGenerator extends OutputGeneratorBase implements IOutputGenerator{ public static final String baseLanguagePrefix = "b_"; public static final String reuseLanguagePrefix = "r_"; public static final String templateDirectory = "/templates/"; private Map<String,Object> templateAttributes = null; /** * Text formatter * * @author b0kaj * */ public class BasicFormatRenderer implements AttributeRenderer { public String toString(Object o) { return o.toString(); } public String toString(Object o, String formatName) { if (formatName.equals("toUpper")) { return o.toString().toUpperCase(); } else if (formatName.equals("toLower")) { return o.toString().toLowerCase(); } else if (formatName.equals("capitalize")) { return cap(o.toString()); } else if (formatName.equals("firstlowercase")) { return cup(o.toString()); } else { throw new IllegalArgumentException("Unsupported format name"); } } } public TemplateGenerator(){ templateAttributes = new HashMap<String,Object>(); } public void generate(IJavaProject project, ICompositionSystemContext systemContext) throws IOException, CoreException { initialiseTemplateParameters(systemContext); doGenerate(project,systemContext); } protected abstract void doGenerate(IJavaProject project, ICompositionSystemContext systemContext)throws IOException, CoreException; /** * Capitalize a string (upper-case first letter) * * @param str * @return */ public String cap(String str) { return str.toString().substring(0, 1).toUpperCase() + str.toString().substring(1); } /** * Make sure that the first letter in a string is lower case * * @param str * @return */ public String cup(String str) { return str.substring(0,1).toLowerCase() + str.substring(1); } public StringTemplateGroup initialiseTemplateGroup(String templateName)throws IOException{ Bundle bundle = Activator.getDefault().getBundle(); IPath path = new Path(templateDirectory+templateName); InputStream inStream = FileLocator.openStream(bundle,path,false); // load the StringTemplate template StringTemplateGroup templates = new StringTemplateGroup(new BufferedReader(new InputStreamReader(inStream)), AngleBracketTemplateLexer.class); // allow some more formatting on strings templates.registerRenderer(String.class, new BasicFormatRenderer()); return templates; } public void initialiseTemplateParameters(ICompositionSystemContext context){ putTemplateAttribute("baselanguage", context.getBaseLanguageName()); putTemplateAttribute("reuselanguage",context.getReuseLanguageName()); putTemplateAttribute("baselanguagepackage",context.getBaseLanguageBasePackageName()); putTemplateAttribute("reuselanguagepackage",context.getReuseLanguageBasePackageName()); putTemplateAttribute("algebrapackage",context.getAlgebraPackage()); putTemplateAttribute("composerpackage",context.getComposerPackage()); putTemplateAttribute("fragmentpackage",context.getFragmentInterfacePackage()); putTemplateAttribute("fragmentimplpackage",context.getFragmentInterfaceImplementationPackage()); putTemplateAttribute("pluginpackage",context.getActivatorPackage()); putTemplateAttribute("utilitypackage",context.getUtilityPackage()); } protected final void putTemplateAttribute(String key,Object value){ if(key==null||value==null) throw new IllegalArgumentException(); templateAttributes.put(key, value); } @SuppressWarnings("unchecked") public final void setTemplateAttributes(StringTemplate template){ Map neededAttributes = template.getFormalArguments(); for(Object name:neededAttributes.keySet()){ template.setAttribute((String)name,templateAttributes.get(name)); } } }