package org.reuseware.air.comogen.output;
import java.io.IOException;
import org.antlr.stringtemplate.StringTemplate;
import org.antlr.stringtemplate.StringTemplateGroup;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
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.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.reuseware.air.comogen.ICompositionSystemContext;
/**
* Responsible for generating all the meta files for the component model plugin.
* Essentially, the MANIFEST.MF and plugin.xml files.
*/
public class InfrastructureGenerator extends TemplateGenerator implements IOutputGenerator{
public static String ACTIVATOR_STRING_TEMPLATE = "activator.stg";
public static String ACTIVATOR_FILE = "%pck/plugin/Activator.java";
public static String MANIFEST_STRING_TEMPLATE = "manifest.stg";
public static String MANIFEST_FILE = "/META-INF/MANIFEST.MF";
public static String PLUGIN_STRING_TEMPLATE = "plugin.stg";
public static String PLUGIN_FILE = "/plugin.xml";
/**
* Generates activator file for the component model plugin
*
* @param project
* @param baseDir
* @param base
* @throws IOException
* @throws CoreException
*/
private void generateActivatorFile(IJavaProject project, ICompositionSystemContext context) throws IOException, CoreException
{
StringTemplateGroup templates = initialiseTemplateGroup(ACTIVATOR_STRING_TEMPLATE);
IClasspathEntry cpe = this.getFirstSourceEntry(project);
IPackageFragmentRoot rootPackage = project.findPackageFragmentRoot(cpe.getPath());
IPackageFragment activatorPackage = rootPackage.createPackageFragment(context.getActivatorPackage(),false,new NullProgressMonitor());
StringTemplate template = templates.getInstanceOf("activator");
setTemplateAttributes(template);
activatorPackage.createCompilationUnit("Activator.java",template.toString(),false,new NullProgressMonitor());
return;
}
/**
* Generates MANIFEST.MF file for component model.
*
* @param project
* @param base
* @param reuse
* @throws CoreException
*/
private void generateManifestFile(IProject project, ICompositionSystemContext context) throws IOException, CoreException
{
StringTemplateGroup templates = this.initialiseTemplateGroup("manifest.stg");
StringTemplate template = templates.getInstanceOf("manifest");
setTemplateAttributes(template);
String instanciatedValue = template.toString();
IFile file = project.getFile(MANIFEST_FILE);
setContent(instanciatedValue,file);
}
/**
* Generates plugin.xml file for component model package.
*
* @param project
* @param baseDir
* @param base
* @param reuse
* @param composers
* @throws IOException
* @throws CoreException
*/
private void generatePluginFile(IProject project, ICompositionSystemContext context)
throws IOException, CoreException
{
StringTemplateGroup templates = this.initialiseTemplateGroup("plugin.stg");
StringTemplate template = templates.getInstanceOf("xmlplugin");
setTemplateAttributes(template);
IFile file = project.getProject().getFile(PLUGIN_FILE);
String instanciationString = template.toString();
setContent(instanciationString,file);
}
public void initialiseTemplateParameters(ICompositionSystemContext context){
super.initialiseTemplateParameters(context);
putTemplateAttribute("reuselanguagens",context.getReuseLanguagePackage().getNsURI());
putTemplateAttribute("composers", extractSignatureStrings(context.getComposerSignature()));
}
protected void doGenerate(IJavaProject project, ICompositionSystemContext systemContext) throws IOException, CoreException {
generateActivatorFile(project,systemContext);
generateManifestFile(project.getProject(),systemContext);
generatePluginFile(project.getProject(), systemContext);
}
}