package JavaHelpers;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class TransExpr {
public boolean parenthes;
public static boolean HasEvent ( String trExp ) {
if ( trExp == null)
return false;
String ret = getEventOfExpression(trExp);
if ( ret == null )
return false;
return ret.compareTo("null")!=0;
}
public static boolean HasCondition ( String trExp ) {
if ( trExp == null)
return false;
return getConditionOfExpression(trExp)!=null;
}
public static boolean HasAction ( String trExp ) {
if ( trExp == null)
return false;
return getActionOfExpression(trExp)!=null;
}
public static String getEventOfExpression(String expression) {
// pattern for events
Pattern eventPattern = Pattern
.compile("^[\\w\\W&&[^/\\[\\]]]+(\\[[\\w\\W&&[^\\[\\]]]+\\])?(/[\\w\\W]+)?$");
Matcher eventMatcher = eventPattern.matcher(expression);
if (eventMatcher.find()
&& (eventMatcher.group().length() == expression.length())) {
StringTokenizer st = new StringTokenizer(expression, "[]/");
return st.nextToken();
}
return null;
}
public static String getConditionOfExpression(String expression) {
// pattern for conditions
Pattern conditionPattern = Pattern
.compile("^([\\w\\W&&[^/\\[\\]]]+)?(\\[[\\w\\W&&[^\\[\\]]]+\\])(/[\\w\\W]+)?$");
Matcher conditionMatcher = conditionPattern.matcher(expression);
if (conditionMatcher.find()
&& (conditionMatcher.group().length() == expression.length())) {
StringTokenizer st = new StringTokenizer(expression, "]");
String condition = st.nextToken();
condition = condition.substring(condition.indexOf("[") + 1);
return condition;
}
return null;
}
public static String getActionOfExpression(String expression) {
// pattern for actions
Pattern actionPattern = Pattern
.compile("^([\\w\\W&&[^/\\[\\]]]+)?(\\[[\\w\\W&&[^\\[\\]]]+\\])?(/[\\w\\W]+)$");
Matcher actionMatcher = actionPattern.matcher(expression);
if (actionMatcher.find()
&& (actionMatcher.group().length() == expression.length())) {
String action = expression
.substring(expression.lastIndexOf("/") + 1);
return action;
}
return null;
}
//Condition............................................................
public static String InitVarCondExpr(String expression){
String condExp = getConditionOfExpression(expression);
// topic type msg_type
Pattern variablePattern = Pattern.compile("\\w+\\.\\w+\\.\\w+.");
Matcher varMatcher = variablePattern.matcher(condExp);
String res = "";
Set<String> topics = new HashSet<String>();
while ( varMatcher.find() ) {
String var = varMatcher.group();
StringTokenizer strtok = new StringTokenizer(var, ".");
String topic = strtok.nextToken();
if ( ! topics.add( topic ) )
continue;
res += "\t\t_blk->updateSubscription(\""+topic+"\",msgentry::SUBSCRIBE_ON_TOPIC);\n";
}
variablePattern = Pattern.compile("TimeoutCheck\\(\\s*?\\w+?\\s*?\\)");
varMatcher = variablePattern.matcher(condExp);
if(varMatcher.find()){
String check = varMatcher.group();
int indx = check.indexOf("(");
String top = check.substring(indx+1, check.length()-1);
if(!topics.contains(top))
res += "\t\t_blk->updateSubscription(\""+top+"\",msgentry::SUBSCRIBE_ON_TOPIC);\n";
}
return res;
}
public static String GetVarName(String name) {
return "var_"+ Math.abs( name.hashCode() );
}
public static String ReadVarCondExpr(String expression ){
String condExp = getConditionOfExpression(expression);
// topic type msg_type
Pattern variablePattern = Pattern.compile("\\w+\\.\\w+\\.\\w+");
Matcher varMatcher = variablePattern.matcher(condExp);
String res = "";
Set<String> variables = new HashSet<String>();
while ( varMatcher.find() ) {
String var = varMatcher.group();
String[] toks = var.split("\\.");
if ( toks.length < 3 )
continue;
if ( ! variables.add( GetVarName(var) ) )
continue;
res += "\t\tboost::shared_ptr<const "+toks[2]+ "> "
+ GetVarName(var)
+ " = _blk->read" + toks[1] + "<" + toks[2] + ">"
+ " (\"" + toks[0] + "\" );\n" ;
}
variablePattern = Pattern.compile("TimeoutCheck\\(\\s*?\\w+?\\s*?\\)");
varMatcher = variablePattern.matcher(condExp);
if(varMatcher.find()){
String check = varMatcher.group();
int indx = check.indexOf("(");
String top = check.substring(indx+1, check.length()-1);
res += "\t\tboost::shared_ptr<const TimeoutMsg > msg = _blk->readState< TimeoutMsg > (\""+top+"\");\n";
}
return res;
}
public static String EvalCondExpr(String expression){
String Comparator = "(([<>]=?)|([!=]=))";
String s = "(\\w+)";
String var = "((\\w+?(\\.\\w+?){2})(\\.\\w+?\\(\\w*?\\))*?)";
String val = "(" + s + "|(\"" + s + "\"))";
String extXpr = var +"(\\s*?)"+ Comparator +"(\\s*?)"+ val ;
String condExp = getConditionOfExpression(expression);
String tempExpr = new String(condExp);
Pattern messagePattern = Pattern.compile("(\\w+\\.\\w+\\.\\w+\\s*?==\\s*?NULL\\s*?\\|\\|)|(\\|\\|\\s*?\\w+\\.\\w+\\.\\w+\\s*?==\\s*?NULL)");
Matcher msgMatcher = messagePattern.matcher(tempExpr);
Pattern variablePattern = Pattern.compile("\\w+\\.\\w+\\.\\w+");
Matcher varMatcher ;
Pattern exprPattern = Pattern.compile(extXpr);
while ( msgMatcher.find() ) {
String msg = msgMatcher.group();
varMatcher = variablePattern.matcher(msg);
if(varMatcher.find()){
if(msg.indexOf("||")>msg.length()/2){
tempExpr = tempExpr.replace(msg, GetVarName(varMatcher.group())+".get()==0 || ");
}else
tempExpr = tempExpr.replace(msg, "|| " +GetVarName(varMatcher.group())+".get()==0 ");
}
}
Matcher expMatcher = exprPattern.matcher(tempExpr);
boolean found=false;
while ( expMatcher.find() ) {
found = true;
String x = expMatcher.group();
String newX=new String(x);
varMatcher = variablePattern.matcher(x);
while(varMatcher.find()){
String varr = varMatcher.group();
newX= newX.replace(varr+".","("+GetVarName(varr)+".get()!=0 && "+GetVarName(varr)+"->" );
//JOptionPane.showMessageDialog(null, newX);
}
newX = newX+")";
tempExpr=tempExpr.replace(x, newX);
}
variablePattern = Pattern.compile("TimeoutCheck\\(\\s*?\\w+?\\s*?\\)");
varMatcher = variablePattern.matcher(tempExpr);
if(varMatcher.find()){
String check = varMatcher.group();
tempExpr = tempExpr.replace(check, "(msg.get()!=0 && msg->wakeup()!=\"\" && boost::posix_time::from_iso_string(msg->wakeup())<boost::posix_time::microsec_clock::local_time())" );
found = true;
}
variablePattern = Pattern.compile("\\w+\\.\\w+\\.\\w+");
varMatcher = variablePattern.matcher(tempExpr);
while(varMatcher.find()){
String varname = varMatcher.group();
tempExpr = tempExpr.replace(varname, GetVarName(varname) );
}
if ( found ){
return "return ( " + tempExpr + " );";
}
return "\t\treturn false;\n";
}
public static String EvalCondExprLogger(String expression, String name){
String Comparator = "(([<>]=?)|([!=]=))";
String s = "(\\w+)";
String var = "((\\w+?(\\.\\w+?){2})(\\.\\w+?\\(\\w*?\\))*?)";
String val = "(" + s + "|(\"" + s + "\"))";
String extXpr = var +"(\\s*?)"+ Comparator +"(\\s*?)"+ val ;
String condExp = getConditionOfExpression(expression);
String tempExpr = new String(condExp);
Pattern messagePattern = Pattern.compile("(\\w+\\.\\w+\\.\\w+\\s*?==\\s*?NULL\\s*?\\|\\|)|(\\|\\|\\s*?\\w+\\.\\w+\\.\\w+\\s*?==\\s*?NULL)");
Matcher msgMatcher = messagePattern.matcher(tempExpr);
Pattern variablePattern = Pattern.compile("\\w+\\.\\w+\\.\\w+");
Matcher varMatcher ;
Pattern exprPattern = Pattern.compile(extXpr);
while ( msgMatcher.find() ) {
String msg = msgMatcher.group();
varMatcher = variablePattern.matcher(msg);
if(varMatcher.find()){
if(msg.indexOf("||")>msg.length()/2){
tempExpr = tempExpr.replace(msg, GetVarName(varMatcher.group())+".get()==0 || ");
}else
tempExpr = tempExpr.replace(msg, "|| " +GetVarName(varMatcher.group())+".get()==0 ");
}
}
Matcher expMatcher = exprPattern.matcher(tempExpr);
boolean found=false;
while ( expMatcher.find() ) {
found = true;
String x = expMatcher.group();
String newX=new String(x);
varMatcher = variablePattern.matcher(x);
while(varMatcher.find()){
String varr = varMatcher.group();
newX= newX.replace(varr+".","("+GetVarName(varr)+".get()!=0 && "+GetVarName(varr)+"->" );
}
newX = newX+")";
tempExpr=tempExpr.replace(x, newX);
}
variablePattern = Pattern.compile("TimeoutCheck\\(\\s*?\\w+?\\s*?\\)");
varMatcher = variablePattern.matcher(tempExpr);
if(varMatcher.find()){
String check = varMatcher.group();
tempExpr = tempExpr.replace(check, "(msg.get()!=0 && msg->wakeup()!=\"\" && boost::posix_time::from_iso_string(msg->wakeup())<boost::posix_time::microsec_clock::local_time())" );
found = true;
}
variablePattern = Pattern.compile("\\w+\\.\\w+\\.\\w+");
varMatcher = variablePattern.matcher(tempExpr);
while(varMatcher.find()){
String varname = varMatcher.group();
tempExpr = tempExpr.replace(varname, GetVarName(varname) );
}
if ( found ){
return "Logger::Instance().WriteMsg(\""+name+", "+ condExp+"\" "+",_toString("+tempExpr+"), Logger::Info);\n"+
"return ( " + tempExpr + " );";
}
return "Logger::Instance().WriteMsg(\""+name+"\", \"false\", Logger::Info);\n"+ "\t\treturn false;\n";
}
//Actions.............................................................
public static String CreateVarActionExpr(String expression){
String actionExp = getActionOfExpression(expression);
String res = "";
Set<String> variables = new HashSet<String>();
StringTokenizer strtok = new StringTokenizer(actionExp, ";");
while ( strtok.hasMoreTokens() ) {
String curToken = strtok.nextToken();
String[] toks = curToken.split("\\.");
//TODO: add support for further dotting...
if ( toks.length < 4 )
continue;
int i = 0;
if ( toks[0].equalsIgnoreCase("publish"))
i = 1;
String topic = toks[i];
String type = toks[i+1];
String msg_type = toks[i+2];
String curVar = topic + "." + type + "." + msg_type;
if ( variables.add( curVar ) )
res += "\t\tboost::shared_ptr<"+msg_type+ "> "
+ GetVarName(curVar) + "(new " + msg_type +" );\n";
}
return res;
}
public static String CreateVarTimeoutActionExpr(String expression){
String actionExp = getActionOfExpression(expression);
String res = "";
StringTokenizer strtok = new StringTokenizer(actionExp, ";");
boolean command = false;
while ( strtok.hasMoreTokens() ) {
String curToken = strtok.nextToken();
if(curToken.startsWith("TimeoutAction")){
String[] toks = curToken.split("\\.");
res += ": statechart_engine::TimeoutAction( \""+ toks[1]+ "\", " + toks[2]+ " ) { \n" ;
}else{
command= true;
res+= AddCommand(curToken);
}
}
if(!command)
res+= "\t\t;\n\t }";
else
res+="\t}";
return res;
}
public static String ExecuteActionExpr(String expression){
String actionExp = getActionOfExpression(expression);
String res = "";
StringTokenizer strtok = new StringTokenizer(actionExp, ";");
while ( strtok.hasMoreTokens() ) {
String curToken = strtok.nextToken();
res+= AddCommand(curToken);
}
return res;
}
public static String AddCommand(String curToken){
String res = "";
if ( curToken.equals( "process_messages"))
res += "\n\t\t_blk->process_messages();\n";
else if ( curToken.equals("publish_all"))
res += "\n\t\t_blk->publish_all();\n";
else if(curToken.contains(".")) {
String[] toks = curToken.split("\\.");
if(toks.length<4)
return res;
int i = 0;
if ( toks[0].equalsIgnoreCase("publish"))
i = 1;
String topic = toks[i];
String type = toks[i+1];
String msg_type = toks[i+2];
String var = GetVarName( topic + "." + type + "." + msg_type );
res+= "\n\t\t"+msg_type +"* "+var + " = new "+ msg_type+"();";
String field = toks[4];
for (int j = 5; j < toks.length; j++)
field += "." + toks[j];
res += "\n\t\t"+ var + "->" + field + ";";
res += "\n\t\t_blk->publish" + type + " ( *" +
var + ", \"" + topic + "\" );";
}
return res;
}
public static boolean addParenthesis(String expr){
Set<String> msgs = new HashSet<String>();
Pattern messagePattern = Pattern.compile("\\w+\\.\\w+\\.\\w+\\s*?==\\s*?NULL");
Matcher msgMatcher = messagePattern.matcher(expr);
Pattern varPattern = Pattern.compile("\\w+\\.\\w+\\.\\w+");
Matcher varMatcher =null;
while ( msgMatcher.find() ) {
String msg = msgMatcher.group();
varMatcher = varPattern.matcher(msg);
if(varMatcher.find()){
String var = varMatcher.group();
msgs.add( GetVarName(var) ) ;
}
}
Pattern variablePattern = Pattern.compile("\\w+\\.\\w+\\.\\w+");
varMatcher = variablePattern.matcher(expr);
while ( varMatcher.find() ) {
String var = varMatcher.group();
if(!msgs.contains(GetVarName(var))){
return true;
}
}
return false;
}
}