/*******************************************************************************
* Copyright (c) 2008 SAP
* see https://research.qkal.sap.corp/mediawiki/index.php/CoMONET
*
* Date: $Date: 2010-03-04 17:03:31 +0100 (Do, 04 Mrz 2010) $
* @version $Revision: 9523 $
* @author: $Author: c5106462 $
*******************************************************************************/
package com.sap.furcas.parsergenerator.tcs.t2m.grammar.rules;
import com.sap.furcas.parsergenerator.tcs.t2m.grammar.ObservationDirectivesHelper;
import com.sap.furcas.parsergenerator.util.VarStringBuffer;
/**
* defines an ANTLR3 Rule for Class TCS templates.
*/
public class ClassProductionRule extends SimpleProductionRule {
protected static final String EMPTY = "";
private static final String RETURNSTRING = " returns[";
private static final String INITSTRING = " @init{";
private static final String FINALLYSTRING = " finally {";
private static final String CATCHSTRING = "catch [Exception e] {handleExceptionInTemplateRule(e, firstToken, ret);}";
private String initString, returnDeclaration, finalizeString, catchString;
private int additionalLength;
public static ClassProductionRule getClassTemplateProductionRule(String ruleHead, String returnDeclaration,
String initString, String rulebody, boolean addExitNotification, boolean catchString) {
String exitNotification = null;
if (addExitNotification) {
exitNotification = ObservationDirectivesHelper.getExitTemplateNotification();
}
ClassProductionRule rule = new ClassProductionRule(ruleHead, returnDeclaration, initString, rulebody, exitNotification);
if (catchString ) {
rule.catchString = CATCHSTRING;
rule.additionalLength += CATCHSTRING.length();
}
return rule;
}
public ClassProductionRule(String ruleHead,
String returnDeclaration, String initString, String rulebody, String finalizeString) {
super(ruleHead, rulebody);
this.additionalLength = 0;
// nullify emptys
if (initString != null && ! initString.trim().equals(EMPTY)) {
this.initString = initString;
additionalLength += INITSTRING.length() + initString.length() + 1;
} else {
this.initString = null;
}
if (returnDeclaration != null && ! returnDeclaration.trim().equals(EMPTY)) {
this.returnDeclaration = returnDeclaration;
additionalLength += RETURNSTRING.length() + returnDeclaration.length() + 1;
} else {
this.returnDeclaration = null;
}
if (finalizeString != null && ! finalizeString.trim().equals(EMPTY)) {
this.finalizeString = finalizeString;
additionalLength += FINALLYSTRING.length() + finalizeString.length() + 1;
} else {
this.finalizeString = null;
}
if (finalizeString != null && ! finalizeString.trim().equals(EMPTY)) {
this.finalizeString = finalizeString;
additionalLength += FINALLYSTRING.length() + finalizeString.length() + 1;
} else {
this.finalizeString = null;
}
this.returnDeclaration = returnDeclaration;
}
@Override
protected void addRuleHead(VarStringBuffer buf) {
super.addRuleHead(buf);
addReturnAndInit(buf);
}
protected void addReturnAndInit(VarStringBuffer buf) {
if (returnDeclaration != null) {
buf.append(RETURNSTRING);
buf.append(returnDeclaration);
buf.append(']');
}
if (initString != null) {
buf.append(INITSTRING);
buf.append(initString);
buf.append( '}');
}
}
@Override
protected void addFinally(VarStringBuffer buf) {
if (finalizeString != null) {
buf.append(FINALLYSTRING).append(finalizeString).append('}');
}
}
@Override
protected void addCatch(VarStringBuffer buf) {
if (catchString != null) {
buf.append(catchString);
}
}
/* (non-Javadoc)
* @see com.sap.mi.textual.grammar.impl.tcs.t2m.grammar.rules.IAntlr3Rule#getLength()
*/
@Override
public int getLength() {
return super.getLength() + this.additionalLength;
}
}