package com.sap.mi.tcs.editor.action; import java.io.ByteArrayOutputStream; import java.io.FileWriter; import java.io.IOException; import java.util.HashMap; import java.util.Set; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.jface.action.Action; import org.eclipse.swt.widgets.Event; import org.eclipse.ui.ISharedImages; import org.eclipse.ui.PlatformUI; import com.sap.furcas.metamodel.TCS.ConcreteSyntax; import com.sap.furcas.metamodel.TCS.Keyword; import com.sap.furcas.parsergenerator.GrammarGenerationException; import com.sap.furcas.parsergenerator.TCSSyntaxContainerBean; import com.sap.furcas.parsergenerator.emf.lookup.QueryBasedEcoreMetaModelLookUp; import com.sap.furcas.parsergenerator.tcs.t2m.grammar.ANTLR3GrammarWriter; import com.sap.furcas.parsergenerator.tcs.t2m.grammar.ANTLRGrammarGenerator; import com.sap.furcas.parsergenerator.tcs.t2m.grammar.GenerationReport; import com.sap.furcas.parsergenerator.tcs.t2m.validation.SyntaxDefinitionValidation; import com.sap.furcas.runtime.common.exceptions.MetaModelLookupException; import com.sap.furcas.runtime.parser.TextLocation; import com.sap.furcas.runtime.parser.impl.ObservableInjectingParser; import com.sap.mi.textual.syntaxmodel.emfadapter.EMFTCSAdapter; public class GenerateGrammarAction extends Action { private static final String GENERATIONDIR = "generated"; private ConcreteSyntax syntax; private ResourceSet connection; public GenerateGrammarAction(ConcreteSyntax modelElement, boolean b) { super("Generate Grammar", PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_ETOOL_PRINT_EDIT)); this.setDisabledImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor( ISharedImages.IMG_ETOOL_PRINT_EDIT_DISABLED)); this.setId("generateGrammar"); //super(clazz.getName()); //setImageDescriptor(Activator.getImageDescriptor(clazz)); this.syntax = modelElement; this.connection = syntax.get___Connection(); } @Override @SuppressWarnings("unchecked") public void runWithEvent(Event event) { ANTLR3GrammarWriter writer = new ANTLR3GrammarWriter(); ANTLRGrammarGenerator mapper = new ANTLRGrammarGenerator(); QueryBasedEcoreMetaModelLookUp lookup = new QueryBasedEcoreMetaModelLookUp(connection, null); EMFTCSAdapter handler = new EMFTCSAdapter(syntax.get___Connection(), null); TCSSyntaxContainerBean bean = new TCSSyntaxContainerBean(); bean.setSyntax(syntax); Set<?> keywords = handler.getElementsByType("TCS::Keyword"); bean.setKeywords((Set<Keyword>)keywords); bean.setElementToLocationMap(new HashMap<Object, TextLocation>()); try { GenerationReport report = mapper.generateGrammar(writer, lookup, bean, new SyntaxDefinitionValidation(), ObservableInjectingParser.class); writer.setTargetPackage("generated"); ByteArrayOutputStream out = new ByteArrayOutputStream(); // write OuputStream try { out.write(writer.getOutput().getBytes()); } catch (GrammarGenerationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { out.flush(); out.close(); } String grammarFile = GENERATIONDIR + syntax.getName() + ".g"; FileWriter fileWriter; fileWriter = new FileWriter(grammarFile); fileWriter.write(out.toString()); fileWriter.flush(); fileWriter.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (MetaModelLookupException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }