package org.reuseware.air.comogen;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EPackage;
import org.reuseware.air.comogen.util.MethodStruct;
import org.reuseware.air.comogen.util.CMSLSpecificationUtil;
import org.reuseware.air.language.cmsl.Construct;
import org.reuseware.air.language.cmsl.ExtensionStatement;
import org.reuseware.air.language.cmsl.Fragtypes;
import org.reuseware.air.language.cmsl.Reference;
import org.eclipse.jdt.core.IJavaProject;
public class CompositionSystemContext implements ICompositionSystemContext {
private IExtensionContext extension = null;
private EPackage baseLanguagePackage = null;
private EPackage reuseLanguagePackage = null;
private List<String> baseTypes = new LinkedList<String>();
private List<String> reuseTypes = new LinkedList<String>();
public CompositionSystemContext( IExtensionContext extension){
if(extension==null)
throw new IllegalArgumentException("Extension must not be null.");
this.extension = extension;
baseLanguagePackage = extension.getBaseLanguagePackage();
reuseLanguagePackage = extension.getExtensionLanguagePackage();
initialiseComponentModelFragTypes(extension.getExtensionProgram().getStatements());
}
public String getCompositionSystemProjectBase() {
return getReuseLanguageBasePackageName() + ".ics";
}
public String getFragmentInterfacePackage() {
return getCompositionSystemProjectBase() + ".fragment";
}
public String getFragmentInterfaceImplementationPackage() {
return getCompositionSystemProjectBase() + ".fragment.impl";
}
public String getActivatorPackage(){
return getCompositionSystemProjectBase() + ".plugin";
}
public String getComposerPackage(){
return getCompositionSystemProjectBase() + ".composers";
}
public String getUtilityPackage(){
return getCompositionSystemProjectBase() + ".util";
}
public String getAlgebraPackage(){
return getCompositionSystemProjectBase() + ".algebra";
}
public List<MethodStruct> getComposerSignature() {
return CMSLSpecificationUtil.getComposerSignatures(extension.getExtensionProgram().getStatements());
}
public List<String> getBaseLanguageFragmentTypeNames(){
return baseTypes;
}
public List<String> getReuseLanguageFragmentTypeNames(){
return reuseTypes;
}
public String getBaseLanguageBasePackageName() {
return getReuseLanguagePackage().getNsPrefix()+"."+extension.getBaseLanguageName();
}
public String getBaseLanguageName() {
return baseLanguagePackage.getName();
}
public String getReuseLanguageBasePackageName() {
return getReuseLanguagePackage().getNsPrefix()+"."+getReuseLanguageName();
}
public String getReuseLanguageName() {
return getReuseLanguagePackage().getName();
}
public EPackage getBaseLanguagePackage() {
return baseLanguagePackage;
}
public EPackage getReuseLanguagePackage() {
return reuseLanguagePackage;
}
/**
* Returns the specified fragment type names.
*/
private void initialiseComponentModelFragTypes(EList<ExtensionStatement> statements) {
Fragtypes fragTypesConstruct = getFirstFragtypesConstruct(statements);
EList<Object> list = fragTypesConstruct.getFragtype();
for (Object obj : list) {
if (obj instanceof Reference) {
Reference ref = (Reference)obj;
String name = CMSLSpecificationUtil.getNTName(ref.getBase());
baseTypes.add(name);
}
else if (obj instanceof Construct) {
Construct construct = (Construct)obj;
String name = CMSLSpecificationUtil.getNTName(construct.getName());
reuseTypes.add(name);
}
}
}
/**
* Returns the first Fragtypes construct from CMSL statement list.
* (stupid, there should be only one in the model)
* @param statements - the statement list
* @return first FragType statement in list.
*/
private Fragtypes getFirstFragtypesConstruct(EList<ExtensionStatement> statements) {
for (Iterator<ExtensionStatement> i = statements.iterator(); i.hasNext(); ) {
ExtensionStatement statement = (ExtensionStatement)i.next();
if (statement instanceof Fragtypes) {
return (Fragtypes)statement;
}
}
return null;
}
}