1. package javacommon.xsqlbuilder; 
  2.  
  3. import java.sql.Timestamp; 
  4. import java.util.HashMap; 
  5. import java.util.List; 
  6. import java.util.Map; 
  7.  
  8. import javacommon.xsqlbuilder.XsqlBuilder.XsqlFilterResult; 
  9. import javacommon.xsqlbuilder.safesql.EscapeBackslashAndSingleQuotesSafeSqlProcesser; 
  10. import javacommon.xsqlbuilder.safesql.EscapeSingleQuotesSafeSqlProcesser; 
  11. import javacommon.xsqlbuilder.testbean.BlogInfo; 
  12. import junit.framework.TestCase; 
  13.  
  14.  
  15. public class XsqlBuilderTest extends TestCase { 
  16.     XsqlBuilder builder = new XsqlBuilder(); 
  17.      
  18.     public void testApplyFilters() { 
  19.         Map filters = new HashMap(); 
  20.         String sql = "select * from user where 1=1" 
  21.             +"/~ and username = '{username}'~/" 
  22.             +"/~ and pwd = '{password}'~/" 
  23.             +"/~ and age = '{age}'~/"; 
  24.         XsqlFilterResult result = builder.applyFilters(sql, filters); 
  25.          
  26.         assertEquals("select * from user where 11=1",result.getXsql()); 
  27.         assertEquals(0,result.getAcceptedFilters().size()); 
  28.          
  29.         filters.put("username", "badqiu"); 
  30.         filters.put("age", "age"); 
  31.         result = builder.applyFilters(sql, filters); 
  32.         assertEquals("select * from user where 11=1 and username = '{username}' and age = '{age}'",result.getXsql()); 
  33.         assertEquals(2,result.getAcceptedFilters().size()); 
  34.         assertTrue(result.getAcceptedFilters().keySet().contains("username")); 
  35.         assertTrue(result.getAcceptedFilters().keySet().contains("age")); 
  36.     } 
  37.      
  38.     public void testGetKeys() { 
  39.         StringBuffer str = new StringBuffer("{username} {badqiu}"); 
  40.         List keys = builder.getKeyMetaDatas(str,0, str.length()).markKeys; 
  41.         assertTrue(keys.contains("username")); 
  42.         assertTrue(keys.contains("badqiu")); 
  43.          
  44.         keys = builder.getKeyMetaDatas(str,"{username}".length(), str.length()).markKeys; 
  45.         assertTrue(keys.contains("badqiu")); 
  46.         assertFalse(keys.contains("username")); 
  47.          
  48.         keys = builder.getKeyMetaDatas(str,0, "{username}".length()).markKeys; 
  49.         assertTrue(keys.contains("username")); 
  50.         assertFalse(keys.contains("badqiu")); 
  51.     } 
  52.      
  53.     public void testApplyFiltersWithIllegalArgument() { 
  54.         String sql = "select * from user where 1=1" 
  55.             +"/~ and username~/{username}"; 
  56.         Map filters = new HashMap(); 
  57.         try { 
  58.             XsqlFilterResult result = builder.applyFilters(sql, filters); 
  59.             fail(); 
  60.         }catch(IllegalArgumentException expected) { 
  61.             assertTrue(true); 
  62.         } 
  63.     } 
  64.      
  65.     public void testApplyFiltersReplace() { 
  66.         String xsql = "select * from user /~order by [order] [orderDirection]~/"
  67.         Map filters = new HashMap(); 
  68.         XsqlFilterResult result = builder.applyFilters(xsql, filters); 
  69.         assertEquals("select * from user ",result.getXsql()); 
  70.          
  71.         filters.put("order", "username"); 
  72.         result = builder.applyFilters(xsql, filters); 
  73.         assertEquals("select * from user ",result.getXsql()); 
  74.          
  75.         filters.put("orderDirection","DESC"); 
  76.         result = builder.applyFilters(xsql, filters); 
  77.         assertEquals("select * from user order by username DESC",result.getXsql()); 
  78.     } 
  79.      
  80.     public void testApplyFiltersWithMultiKeys() { 
  81.         String xsql = "select * from user /~order by {order} {orderDirection}~/"
  82.         Map filters = new HashMap(); 
  83.         XsqlFilterResult result = builder.applyFilters(xsql, filters); 
  84.         assertEquals("select * from user ",result.getXsql()); 
  85.          
  86.         filters.put("order", "username"); 
  87.         result = builder.applyFilters(xsql, filters); 
  88.         assertEquals("select * from user ",result.getXsql()); 
  89.          
  90.         filters.put("orderDirection","DESC"); 
  91.         result = builder.applyFilters(xsql, filters); 
  92.         assertEquals("select * from user order by {order} {orderDirection}",result.getXsql()); 
  93.     } 
  94.      
  95.     public void testGenerateSql() { 
  96.         Map filters = new HashMap(); 
  97.         String sql = "select * from user where 1=1/~ and username = {username}~//~ and pwd = {password}~//~ and age = {age}~/"
  98.         String result = builder.generateSql(sql, filters).getXsql().toString(); 
  99.         assertEquals("select * from user where 11=1",result); 
  100.          
  101.         filters.put("username", "badqiu"); 
  102.         filters.put("age", "12"); 
  103.         result = builder.generateSql(sql, filters).getXsql().toString(); 
  104.         assertEquals("select * from user where 11=1 and username = ? and age = ?",result); 
  105.     } 
  106.  
  107.     public void testGenerateHql1() { 
  108.         Map filters = new HashMap(); 
  109.         String sql = "select * from user where 1=1/~ and username = {username}~//~ and pwd = {password}~//~ and age = {age}~/"
  110.         String result = builder.generateHql(sql, filters).getXsql().toString(); 
  111.         assertEquals("select * from user where 11=1",result); 
  112.          
  113.         filters.put("username", "badqiu"); 
  114.         filters.put("age", "12"); 
  115.         result = builder.generateHql(sql, filters).getXsql().toString(); 
  116.         assertEquals("select * from user where 11=1 and username = :username and age = :age",result); 
  117.          
  118.         result = builder.generateHql("select * from user /~where password={password}~/ order by username desc", filters).getXsql().toString(); 
  119.         assertEquals("select * from user  order by username desc",result); 
  120.     } 
  121.      
  122.     public void testGenerateHql2() { 
  123.         Map filters = new HashMap(); 
  124.         String sql = "select * from user /~where username={username} and age=[age]~//~ order by {orderBy} [order]~/"
  125.         String result = builder.generateHql(sql, filters).getXsql().toString(); 
  126.         assertEquals("select * from user ",result); 
  127.          
  128.         filters.put("username", "badqiu"); 
  129.         filters.put("age", "12"); 
  130.         result = builder.generateHql(sql, filters).getXsql().toString(); 
  131.         assertEquals("select * from user where username=:username and age=12",result); 
  132.          
  133.         filters.put("orderBy", "username"); 
  134.         result = builder.generateHql(sql, filters).getXsql().toString(); 
  135.         assertEquals("select * from user where username=:username and age=12",result); 
  136.          
  137.         filters.put("order", "ASC"); 
  138.         result = builder.generateHql(sql, filters).getXsql().toString(); 
  139.         assertEquals("select * from user where username=:username and age=12 order by :orderBy ASC",result); 
  140.     } 
  141.      
  142.     public void testPerformence() { 
  143.         String sql = "select * from user where 1=1" 
  144.             +"/~ and username = {username}~/" 
  145.             +"/~ and pwd = '[password]'~/" 
  146.             +"/~ and pwd = '[23423password]'~/" 
  147.             +"/~ and pwd = '[error_password]'~/" 
  148.             +"/~ and age = {age}~/"; 
  149.         long startTime = System.currentTimeMillis(); 
  150.         Map filters = new HashMap(); 
  151.         filters.put("username", "badqiu"); 
  152.         filters.put("password", "123"); 
  153.         filters.put("age", "age"); 
  154.         String result = null
  155.         BlogInfo info = new BlogInfo(); 
  156.         int count = 100000
  157.         for(int i = 0; i < count; i++) { 
  158.             result = builder.generateSql(sql, filters,info).getXsql(); 
  159.         } 
  160.         long endTime = System.currentTimeMillis(); 
  161.         long costTime = endTime-startTime; 
  162.         System.out.println("[PerformenceTest],count:"+100000+" costTime:"+costTime+"ms"); 
  163.          
  164.         assertEquals(result,"select * from user where 11=1 and username = ? and pwd = '123' and age = ?"); 
  165.         assertTrue("[PerformenceTest],count:100000 costTime:2375ms",costTime < 3000); 
  166.     } 
  167.      
  168.     public void testGenerateSql2() { 
  169.         Map filters = new HashMap(); 
  170.         String sql = "select * from user /~where username=[username]~/"
  171.         String result = builder.generateSql(sql, filters).getXsql(); 
  172.         assertEquals("select * from user ",result); 
  173.         filters.put("username", "abc"); 
  174.         result = builder.generateSql(sql, filters).getXsql(); 
  175.         assertEquals("select * from user where username=abc",result); 
  176.     } 
  177.      
  178.     public void testDataModifier() { 
  179.         Map filters = new HashMap(); 
  180.          
  181.         String sql = "select * from user " + 
  182.                 "/~age={age?long}~/" + 
  183.                 "/~birthDate={birthDate?timestamp}~/" + 
  184.                 "/~num=[num?string]~/"; 
  185.         filters.put("age", "20"); 
  186.         filters.put("birthDate", "1990-10-10 10:10:10.111"); 
  187.         filters.put("num", new Long(10)); 
  188.         XsqlFilterResult result = builder.applyFilters(sql, filters); 
  189.         Map acceptedFilters = result.getAcceptedFilters(); 
  190.         assertEquals(new Long(20),acceptedFilters.get("age")); 
  191.         assertTrue(acceptedFilters.get("birthDate") instanceof Timestamp); 
  192.         assertNull(acceptedFilters.get("num")); 
  193.         assertEquals("select * from user age={age}birthDate={birthDate}num=10",result.getXsql()); 
  194.     } 
  195.      
  196.     public void testDataModifierWithEmptyValue() { 
  197.         Map filters = new HashMap(); 
  198.          
  199.         String sql = "select * from user " + 
  200.                 "/~age={age?long}~/"; 
  201.         filters.put("age", ""); 
  202.         XsqlFilterResult result = builder.applyFilters(sql, filters); 
  203.         assertEquals("select * from user ",result.getXsql()); 
  204.     } 
  205.      
  206.     public void testSafeSqlFilter() { 
  207.         Map filters = new HashMap(); 
  208.         String sql = "select * from user " + 
  209.             "/~where name='[name]'~/"; 
  210.          
  211.         XsqlBuilder builder1 = new XsqlBuilder(true); 
  212.         filters.put("name", "bad'qiu"); 
  213.         XsqlFilterResult result1 = builder1.applyFilters(sql, filters); 
  214.         assertEquals("select * from user where name='bad'qiu'",result1.getXsql()); 
  215.          
  216.         XsqlBuilder builder2 = new XsqlBuilder(true,new EscapeSingleQuotesSafeSqlProcesser()); 
  217.         filters.put("name", "bad'qiu"); 
  218.         XsqlFilterResult result2 = builder2.applyFilters(sql, filters); 
  219.         assertEquals("select * from user where name='bad''qiu'",result2.getXsql()); 
  220.          
  221.         XsqlBuilder builder3 = new XsqlBuilder(true,new EscapeBackslashAndSingleQuotesSafeSqlProcesser()); 
  222.         filters.put("name", "bad'\\qiu"); 
  223.         XsqlFilterResult result3 = builder3.applyFilters(sql, filters); 
  224.         assertEquals("select * from user where name='bad''\\\\qiu'",result3.getXsql()); 
  225.     } 
  226.      
  227.     public void testDemo() { 
  228.         // 清晰的sql语句,/~ ~/为一个语法块 
  229.          String sql"select * from user where 1=1 "  
  230.                  + "/~ and username = {username} ~/"    
  231.                  + "/~ and password = {password} ~/";    
  232.           
  233.          // filters为参数 
  234.          Map filters = new HashMap();    
  235.          filters.put("username", "badqiu");  
  236.          filters.put("sex", "F");   
  237.           
  238.          XsqlFilterResult result = new XsqlBuilder().generateHql(sql,filters); 
  239.           
  240.          assertTrue(result.getAcceptedFilters().containsKey("username")); 
  241.          assertFalse(result.getAcceptedFilters().containsKey("sex")); 
  242.          assertEquals("select * from user where 11=1  and username = :username ", result.getXsql()); 
  243.     } 
  244.      
  245.     public void testWithNullArguments() { 
  246.         try { 
  247.             XsqlFilterResult result = new XsqlBuilder().generateHql(null,new HashMap()); 
  248.             fail(); 
  249.         }catch(IllegalArgumentException e) { 
  250.              
  251.         } 
  252.         XsqlFilterResult result = new XsqlBuilder().generateHql("",null); 
  253.         result = new XsqlBuilder().generateHql("",null,null); 
  254.         result = new XsqlBuilder().generateHql("",new HashMap(),null); 
  255.     } 
  256.      
  257.     public void testBean() { 
  258.         // 清晰的sql语句,/~ ~/为一个语法块 
  259.          String sql"select * from user where 1=1 "  
  260.                  + "/~ and title = {title} ~/"    
  261.                  + "/~ and sex = {sex} ~/"    
  262.                  + "/~ and salary = {salary} ~/"    
  263.                  + "/~ and age = [age] ~/";    
  264.           
  265.          // filters为参数 
  266.          BlogInfo info = new BlogInfo(); 
  267.          info.setTitle("java"); 
  268.          XsqlFilterResult result = new XsqlBuilder().generateHql(sql,info); 
  269.           
  270.          assertEquals("select * from user where 11=1  and title = :title  and sex = :sex  and age = 0 ", result.getXsql()); 
  271.          assertTrue(result.getAcceptedFilters().containsKey("sex")); 
  272.          assertTrue(result.getAcceptedFilters().containsKey("title")); 
  273.          assertFalse(result.getAcceptedFilters().containsKey("age")); 
  274.  
  275.     } 
  276.      
  277.     public void testMapAndObjectHolder() { 
  278.         // 清晰的sql语句,/~ ~/为一个语法块 
  279.          String sql"select * from user where 1=1 "  
  280.                  + "/~ and title = {title} ~/"    
  281.                  + "/~ and sex = {sex} ~/"    
  282.                  + "/~ and salary = {salary} ~/"    
  283.                  + "/~ and age = [age] ~/"    
  284.                  + "/~ and mapKey = [mapKey] ~/";    
  285.           
  286.          // filters为参数 
  287.          BlogInfo info = new BlogInfo(); 
  288.          info.setTitle("java"); 
  289.          Map hashMap = new HashMap(); 
  290.          hashMap.put("mapKey", "2009_mapKey"); 
  291.           
  292.          XsqlFilterResult result = new XsqlBuilder().generateHql(sql,hashMap,info); 
  293.           
  294.          assertEquals("select * from user where 11=1  and title = :title  and sex = :sex  and age = 0  and mapKey = 2009_mapKey ", result.getXsql()); 
  295.          assertTrue(result.getAcceptedFilters().containsKey("sex")); 
  296.          assertTrue(result.getAcceptedFilters().containsKey("title")); 
  297.          assertFalse(result.getAcceptedFilters().containsKey("age")); 
  298.  
  299.     } 
  300.      
  301.     public void testMapAndObjectHolder2() { 
  302.         // 清晰的sql语句,/~ ~/为一个语法块 
  303.          String sql"select * from user where 1=1 "  
  304.                  + "/~ and title = {title} ~/"    
  305.                  + "/~ and salary = {2009salary} ~/" ;   
  306.           
  307.          // filters为参数 
  308.          BlogInfo info = new BlogInfo(); 
  309.          info.setTitle("java"); 
  310.          Map hashMap = new HashMap(); 
  311.          hashMap.put("mapKey", "2009_mapKey"); 
  312.           
  313.          XsqlFilterResult result = new XsqlBuilder().generateHql(sql,hashMap,info); 
  314.          assertEquals("select * from user where 11=1  and title = :title ", result.getXsql()); 
  315.          assertTrue(result.getAcceptedFilters().containsKey("title")); 
  316.  
  317.     }