package org.reuseware.air.comogen;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.common.util.URI;
import org.reuseware.air.comogen.util.CMSLSpecificationUtil;
import org.reuseware.air.language.cmsl.BaseDeclaration;
import org.reuseware.air.language.cmsl.ExtensionDeclaration;
import org.reuseware.air.language.cmsl.ExtensionProgram;
public class ExtensionContext implements IExtensionContext {
private EPackage baseLanguagePackage = null;
private EPackage extensionLanguagePackage = null;
private ExtensionProgram extensionProgram = null;
private ResourceSet resourceSet = null;
private URI extensionTargetURL = null;
private URI extensionGenModelTargetURL = null;
private boolean extensionDone = false;
public ExtensionContext(ExtensionProgram csmlExtension){
if(csmlExtension==null)
throw new IllegalArgumentException("Extension program must not be null.");
extensionProgram = csmlExtension;
BaseDeclaration baseDeclaration = extensionProgram.getBase();
ExtensionDeclaration extensionDeclaration = extensionProgram.getExtension();
URI specURL = csmlExtension.eResource().getURI();
resourceSet = new ResourceSetImpl();
initialiseBase(baseDeclaration, specURL);
initialiseExtension(extensionDeclaration, specURL);
}
private void initialiseBase(BaseDeclaration baseDeclaration, URI specURL){
URI baseNs = URI.createURI(baseDeclaration.getNsuri());
URI baseURL = null;
if(baseDeclaration.getSourceurl()!=null){
baseURL = URI.createURI(baseDeclaration.getSourceurl());
if(baseURL.isRelative()){
baseURL = baseURL.resolve(specURL);
}
}
if(baseURL!=null)
baseLanguagePackage = CMSLSpecificationUtil.loadLanguageModel(baseURL,baseNs);
else
baseLanguagePackage = CMSLSpecificationUtil.loadLanguageModelFromRegistry(baseNs);
}
private void initialiseExtension(ExtensionDeclaration extensionDeclaration, URI specURL){
String extensionNSURI = null;
if(extensionDeclaration.getNsuri()==null){
String baseURI = baseLanguagePackage.getNsURI();
int index = baseURI.lastIndexOf('/');
String commonPrefix = null;
if(index==-1){
commonPrefix = "";
}
else{
commonPrefix = baseURI.substring(0,index+1);
}
extensionNSURI = URI.createURI(commonPrefix+extensionDeclaration.getName()).toString();
}
else{
extensionNSURI = extensionDeclaration.getNsuri();
}
String extensionNSPrefix = null;
if(extensionDeclaration.getNsprefix()==null){
extensionNSPrefix = baseLanguagePackage.getNsPrefix();
}
else{
extensionNSPrefix = extensionDeclaration.getNsprefix();
}
extensionTargetURL = null;
if(extensionDeclaration.getTargeturl()==null){
String fileExtension = "ecore";
String fileName = extensionDeclaration.getName() + "." + fileExtension;
extensionTargetURL = URI.createURI(fileName);
}
else{
extensionTargetURL = URI.createURI(extensionDeclaration.getTargeturl());
}
if(extensionTargetURL.isRelative())
extensionTargetURL = extensionTargetURL.resolve(specURL);
String genFileExtension = "genmodel";
String genFileName = extensionDeclaration.getName() + "." +genFileExtension;
extensionGenModelTargetURL = URI.createURI(genFileName);
extensionGenModelTargetURL = extensionGenModelTargetURL.resolve(extensionTargetURL);
extensionLanguagePackage = EcoreFactory.eINSTANCE.createEPackage();
extensionLanguagePackage.setName(extensionDeclaration.getName());
extensionLanguagePackage.setNsPrefix(extensionNSPrefix);
extensionLanguagePackage.setNsURI(extensionNSURI);
}
/* (non-Javadoc)
* @see org.reuseware.air.comogen.cmsl.IExtensionContext#getPackageForLanguagePrefix(java.lang.String)
*/
public EPackage getPackageForLanguagePrefix(String languagePrefix) {
if(languagePrefix.equals(extensionProgram.getBase().getName()))
return baseLanguagePackage;
return null;
}
/* (non-Javadoc)
* @see org.reuseware.air.comogen.cmsl.IExtensionContext#getBaseLanguageName()
*/
public String getBaseLanguageName() {
return baseLanguagePackage.getName();
}
/* (non-Javadoc)
* @see org.reuseware.air.comogen.cmsl.IExtensionContext#getReuseLanguageName()
*/
public String getReuseLanguageName() {
return extensionProgram.getExtension().getName();
}
/* (non-Javadoc)
* @see org.reuseware.air.comogen.cmsl.IExtensionContext#getBaseLanguagePackage()
*/
public EPackage getBaseLanguagePackage() {
return baseLanguagePackage;
}
/* (non-Javadoc)
* @see org.reuseware.air.comogen.cmsl.IExtensionContext#getExtensionLanguagePackage()
*/
public EPackage getExtensionLanguagePackage(){
return extensionLanguagePackage;
}
/* (non-Javadoc)
* @see org.reuseware.air.comogen.cmsl.IExtensionContext#getExtensionProgram()
*/
public ExtensionProgram getExtensionProgram() {
return extensionProgram;
}
/* (non-Javadoc)
* @see org.reuseware.air.comogen.cmsl.IExtensionContext#getExtensionTargetURL()
*/
public URI getExtensionTargetURL() {
return extensionTargetURL;
}
/* (non-Javadoc)
* @see org.reuseware.air.comogen.cmsl.IExtensionContext#getResourceSet()
*/
public ResourceSet getResourceSet(){
return resourceSet;
}
/* (non-Javadoc)
* @see org.reuseware.air.comogen.cmsl.IExtensionContext#setExtensionDone(boolean)
*/
public void setExtensionDone(boolean extensionDone) {
this.extensionDone = extensionDone;
}
/* (non-Javadoc)
* @see org.reuseware.air.comogen.cmsl.IExtensionContext#isExtensionDone()
*/
public boolean isExtensionDone() {
return extensionDone;
}
public URI getExtensionGenModelTargetURL() {
return extensionGenModelTargetURL;
}
}