/** * */ package com.sap.furcas.runtime.parser.impl; import static junit.framework.Assert.assertNotNull; import java.util.ArrayList; import java.util.List; import java.util.Stack; import org.antlr.runtime.RecognitionException; import org.antlr.runtime.Token; import com.sap.furcas.runtime.parser.IParsingObserver; /** * checks we leave only contexts we entered before. Test Util. */ public class ConsistencyChecksObserver implements IParsingObserver { public Stack<String> ruleContextStack = new Stack<String>(); public Stack<Integer> sequenceContextStack = new Stack<Integer>(); public List<RecognitionException> errorsInRule = new ArrayList<RecognitionException>(); public List<Object> elementsResolved = new ArrayList<Object>(); public List<Token> tokensConsumed = new ArrayList<Token>(); public List<Token> errorTokensConsumed = new ArrayList<Token>(); public List<Object> outOfContextResolved = new ArrayList<Object>(); public int nextSequenceElementEvents; public int sequenceElementsEnteredNotLeft; public int unresolvedElements; public int separatorSequenceEnteredNotLeft; public int operatoredSequenceEnteredNotLeft; public int operatorSequenceEnteredNotleft; public List<Object> elementsAddedToContext = new ArrayList<Object>(); public List<DelayedReference> referencesCreated = new ArrayList<DelayedReference>(); public int injectorActionsEnteredNotleft; /* * (non-Javadoc) * * @see * com.sap.mi.textual.grammar.impl.IParsingObserver#notifyEnterRule(java * .util.List) */ @Override public void notifyEnterRule(String templateURI) { assertNotNull(templateURI); ruleContextStack.push(templateURI); } /* * (non-Javadoc) * * @see * com.sap.mi.textual.grammar.impl.IParsingObserver#notifyErrorInRule(org * .antlr.runtime.RecognitionException) */ @Override public void notifyErrorInRule(RecognitionException re) { assertNotNull(re); errorsInRule.add(re); } /* * (non-Javadoc) * * @see com.sap.mi.textual.grammar.impl.IParsingObserver# * notifyEnterSequenceAlternative(int) */ @Override public void notifyEnterSequenceAlternative(int choice) { sequenceContextStack.push(choice); } /* * (non-Javadoc) * * @see com.sap.mi.textual.grammar.impl.IParsingObserver#notifyExitRule() */ @Override public void notifyExitRule() { String top = ruleContextStack.pop(); assertNotNull(top); } /* * (non-Javadoc) * * @see com.sap.mi.textual.grammar.impl.IParsingObserver# * notifyExitSequenceAlternative() */ @Override public void notifyExitSequenceAlternative() { sequenceContextStack.pop(); } /* * (non-Javadoc) * * @see * com.sap.mi.textual.grammar.impl.IParsingObserver#notifyModelElementResolved * (java.lang.Object) */ @Override public void notifyCommittedModelElementCreation(Object newModelElement) { elementsResolved.add(newModelElement); } /* * (non-Javadoc) * * @see * com.sap.mi.textual.grammar.impl.IParsingObserver#notifyTokenConsume(org * .antlr.runtime.Token) */ @Override public void notifyTokenConsume(Token token) { if (!tokensConsumed.contains(token)) { tokensConsumed.add(token); } } /* * (non-Javadoc) * * @see * com.sap.mi.textual.grammar.impl.IParsingObserver#notifyTokenConsumeWithError * (org.antlr.runtime.Token) */ @Override public void notifyTokenConsumeWithError(Token token) { if (tokensConsumed.contains(token)) { tokensConsumed.remove(token); } errorTokensConsumed.add(token); } /* * (non-Javadoc) * * @see com.sap.mi.textual.grammar.impl.IParsingObserver# * notifyModelElementResolvedOutOfContext(java.lang.Object, * java.lang.Object, org.antlr.runtime.Token) */ @Override public void notifyModelElementResolvedOutOfContext(Object modelElement, Object contextModelElement, Token referenceLocation, DelayedReference reference) { outOfContextResolved.add(modelElement); } /* * (non-Javadoc) * * @see * com.sap.mi.textual.grammar.impl.IParsingObserver#notifyEnterSequenceElement * () */ @Override public void notifyEnterSequenceElement() { sequenceElementsEnteredNotLeft++; } /* * (non-Javadoc) * * @see * com.sap.mi.textual.grammar.impl.IParsingObserver#notifyEnterSequenceElement * (String) */ @Override public void notifyEnterSequenceElement(String sequenceElementURI) { sequenceElementsEnteredNotLeft++; } /* * (non-Javadoc) * * @see * com.sap.mi.textual.grammar.impl.IParsingObserver#notifyExitSequenceElement * () */ @Override public void notifyExitSequenceElement() { sequenceElementsEnteredNotLeft--; } /* * (non-Javadoc) * * @see com.sap.mi.textual.grammar.impl.IParsingObserver# * notifyModelElementResolutionFailed() */ @Override public void notifyCommitModelElementFailed() { unresolvedElements++; } /* * (non-Javadoc) * * @see * com.sap.mi.textual.grammar.impl.IParsingObserver#notifyEnterSeparatorSequence * () */ @Override public void notifyEnterSeparatorSequence() { separatorSequenceEnteredNotLeft++; } /* * (non-Javadoc) * * @see * com.sap.mi.textual.grammar.impl.IParsingObserver#notifyExitSeparatorSequence * () */ @Override public void notifyExitSeparatorSequence() { separatorSequenceEnteredNotLeft--; } /* * (non-Javadoc) * * @see com.sap.mi.textual.grammar.impl.IParsingObserver# * notifyEnterOperatoredBrackettedSequence() */ @Override public void notifyEnterOperatoredBrackettedSequence() { operatoredSequenceEnteredNotLeft++; } /* * (non-Javadoc) * * @see com.sap.mi.textual.grammar.impl.IParsingObserver# * notifyExitOperatoredBrackettedSequence() */ @Override public void notifyExitOperatoredBrackettedSequence() { operatoredSequenceEnteredNotLeft--; } /* * (non-Javadoc) * * @see * com.sap.mi.textual.grammar.impl.IParsingObserver#notifyEnterOperatorSequence * (java.lang.String, int, boolean) */ @Override public void notifyEnterOperatorSequence(String operator, int arity, boolean isUnaryPostfix) { operatorSequenceEnteredNotleft++; } /* * (non-Javadoc) * * @see * com.sap.mi.textual.grammar.impl.IParsingObserver#notifyExitOperatorSequence * () */ @Override public void notifyExitOperatorSequence() { operatorSequenceEnteredNotleft--; } @Override public void notifyElementAddedToContext(Object element) { elementsAddedToContext.add(element); } @Override public void notifyDelayedReferenceCreated(DelayedReference ref) { referencesCreated.add(ref); } @Override public void notifyEnterInjectorAction() { injectorActionsEnteredNotleft++; } @Override public void notifyExitInjectorAction() { injectorActionsEnteredNotleft--; } @Override public void reset() { ruleContextStack = new Stack<String>(); sequenceContextStack = new Stack<Integer>(); errorsInRule = new ArrayList<RecognitionException>(); elementsResolved = new ArrayList<Object>(); tokensConsumed = new ArrayList<Token>(); errorTokensConsumed = new ArrayList<Token>(); outOfContextResolved = new ArrayList<Object>(); nextSequenceElementEvents = 0; sequenceElementsEnteredNotLeft = 0; unresolvedElements = 0; separatorSequenceEnteredNotLeft = 0; operatoredSequenceEnteredNotLeft = 0; operatorSequenceEnteredNotleft = 0; elementsAddedToContext = new ArrayList<Object>(); referencesCreated = new ArrayList<DelayedReference>(); injectorActionsEnteredNotleft = 0; } }