package org.reuseware.air.comogen.output;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import org.antlr.stringtemplate.StringTemplate;
import org.antlr.stringtemplate.StringTemplateGroup;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.reuseware.air.comogen.ICompositionSystemContext;
public class CompositionAlgebraGenerator extends TemplateGenerator{
public static String ALGEBRA_FILE = "algebra.stg";
protected void doGenerate(IJavaProject project, ICompositionSystemContext systemContext) throws IOException, CoreException {
generateComponentModelAlgebra(project,systemContext);
}
/**
* Generates algebra for component model (actually, composition system)
*
* @param project
* @param baseDir
* @param base The base language name
* @param reuse The reuse language name
* @param baseTypes
* @param reuseTypes
* @throws IOException
* @throws CoreException
*/
private void generateComponentModelAlgebra(IJavaProject project, ICompositionSystemContext context) throws IOException, CoreException {
StringTemplateGroup templates = this.initialiseTemplateGroup(ALGEBRA_FILE);
IClasspathEntry cpe = this.getFirstSourceEntry(project);
IPackageFragmentRoot rootPackage = project.findPackageFragmentRoot(cpe.getPath());
IPackageFragment algebraPackage = rootPackage.createPackageFragment(context.getAlgebraPackage(),false,new NullProgressMonitor());
StringTemplate template;
/**
* Fragment
*/
template = templates.getInstanceOf("fragment");
super.setTemplateAttributes(template);
algebraPackage.createCompilationUnit("I"+cap(context.getBaseLanguageName())+"Fragment.java",template.toString(),false,new NullProgressMonitor());
/**
* Visitor
*/
template = templates.getInstanceOf("visitor");
setTemplateAttributes(template);
algebraPackage.createCompilationUnit(cap(context.getBaseLanguageName()) + "Visitor.java",template.toString(),false,new NullProgressMonitor());
/**
* Algebra
*/
template = templates.getInstanceOf("algebra");
setTemplateAttributes(template);
algebraPackage.createCompilationUnit(cap(context.getBaseLanguageName())+"Algebra.java",template.toString(),false,new NullProgressMonitor());
}
public void initialiseTemplateParameters(ICompositionSystemContext context){
super.initialiseTemplateParameters(context);
super.putTemplateAttribute("baseTypes",context.getBaseLanguageFragmentTypeNames());
super.putTemplateAttribute("reuseTypes",context.getReuseLanguageFragmentTypeNames());
List<String> fragmentTypeNames = new LinkedList<String>();
fragmentTypeNames.addAll(context.getBaseLanguageFragmentTypeNames());
fragmentTypeNames.addAll(context.getReuseLanguageFragmentTypeNames());
super.putTemplateAttribute("types",fragmentTypeNames);
}
}