package org.reuseware.air.comogen.util;
import java.io.IOException;
import java.util.Collections;
import org.eclipse.core.resources.IFile;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.reuseware.air.util.FileProcessingException;
import org.reuseware.air.comogen.ExtensionContext;
import org.reuseware.air.comogen.IExtensionContext;
import org.reuseware.air.language.cmsl.ExtensionProgram;
import org.reuseware.air.language.cmsl.GrammarExtension;
import org.reuseware.air.language.cmsl.resource.cmsl.CmslResource;
public class CMSLSpecificationLoader {
private CMSLSpecificationLoader() {}
/**
public void cmslLoadSpecification(IFile file) throws FileProcessingException {
initialize();
grammarExtension = parseCMSLSpecification(file);
if (grammarExtension != null) {
extensionProgram = (ExtensionProgram)grammarExtension.getUnit();
BaseDeclaration baseDeclaration = extensionProgram.getBase();
ExtensionDeclaration extensionDeclaration = extensionProgram.getExtension();
URI baseNs = URI.createURI(baseDeclaration.getNsuri());
URI baseURL = null;
if(baseDeclaration.getSourceurl()!=null){
baseURL = URI.createURI(baseDeclaration.getSourceurl());
if(baseURL.isRelative()){
URI specURL = URI.createPlatformResourceURI(file.getFullPath().removeLastSegments(1).toString()+"/");
baseURL = baseURL.resolve(specURL);
}
}
if(baseURL!=null)
baseLanguagePackage = CMSLSpecificationUtil.loadLanguageModel(baseURL,baseNs);
else
baseLanguagePackage = CMSLSpecificationUtil.loadLanguageModelFromRegistry(baseNs);
baseLanguagePrefixes.put(baseDeclaration.getName(),baseLanguagePackage);
reuseLanguageName = extensionDeclaration.getName();
}
return;
}
**/
public static IExtensionContext initialiseExtensionContext(IFile source) throws FileProcessingException{
GrammarExtension grammarExtension = parseCMSLSpecification(source);
//TODO check for other options
URI specURL = URI.createPlatformResourceURI(source.getFullPath().removeLastSegments(1).toString()+"/");
IExtensionContext context = new ExtensionContext((ExtensionProgram)grammarExtension.getUnit());
return context;
}
public static Resource storeExtendedModel(EPackage extensionPackage, URI targetURL) throws IOException{
Resource.Factory resFactory =
Resource.Factory.Registry.INSTANCE.getFactory(targetURL);
Resource xmiRes = resFactory.createResource(targetURL);
xmiRes.getContents().add(extensionPackage);
xmiRes.save(null);
return xmiRes;
}
public static Resource storeExtendedModel(IExtensionContext context) throws IOException{
return storeExtendedModel(context.getExtensionLanguagePackage(),context.getExtensionTargetURL());
}
/**
* Parse a CMSL program
*
* @param file containing CMSL specification
* @return GrammarExtension object representing the CMSL specification
* @throws FileProcessinException
*/
public static GrammarExtension parseCMSLSpecification(IFile file) throws FileProcessingException {
String path = file.getFullPath().toString();
ResourceSet resourceSet = new ResourceSetImpl();
Resource cmslResource = resourceSet.getResource(URI.createPlatformResourceURI(path,true),true);
try {
if(!(cmslResource instanceof CmslResource))
throw new IOException("");
cmslResource.load(Collections.emptyMap());
return (GrammarExtension)cmslResource.getContents().get(0);
}
catch (IOException e) {
System.err.println("Could not parse file: " + file + ". CoreException.");
}
return null;
}
}