/*******************************************************************************
* Copyright (c) 2008 SAP
* see https://research.qkal.sap.corp/mediawiki/index.php/CoMONET
*
* Date: $Date: 2009-10-06 16:02:30 +0200 (Di, 06 Okt 2009) $
* @version $Revision: 8209 $
* @author: $Author: d043530 $
*******************************************************************************/
package com.sap.furcas.parsergenerator.tcs.t2m;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.Set;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.util.EcoreUtil;
import com.sap.furcas.metamodel.FURCAS.TCS.ConcreteSyntax;
import com.sap.furcas.parsergenerator.TCSSyntaxContainerBean;
import com.sap.furcas.parsergenerator.emf.tcs.inject.TCSSpecificEMFModelInjector;
import com.sap.furcas.runtime.common.exceptions.ModelAdapterException;
import com.sap.furcas.runtime.common.exceptions.ParserInvokationException;
import com.sap.furcas.runtime.common.interfaces.IMetaModelLookup;
import com.sap.furcas.runtime.parser.ModelParsingResult;
import com.sap.furcas.runtime.parser.ParsingError;
import com.sap.furcas.runtime.parser.exceptions.InvalidParserImplementationException;
import com.sap.furcas.runtime.parser.exceptions.SyntaxParsingException;
import com.sap.furcas.runtime.parser.exceptions.UnknownProductionRuleException;
/**
* The Class TCSInputStreamGrammarGenerator, generates a Grammar based on an InputStream containing a TCS definition of a syntax.
*/
public class InputStreamBasedTCSGrammarGenerator extends AbstractTCSGrammarGenerator {
/** The syntax definition stream. */
private final InputStream syntaxDefinitionStream;
/**
* Instantiates a new TCS input stream grammar generator.
*
* @param syntaxDefinitionStream
* the syntax definition stream
* @param outputStream
* @param lookup
* @param targetPackage
* the name of the java package the generated java class will be placed into.
* It is required to prevent compilation errors.
*
*/
public InputStreamBasedTCSGrammarGenerator(InputStream syntaxDefinitionStream, OutputStream outputStream, IMetaModelLookup<?> lookup,
String targetPackage) {
super(outputStream, lookup, targetPackage);
this.syntaxDefinitionStream = syntaxDefinitionStream;
}
private TCSSyntaxContainerBean injectTCSModel(InputStream definitionInputStream, ResourceSet resourceSet, Set<URI> referenceScope)
throws InvalidParserImplementationException, IOException, UnknownProductionRuleException, SyntaxParsingException {
// By choosing this injector, we establish the dependency to EMF.
ModelParsingResult result = TCSSpecificEMFModelInjector.parseSyntaxDefinition(definitionInputStream, resourceSet,
referenceScope, /* observer */null);
List<ParsingError> errors = result.getErrors();
if (errors != null && errors.size() > 0) {
if (result.getParsedModelElement() != null) {
// also clean up unfinished syntax
EcoreUtil.delete((EObject) result.getParsedModelElement(), /* recursive */true);
}
throw new SyntaxParsingException(errors);
}
ConcreteSyntax syntax = (ConcreteSyntax) result.getParsedModelElement();
TCSSyntaxContainerBean returnBean = new TCSSyntaxContainerBean();
returnBean.setSyntax(syntax);
returnBean.setElementToLocationMap(result.getLocationMap());
return returnBean;
}
@Override
protected TCSSyntaxContainerBean doGetSyntaxDef(ResourceSet resourceSet, Set<URI> referenceScope) throws IOException,
SyntaxParsingException, ModelAdapterException, ParserInvokationException {
try {
return injectTCSModel(syntaxDefinitionStream, resourceSet, referenceScope);
} catch (IllegalArgumentException e) {
throw new ParserInvokationException(e);
} catch (SecurityException e) {
throw new ParserInvokationException(e);
} catch (UnknownProductionRuleException e) {
throw new ParserInvokationException(e);
} catch (InvalidParserImplementationException e) {
throw new ParserInvokationException(e);
}
}
@Override
protected TCSSyntaxContainerBean doGetSyntaxDef(ResourceSet connection, Set<URI> metamodelPRIs, String languageId)
throws SyntaxParsingException, IOException, ModelAdapterException, ParserInvokationException {
return doGetSyntaxDef(connection, metamodelPRIs);
}
}