1 package org.jahia.clipbuilder.html.util; 2 3 import java.util.ArrayList ; 4 import org.jahia.clipbuilder.html.web.Url.*; 5 import org.jahia.clipbuilder.html.web.Constant.*; 6 import javax.servlet.http.*; 7 import java.net.*; 8 import org.jahia.clipbuilder.html.bean.UrlBean; 9 import org.jahia.clipbuilder.html.bean.FormParamBean; 10 import org.jahia.clipbuilder.html.*; 11 import org.jahia.clipbuilder.html.web.Url.URLWrapper; 12 import org.jahia.clipbuilder.html.web.Url.Impl.UrlEncoder; 13 import org.jahia.clipbuilder.html.web.Url.UrlEncoderIF; 14 19 public abstract class JavascriptUtilities { 20 private static org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(JavascriptUtilities.class); 21 private static final String JAVASCRIPT_FUNCTION_NAME = "webraptor_encode"; 22 23 24 33 public static String getRefactoredJavascript(UrlEncoderIF urlEncoder, String urlBase, String webBrowserAction, String originalJavascript) { 34 String workString = new String (originalJavascript); 35 43 String [] matchKeywords = { 44 "location.href", "=", ";", 45 "location", "=", ";", 46 "location.replace", "(", ",)", 47 "open", "(", ",)"}; 48 49 for (int i = 0; i < matchKeywords.length; i += 3) { 50 String lookFor = matchKeywords[i]; 51 String startReplace = matchKeywords[i + 1]; 52 String endReplace = matchKeywords[i + 2]; 53 54 int foundPos = workString.indexOf(lookFor); 55 while ((foundPos != -1) && (foundPos < workString.length())) { 56 int startReplacePos = trimLeftWhiteSpace(workString, foundPos + lookFor.length()); 57 if ((startReplacePos != -1) && (startReplacePos != workString.length())) { 59 if (workString.charAt(startReplacePos) == startReplace.charAt(0)) { 61 int endReplacePos = findDelimiters(workString, endReplace, startReplacePos + 1); 64 if (endReplacePos != -1) { 65 String toReplace = workString.substring(startReplacePos + 1, endReplacePos); 68 StringBuffer newWorkString = new StringBuffer (workString.substring(0, startReplacePos + 1)); 69 String newLocation = getRewritedLocationValue(urlEncoder, urlBase, toReplace, webBrowserAction, foundPos); 72 newWorkString.append("'" + newLocation + "'"); 73 newWorkString.append(workString.substring(endReplacePos)); 76 workString = newWorkString.toString(); 77 } 78 } 79 } 80 foundPos = workString.indexOf(lookFor, foundPos + 1); 82 83 logger.debug("Found pos: " + foundPos); 84 } 85 86 } 87 return workString; 89 } 90 91 92 100 public static String getOnloadJavascript(UrlBean uBean, UrlBean nextBean, String onload) { 101 String contitionClick = ""; 102 if (nextBean != null) { 104 String from = nextBean.getFrom(); 105 String fromHash = nextBean.getHash(); 106 if (from.equalsIgnoreCase(WebConstants.FROM_LINK)) { 108 String selectElement = "document.getElementById('" + fromHash + "')"; 110 String clickOnload = selectElement + ".click();"; 111 contitionClick = "if(" + selectElement + " != null){\n" + clickOnload + "\n}"; 112 } 113 else { 114 FormParamBean fBean = uBean.getSubmittedParamBean(fromHash); 116 if (fBean != null) { 117 String name = fBean.getName(); 118 String formParentName = fBean.getFormParentName(); 119 String formParentId = fBean.getFormParentId(); 120 if (formParentName == null || formParentName.equalsIgnoreCase("")) { 121 String selectElement = "document.getElementById('" + formParentId + "')"; 122 String clickOnload = selectElement + "." + name + ".click();"; 123 contitionClick = "if(" + selectElement + " != null){\n" + clickOnload + "\n}"; 124 } 125 else { 126 String selectElement = "document." + formParentName; 127 String clickOnload = selectElement + "." + name + ".click();"; 128 contitionClick = "if(" + selectElement + " != null){\n" + clickOnload + "\n}"; 129 } 130 } 131 else { 132 logger.warn("submit button not found"); 133 String submittedFormName = HashUtilities.getFormNameFromHash(fromHash); 135 if (submittedFormName != null) { 136 String selectElement = "document." + submittedFormName; 137 String clickOnload = selectElement + ".submit();"; 138 contitionClick = "if(" + selectElement + " != null){\n" + clickOnload + "\n}"; 139 140 } 141 else { 142 String submittedFormId = HashUtilities.getFormIdFromHash(fromHash); 143 String selectElement = "document.getElementById('" + submittedFormId + "')"; 144 String clickOnload = selectElement + ".submit();"; 145 contitionClick = "if(" + selectElement + " != null){\n" + clickOnload + "\n}"; 146 } 147 148 } 149 } 150 151 contitionClick = contitionClick + "\nelse{" + "alert('Browser has stopped due to unknown error!')" + "}"; 152 153 if (onload == null) { 154 onload = contitionClick; 155 } 156 else { 157 onload = onload + ";\n" + contitionClick; 158 } 159 logger.debug("[New Onload: " + onload + " ]"); 160 161 return onload; 162 } 163 164 return onload; 165 } 166 167 168 178 private static String getRewritedLocationValue(UrlEncoderIF urlEncoder, String urlBase, String href, String webBrowserAction, int position) { 179 String hash = HashUtilities.buildJavascriptLocationHash("" + position); 181 String from = WebConstants.FROM_LINK; 182 String mimeType = ""; 183 URLWrapper wrapper = new URLWrapper(href, from, "GET", mimeType, hash); 184 185 188 193 href = urlEncoder.getEncodedUrl(); 194 return href; 195 } 196 197 198 206 private static int findDelimiters(String inputString, String delimiterStr, int initialPos) { 207 ArrayList originalDelimiters = new ArrayList (); 208 originalDelimiters.add("\""); 209 originalDelimiters.add("'"); 210 originalDelimiters.add("("); 211 originalDelimiters.add("\\"); 213 215 for (int i = 0; i < delimiterStr.length(); i++) { 216 originalDelimiters.add(delimiterStr.substring(i, i + 1)); 217 } 218 219 ArrayList inSingleQuoteString = new ArrayList (); 220 inSingleQuoteString.add("\\"); 221 inSingleQuoteString.add("'"); 222 ArrayList inDoubleQuoteString = new ArrayList (); 223 inDoubleQuoteString.add("\\"); 224 inDoubleQuoteString.add("\""); 225 ArrayList delimiters = new ArrayList (originalDelimiters); 226 boolean inString = false; 227 String startStringChar = null; 228 StringBuffer currentString = new StringBuffer (); 229 String curDelimiter = ""; 230 int level = 0; 231 232 if (inputString == null) { 233 return -1; 234 } 235 236 if (inputString.length() == 0) { 237 return -1; 238 } 239 240 String twoChars = null; 241 for (int i = initialPos; i < inputString.length(); i++) { 242 243 if (!inString) { 244 i = trimLeftWhiteSpace(inputString, i); 245 } 246 if (i == -1) { 247 i = inputString.length(); 248 } 249 if (i >= inputString.length()) { 250 break; 251 } 252 253 if (i == (inputString.length() - 1)) { 254 twoChars = inputString.substring(i, i + 1); 255 } 256 else { 257 twoChars = inputString.substring(i, i + 2); 258 } 259 260 curDelimiter = null; 261 for (int j = 0; j < delimiters.size(); j++) { 262 String testDelimiter = (String ) delimiters.get(j); 263 if (twoChars.startsWith(testDelimiter)) { 264 curDelimiter = testDelimiter; 265 i += testDelimiter.length() - 1; 266 break; 267 } 268 } 269 270 if (curDelimiter == null) { 271 if (inString) { 272 currentString.append(twoChars.charAt(0)); 273 } 274 else { 275 } 276 } 277 else { 278 279 if ((!inString) && (level == 0)) { 280 if (delimiterStr.indexOf(curDelimiter) != -1) { 281 return i; 282 } 283 } 284 285 296 if (!inString) { 297 if (curDelimiter.equals("'")) { 300 inString = true; 301 startStringChar = "'"; 302 delimiters = inSingleQuoteString; 303 } 304 else if (curDelimiter.equals("\"")) { 305 inString = true; 306 startStringChar = "\""; 307 delimiters = inDoubleQuoteString; 308 } 309 else if (curDelimiter.equals("(")) { 310 level++; 311 } 312 else if (curDelimiter.equals(")")) { 313 level--; 314 } 315 else { 316 317 } 318 } 319 else { 320 if (curDelimiter.equals("\\")) { 322 currentString.append(twoChars.charAt(1)); 326 i += 1; 327 } 328 else { 329 if (curDelimiter.equals(startStringChar)) { 332 335 336 337 currentString = new StringBuffer (); 339 delimiters = originalDelimiters; 340 inString = false; 341 startStringChar = null; 342 } 343 else { 344 currentString.append(twoChars.charAt(0)); 347 } 348 } 349 } 350 } 351 } 352 353 return -1; 354 } 355 356 357 358 365 private static int trimLeftWhiteSpace(String inputString, int initialPos) { 366 StringBuffer resultBuffer = new StringBuffer (); 367 ArrayList originalDelimiters = new ArrayList (); 369 originalDelimiters.add("/*"); 370 originalDelimiters.add(" "); 371 originalDelimiters.add("\n"); 372 373 ArrayList inMultipleLineComment = new ArrayList (); 374 inMultipleLineComment.add("*/"); 375 ArrayList inSingleLineComment = new ArrayList (); 376 inSingleLineComment.add("\n"); 377 ArrayList delimiters = new ArrayList (originalDelimiters); 378 boolean inComment = false; 379 boolean inLineComment = false; 380 String curDelimiter = ""; 381 int i; 382 383 if (inputString == null) { 384 return -1; 385 } 386 387 if (inputString.length() == 0) { 388 return -1; 389 } 390 391 String twoChars = null; 392 for (i = initialPos; i < inputString.length(); i++) { 393 394 if (i == (inputString.length() - 1)) { 395 twoChars = inputString.substring(i, i + 1); 396 } 397 else { 398 twoChars = inputString.substring(i, i + 2); 399 } 400 401 curDelimiter = null; 402 for (int j = 0; j < delimiters.size(); j++) { 403 String testDelimiter = (String ) delimiters.get(j); 404 if (twoChars.startsWith(testDelimiter)) { 405 curDelimiter = testDelimiter; 406 i += testDelimiter.length() - 1; 407 break; 408 } 409 } 410 411 if (curDelimiter == null) { 412 if (!inComment) { 413 return i; 416 } 417 } 418 else { 419 420 434 if (!inComment) { 435 if (curDelimiter.equals("/*")) { 438 inLineComment = false; 439 inComment = true; 440 delimiters = inMultipleLineComment; 441 } 442 else if (curDelimiter.equals("//")) { 443 inLineComment = true; 444 inComment = true; 445 } 446 else { 447 448 } 449 } 450 else { 451 if (curDelimiter.equals("\n")) { 454 if (inLineComment) { 457 inComment = false; 458 inLineComment = false; 459 delimiters = originalDelimiters; 460 } 461 } 462 else if (curDelimiter.equals("*/")) { 463 inComment = false; 466 delimiters = originalDelimiters; 467 } 468 } 469 470 } 471 472 } 473 474 return i; 475 } 476 477 } 478 | Popular Tags |