1 22 23 package org.continuent.sequoia.controller.backend.rewriting; 24 25 import java.util.Hashtable ; 26 import java.util.StringTokenizer ; 27 28 34 public class PatternRewritingRule extends AbstractRewritingRule 35 { 36 private char tokenDelimiter = '?'; 37 private String [] patternArray; 38 private String [] rewriteArray; 39 40 49 public PatternRewritingRule(String queryPattern, String rewrite, 50 boolean caseSensitive, boolean stopOnMatch) 51 { 52 super(queryPattern, rewrite, caseSensitive, stopOnMatch); 53 54 StringTokenizer patternTokenizer = new StringTokenizer (queryPattern, String 56 .valueOf(tokenDelimiter), true); 57 patternArray = new String [patternTokenizer.countTokens()]; 58 int i = 0; 59 try 60 { 61 do 62 { 63 patternArray[i] = patternTokenizer.nextToken(); 64 if (patternArray[i].charAt(0) == tokenDelimiter) 65 { String nextToken = patternTokenizer.nextToken(); 67 patternArray[i] += nextToken.charAt(0); 70 i++; 71 if (nextToken.length() > 1) 72 patternArray[i] = nextToken.substring(1); 74 } 75 i++; 76 } 77 while (patternTokenizer.hasMoreTokens()); 78 } 79 catch (RuntimeException e) 80 { 81 throw new RuntimeException ("Malformed query pattern: " + queryPattern); 82 } 83 StringTokenizer rewriteTokenizer = new StringTokenizer (rewrite, String 84 .valueOf(tokenDelimiter), true); 85 rewriteArray = new String [rewriteTokenizer.countTokens()]; 86 i = 0; 87 try 88 { 89 do 90 { 91 rewriteArray[i] = rewriteTokenizer.nextToken(); 92 if (rewriteArray[i].charAt(0) == tokenDelimiter) 93 { String nextToken = rewriteTokenizer.nextToken(); 95 rewriteArray[i] += nextToken.charAt(0); 98 i++; 99 if (nextToken.length() > 1) 100 rewriteArray[i] = nextToken.substring(1); 102 } 103 i++; 104 } 105 while (rewriteTokenizer.hasMoreTokens()); 106 } 107 catch (RuntimeException e1) 108 { 109 throw new RuntimeException ("Malformed rewrite element: " + rewrite); 110 } 111 } 112 113 116 public String rewrite(String sqlQuery) 117 { 118 Hashtable tokens = null; String lastParameter = null; 120 String currentToken; 121 int oldIndex = 0; 122 int newIndex = 0; 123 124 for (int i = 0; i < patternArray.length; i++) 126 { 127 currentToken = patternArray[i]; 128 if (currentToken == null) 129 break; if (currentToken.charAt(0) == tokenDelimiter) 131 { lastParameter = currentToken; 133 continue; 134 } 135 newIndex = sqlQuery.indexOf(currentToken, oldIndex); 137 if (newIndex == -1) 138 { hasMatched = false; 140 return sqlQuery; 141 } 142 143 if (lastParameter != null) 144 { if (tokens == null) 146 tokens = new Hashtable (); 147 tokens.put(lastParameter, sqlQuery.substring(oldIndex, newIndex)); 148 } 149 oldIndex = newIndex + currentToken.length(); 150 } 151 if (newIndex < sqlQuery.length()) 153 { 154 if (tokens != null) 155 { 156 if (tokens.containsKey(lastParameter)) 157 { hasMatched = false; 159 return sqlQuery; 160 } 161 else 162 tokens.put(lastParameter, sqlQuery.substring(oldIndex)); 163 } 164 } 166 167 hasMatched = true; 168 169 StringBuffer rewrittenQuery = new StringBuffer (); 170 for (int i = 0; i < rewriteArray.length; i++) 171 { 172 currentToken = rewriteArray[i]; 173 if (currentToken == null) 174 break; if (currentToken.charAt(0) != tokenDelimiter) 176 rewrittenQuery.append(currentToken); 177 else 178 rewrittenQuery.append(tokens.get(currentToken)); 179 } 180 return rewrittenQuery.toString(); 181 } 182 } | Popular Tags |