/* * Copyright (c) 2004- michael lawley and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation * which accompanies this distribution, and is available by writing to * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Contributors: * michael lawley * * */ package tefkat.model.parser; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintStream; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl; import tefkat.model.MofInstance; import tefkat.model.NamespaceDeclaration; import tefkat.model.Transformation; import tefkat.model.util.TefkatSwitch; import antlr.RecognitionException; import antlr.TokenStreamException; import antlr.TokenStreamHiddenTokenFilter; import antlr.debug.MessageAdapter; import antlr.debug.MessageEvent; /** * @author lawley * */ public class TefkatResourceImpl extends XMIResourceImpl { private List parserListeners; /** * */ public TefkatResourceImpl() { super(); } /** * @param uri */ public TefkatResourceImpl(URI uri, List listeners) { super(uri); parserListeners = listeners; } public void doLoad(InputStream inputStream, Map options) throws IOException { TefkatLexer lexer = new TefkatLexer(inputStream); // use nonstandard token object lexer.setTokenObjectClass("antlr.CommonHiddenStreamToken"); // create the filter TokenStreamHiddenTokenFilter filter = new TokenStreamHiddenTokenFilter(lexer); // hide not discard filter.hide(TefkatParser.COMMENT); filter.hide(TefkatParser.WS); try { TefkatParser parser = new TefkatParser(filter); parser.addMessageListener(new MessageAdapter() { public void reportError(MessageEvent e) { Resource.Diagnostic diag = new DiagnosticImpl((TefkatMessageEvent) e); TefkatResourceImpl.this.getErrors().add(diag); // System.err.println("parser error: " + e); } public void reportWarning(MessageEvent e) { Resource.Diagnostic diag = new DiagnosticImpl((TefkatMessageEvent) e); TefkatResourceImpl.this.getWarnings().add(diag); // System.err.println("parser warning: " + e); } }); if (null != parserListeners) { for (int i = 0; i < parserListeners.size(); i++) { parser.addParserListener((ParserListener) parserListeners.get(i)); } } parser.setResource(this); parser.transformation(); } catch (RecognitionException e) { throw new IOException(e.toString()); } catch (TokenStreamException e) { throw new IOException(e.toString()); } } public void doSave(OutputStream outputStream, Map options) throws IOException { // TODO Auto-generated method stub super.doSave(outputStream, options); // new Visitor().visit(new PrintStream(outputStream), this); } // TODO implement me static class Visitor extends TefkatSwitch { String transformation; Set srcExtents = new HashSet(); Set tgtExtents = new HashSet(); public void visit(PrintStream stream, Resource res) { for (Iterator itr = res.getContents().iterator(); itr.hasNext(); ) { EObject obj = (EObject) itr.next(); if (null == doSwitch(obj)) { // do something System.err.println(obj.eClass().getName()); } } stream.print(transformation); for (Iterator itr = srcExtents.iterator(); itr.hasNext(); ) { stream.print(itr.next()); stream.print(", "); } stream.print(" -> "); for (Iterator itr = srcExtents.iterator(); itr.hasNext(); ) { stream.print(itr.next()); stream.print(", "); } stream.println(); } public Object doSwitch(EObject theEObject) { final Object doSwitch = doSwitch(theEObject.eClass(), theEObject); System.err.println(theEObject.eClass().getName() + " = " + doSwitch); return doSwitch; } protected Object doSwitch(EClass theEClass, EObject theEObject) { System.err.println(modelPackage); System.err.println(theEClass.eContainer()); if (theEClass.eContainer() == modelPackage) { return doSwitch(theEClass.getClassifierID(), theEObject); } else { List eSuperTypes = theEClass.getESuperTypes(); System.err.println("yy " + (eSuperTypes.isEmpty() ? "true" : eSuperTypes.get(0).toString())); return eSuperTypes.isEmpty() ? defaultCase(theEObject) : doSwitch((EClass)eSuperTypes.get(0), theEObject); } } public Object caseTransformation(Transformation object) { System.err.println(object); transformation = "TRANSFORMATION " + object.getName() + " : "; return object; } public Object caseNamespaceDeclaration(NamespaceDeclaration object) { return null; } public Object caseMofInstance(MofInstance object) { if (null != object.getExtent()) { final String name = object.getExtent().getName(); if (object.isTarget()) { tgtExtents.add(name); } else { srcExtents.add(name); } } return null; } public Object defaultCase(EObject object) { System.err.println("default: " + object.eClass().getName()); return null; } } static class DiagnosticImpl extends Exception implements Resource.Diagnostic { /** * */ private static final long serialVersionUID = -3608026548482115750L; private TefkatMessageEvent event; public DiagnosticImpl(TefkatMessageEvent e) { event = e; } /* (non-Javadoc) * @see org.eclipse.emf.ecore.resource.Resource.Diagnostic#getMessage() */ public String getMessage() { return event.getText(); } /* (non-Javadoc) * @see org.eclipse.emf.ecore.resource.Resource.Diagnostic#getLocation() */ public String getLocation() { return event.getLocation(); } /* (non-Javadoc) * @see org.eclipse.emf.ecore.resource.Resource.Diagnostic#getLine() */ public int getLine() { return event.getLine(); } /* (non-Javadoc) * @see org.eclipse.emf.ecore.resource.Resource.Diagnostic#getColumn() */ public int getColumn() { return event.getColumn(); } } }