/*
* Copyright 2008 biaoping.yin
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.frameworkset.util;
import java.util.List;
import org.apache.oro.text.regex.Perl5Compiler;
import com.frameworkset.util.VariableHandler.Index;
import com.frameworkset.util.VariableHandler.SQLStruction;
import com.frameworkset.util.VariableHandler.URLStruction;
import com.frameworkset.util.VariableHandler.Variable;
/**
* <p>Title: TestVaribleHandler.java</p>
* <p>Description: </p>
* <p>bboss workgroup</p>
* <p>Copyright (c) 2008</p>
* @Date 2010-3-10 下午02:31:03
* @author biaoping.yin
* @version 1.0
*/
public class TestVaribleHandler
{
@org.junit.Test
public void testStringReplace()
{
String pretoken = "#\\[";
String endtoken = "\\]";
String url = "#[context]/#[context0]/#[context0]creatorepp";
String[][] vars = VariableHandler.parser2ndSubstitution(url, pretoken, endtoken, "?");
System.out.println(vars[0][0]);
}
@org.junit.Test
public void testVariableParser()
{
String pretoken = "#\\[";
String endtoken = "\\]";
String url = "#[context]/#[context0]/#[context1]creatorepp";
String[] vars = VariableHandler.variableParser(url, pretoken, endtoken);
System.out.println(vars[0]);
System.out.println(vars[1]);
System.out.println(vars[2]);
}
@org.junit.Test
public void testMutiVariableParser()
{
String pretoken = "<clob>";
String endtoken = "</clob>";
String url = "<clob>a\nbc</clob></clob>b<clob>abc</clob>";
String[][] vars = VariableHandler.parser2ndSubstitution(url, pretoken, endtoken,"?",Perl5Compiler.SINGLELINE_MASK | Perl5Compiler.DEFAULT_MASK);
System.out.println(vars[0][0]);
System.out.println(vars[1][0]);
System.out.println(vars[1][1]);
}
@org.junit.Test
public void testMutidefaltVariableParser()
{
String url = "${abc}${abcd}";
String[][] vars = VariableHandler.parser2ndSubstitution(url,"?");
System.out.println(vars[0][0]);
System.out.println(vars[1][0]);
System.out.println(vars[1][1]);
}
@org.junit.Test
public void testUrlParser()
{
String url = "http://localhost:80/detail.html?user=#[account[0][0]]&password=#[password->aaa[0]->bb->cc[0]]love";
URLStruction a = VariableHandler.parserURLStruction(url);
url =
"http://localhost:80/detail.html?user=#[account&password=password]&love=#[account[key]]";
a = VariableHandler.parserURLStruction(url);
url =
"http://localhost:80/detail.html?user=#[account&password=password]&love=#[account";
//
a = VariableHandler.parserURLStruction(url);
url =
"http://localhost:80/detail.html?user=#[account&password=#[password&love=#[account";
a = VariableHandler.parserURLStruction(url);
// url =
// "http://localhost:80/detail.html";
//
// url =
// "http://localhost:80/#[]detail.html";
// url =
// "#[account";
System.out.println("url:"+url);
// Item item = new Item();
// Map<String,String> map = new HashMap<String, String>();
// map.put("account", "aaa");
// map.put("password", "123");
// item.combinationItemUrlStruction(a, map);
if(a != null){
List<String> tokens = a.getTokens();
for (int k = 0; k < tokens.size(); k++) {
System.out.println("tokens[" + k + "]:" + tokens.get(k));
}
List<Variable> variables = a.getVariables();
for (int k = 0; k < variables.size(); k++) {
Variable as = variables.get(k);
System.out.println("变量名称:" + as.getVariableName());
System.out.println("变量对应位置:" + as.getPosition());
}
}
}
@org.junit.Test
public void testSQLParser()
{
String url = "http://localhost:80/detail.html?user=#[account[0][0]]&password=#[password->aaa[0]->bb->cc[0]]love";
URLStruction a = VariableHandler.parserSQLStruction(url);
url =
"http://localhost:80/detail.html?user=#[account]&password=#[password]&love=#[account[key]]";
a = VariableHandler.parserSQLStruction(url);
url =
"http://localhost:80/detail.html?user=#[account]&password=#[password]&love=#[account[0";
a = VariableHandler.parserSQLStruction(url);
url =
"http://localhost:80/detail.html?user=account&password=password&love=account";
a = VariableHandler.parserSQLStruction(url);
url =
"http://localhost:80/detail.html?user=account&password=password]&love=account]";
a = VariableHandler.parserSQLStruction(url);
url =
"http://localhost:80/detail.html,user=#[account],password=#[password],account=#[account]";
a = VariableHandler.parserSQLStruction(url);
url =
"http://localhost:80/#[detail.html,user=#[account],password=#[password],account=#[account]";
a = VariableHandler.parserSQLStruction(url);
// url =
// "http://localhost:80/detail.html";
//
// url =
// "http://localhost:80/#[]detail.html";
// url =
// "#[account";
System.out.println("url:"+url);
// Item item = new Item();
// Map<String,String> map = new HashMap<String, String>();
// map.put("account", "aaa");
// map.put("password", "123");
// item.combinationItemUrlStruction(a, map);
if(a != null){
List<String> tokens = a.getTokens();
for (int k = 0; k < tokens.size(); k++) {
System.out.println("tokens[" + k + "]:" + tokens.get(k));
}
List<Variable> variables = a.getVariables();
for (int k = 0; k < variables.size(); k++) {
Variable as = variables.get(k);
System.out.println("变量名称:" + as.getVariableName());
System.out.println("变量对应位置:" + as.getPosition());
//如果变量是对应的数组或者list、set、map中元素的应用,则解析相应的元素索引下标信息
List<Index> idxs = as.getIndexs();
if(idxs != null)
{
for(int h = 0; h < idxs.size(); h ++)
{
Index idx = idxs.get(h);
if(idx.getInt_idx() > 0)
{
System.out.println("元素索引下标:"+idx.getInt_idx());
}
else
{
System.out.println("map key:"+idx.getString_idx());
}
}
}
}
}
}
/**
* 对比正则表达式解析变量和VariableHandler解析sql变量的性能差异性
* 正则表达式解析变量和VariableHandler解析sql变量的功能区别:
* VariableHandler支持属性引用(层级不限),支持数组、list、map、set元素的引用,容错性比正则表达式方式要好
* 从测试的性能数据上来看,正则表达式和VariableHandler parserSQLStruction方法的性能基本差不多
*/
@org.junit.Test
public void regexUtilvsVarialparserUtil()
{
String listRepositorySql = "select * from CIM_ETL_REPOSITORY where 1=1 " +
"#if($HOST_ID && !$HOST_ID.equals(\"\")) " +
" and HOST_ID = #[HOST_ID->bb[0]]" +
"#end " +
" and PLUGIN_ID = #[PLUGIN_ID] " +
" and CATEGORY_ID = #[CATEGORY_ID] and APP = #[APP] ";
StringBuilder b = new StringBuilder();
b.append(listRepositorySql).append(listRepositorySql)
.append(listRepositorySql)
.append(listRepositorySql)
.append( listRepositorySql)
.append(listRepositorySql)
.append(listRepositorySql)
.append(listRepositorySql)
.append(listRepositorySql)
.append(listRepositorySql)
.append(listRepositorySql)
.append(listRepositorySql)
.append(listRepositorySql)
.append(listRepositorySql)
.append(listRepositorySql)
.append(listRepositorySql)
.append(listRepositorySql)
.append(listRepositorySql)
.append(listRepositorySql)
.append(listRepositorySql)
.append(listRepositorySql)
.append(listRepositorySql)
.append(listRepositorySql)
.append(listRepositorySql)
.append(listRepositorySql)
.append(listRepositorySql)
.append(listRepositorySql)
.append(listRepositorySql)
.append(listRepositorySql);
listRepositorySql = b.toString();
SQLStruction a = VariableHandler.parserSQLStruction(listRepositorySql);
long start = System.currentTimeMillis();
String[][] sqls = VariableHandler.parser2ndSubstitution(listRepositorySql, "#\\[","\\]","?");
long end = System.currentTimeMillis();
System.out.println(sqls[0][0]);
System.out.println("--------------------------");
System.out.println(a.getSql());
System.out.println(sqls[0][0].equals(a.getSql()));
start = System.currentTimeMillis();
sqls = VariableHandler.parser2ndSubstitution(listRepositorySql, "#\\[","\\]","?");
end = System.currentTimeMillis();
System.out.println("正则表达式耗时:" + (end - start));
start = System.currentTimeMillis();
a = VariableHandler.parserSQLStruction(listRepositorySql);
end = System.currentTimeMillis();
System.out.println("变量解析耗时:" + (end - start));
}
/**
* 正则表达式只能解析简单的变量,无法解析复杂的变量格式
* #[HOST_ID]这种格式正则表达式能够解析
* #[HOST_ID->bb[0]]这种带引用的格式,正则表达就不能解析了
* VariableHandler.parserSQLStruction方法可以解析上述两种格式的变量,并且能够将复杂的变量的信息
* 以Variable列表的方式存储,以供持久层框架对这些变量求值
*/
@org.junit.Test
public void varialparserUtil()
{
String listRepositorySql = "select * from CIM_ETL_REPOSITORY where 1=1 " +
"#if($HOST_ID && !$HOST_ID.equals(\"\")) " +
" and HOST_ID = #[host_id->bb[2]->bb[aa]]" +
"#end " +
" and PLUGIN_ID in (#[PLUGIN_ID[0]], #[PLUGIN_ID[1]])" +
" and CATEGORY_ID = #[CATEGORY_ID] and APP = #[APP] ";
String deleteAllsql = "delete from LISTBEAN where FIELDNAME in (#[bean->fss],#[bean->ftestttt],#[bean->fsdds]," +
"#[bean->finsertOpreation],#[bean->fss556])";
SQLStruction b = VariableHandler.parserSQLStruction(deleteAllsql);
SQLStruction a = VariableHandler.parserSQLStruction(listRepositorySql);
Variable hostid = a.getVariables().get(0);
Object value = VariableHandler.evaluateVariableValue(hostid, new Host());
System.out.println(value);
long start = System.currentTimeMillis();
String[][] sqls = VariableHandler.parser2ndSubstitution(listRepositorySql, "#\\[","\\]","?");
long end = System.currentTimeMillis();
System.out.println("正则表达式解析的错误sql:" + sqls[0][0]);
System.out.println("--------------------------");
System.out.println("bboss变量解析器的分析出的正确sql:" + a.getSql());
System.out.println("bboss变量:" + a.getVariables().get(0).toString());
System.out.println(sqls[0][0].equals(a.getSql()));
start = System.currentTimeMillis();
sqls = VariableHandler.parser2ndSubstitution(listRepositorySql, "#\\[","\\]","?");
end = System.currentTimeMillis();
System.out.println("正则表达式耗时:" + (end - start));
start = System.currentTimeMillis();
a = VariableHandler.parserSQLStruction(listRepositorySql);
end = System.currentTimeMillis();
System.out.println("变量解析耗时:" + (end - start));
}
@org.junit.Test
public void testListBeanField()
{
String sql = "select * from TD_ORDER_REPAYMENT_PLAN where order_id in(#[orders[0]->order_id] )";
SQLStruction ss = VariableHandler.parserSQLStruction(sql);
System.out.println();
}
@org.junit.Test
public void testListBeanField1()
{
String sql = "select * from TD_ORDER_REPAYMENT_PLAN where order_id in(#[orders[0]->order_id[0]],#[orders2[0]->order_id[0]] )";
SQLStruction ss = VariableHandler.parserSQLStruction(sql);
System.out.println();
}
}