NFA_Generator::NFA_Generator(string file_path)
{
    //ctor
    this->file_path = file_path;
    exp_eval = ExpressionEvaluator(&graph_builder);
}
RoutingCondition::RoutingCondition( const ROUTING_CONDITION conditionType, const string& text )
{
	if ( text.length() > 0 )
		DEBUG( "Condition text : [" << text << "]" );

	//DEBUG_STREAM( "Size : " ) << text.length() << "; first char : " << ( ( int )( text[ 0 ] ) ) << endl;
	m_ConditionType = conditionType;
	m_Text = text;

	switch( m_ConditionType )
	{
		case ALWAYS :
			break;

		case METADATA :
			
			DEBUG( "ConditionType : METADATA" );
			m_Evaluator = ExpressionEvaluator( text );
			
			{ // local vars block
				string cond = StringUtil::ToUpper( m_Evaluator.getFirstOp() );
				if ( cond == "REQUESTOR" )
				{
					m_EvalMetadata = RoutingCondition::REQUESTOR;
				}
				else if ( cond == "RESPONDER" )
				{
					m_EvalMetadata = RoutingCondition::RESPONDER;
				}
				else if ( cond == "ORIGINALREQUESTOR" )
				{
					m_EvalMetadata = RoutingCondition::ORIGINALREQUESTOR;
				}
				else if ( cond == "FEEDBACKCODE" )
				{
					m_EvalMetadata = RoutingCondition::FEEDBACKCODE;
				}
				else if ( cond == "REQUESTTYPE" )
				{
					m_EvalMetadata = RoutingCondition::REQUESTTYPE;
				}
				else if ( cond == "NS" )
				{
					m_EvalMetadata = RoutingCondition::NAMESPACE;
				}
				else
				{
					stringstream errorMessage;
					errorMessage << "Unsupported message condition : [" << cond << "]";
					
					TRACE( errorMessage.str() );
					throw logic_error( errorMessage.str() );
				}
			}
			
			break;
						
		case MESSAGE :
		
			DEBUG( "ConditionType : MESSAGE" );
			// expect MT in '103, 102, ... '
			m_Evaluator = ExpressionEvaluator( text );
			
			{ // local vars block
				// first token is function( param [,param] )
				string cond = StringUtil::ToUpper( m_Evaluator.getFirstOp() );
				if ( cond == "MT" )
				{
					m_EvalMessage = RoutingCondition::MT;
				}
				else if ( cond.substr( 0, 8 ) == "KEYWORD " )
				{
					m_EvalMessage = RoutingCondition::KEYWORD;
				}
				else if ( cond == "FINCOPY" )
				{
					m_EvalMessage = RoutingCondition::FINCOPY;
				}
				else if ( cond.substr( 0, 6 ) == "XPATH " )
				{
					m_EvalMessage = RoutingCondition::XPATH;
				}
				else if ( cond == "ORIGINALMT" )
				{
					m_EvalMessage = RoutingCondition::ORIGINALMT;
				}
				else
				{
					stringstream errorMessage;
					errorMessage << "Unsupported message condition : [" << cond << "]";
					
					TRACE( errorMessage.str() );
					throw logic_error( errorMessage.str() );
				}
			}
			
			break;
			
		case FUNCTION :
	
			DEBUG ( "ConditionType : FUNCTION" );
			// expect function( param [,param] ) = true/false
			m_Evaluator = ExpressionEvaluator( text );
			
			{ // local vars block
				// first token is function( param [,param] )
				StringUtil functionSplitter( m_Evaluator.getFirstOp() );
				functionSplitter.Split( "(" );
				
				string functionName = StringUtil::ToUpper( functionSplitter.NextToken() );
				
				// check function name here
				if ( functionName == "VALIDATETOXSD" )
					m_EvalFunction = RoutingCondition::VALIDATE_TO_XSD;
				else if ( functionName == "VALIDATE" )
					m_EvalFunction = RoutingCondition::VALIDATE;
				else if ( functionName == "ISACK" )
					m_EvalFunction = RoutingCondition::IS_ACK;
				else if ( functionName == "ISNACK" )
					m_EvalFunction = RoutingCondition::IS_NACK;		
				else if ( functionName == "ISREPLY" )
					m_EvalFunction = RoutingCondition::IS_REPLY;		
				else
				{
					stringstream errorMessage;
					errorMessage << "Unsupported function : [" << functionName << "]";
					
					TRACE( errorMessage.str() );
					throw logic_error( errorMessage.str() );
				}
				
				// second token are the params :  param [,param] )
				string strParams = StringUtil::Trim( functionSplitter.NextToken() );
				
				// remove last )
				StringUtil paramSplitter( strParams.substr( 0, strParams.length() - 1 ) );
				paramSplitter.Split( "," );
				while( paramSplitter.MoreTokens() )
				{
					string crtParam = StringUtil::Trim( paramSplitter.NextToken() );
					if ( crtParam.length() > 0 )
						m_EvalFunctionParams.push_back( crtParam );
				};
			}
			
			break;
			
		default :
			throw invalid_argument( "condition type" );
	}
}