KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > jahia > clipbuilder > html > util > JavascriptUtilities


1 package org.jahia.clipbuilder.html.util;
2
3 import java.util.ArrayList JavaDoc;
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 /**
15  * Utilities class for Javascript
16  *
17  *@author Tlili Khaled
18  */

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 JavaDoc JAVASCRIPT_FUNCTION_NAME = "webraptor_encode";
22
23
24     /**
25      * Gets the RefactoreddJavascript attribute of the JavascriptUtilities class
26      *
27      *@param urlEncoder Description of Parameter
28      *@param urlBase Description of Parameter
29      *@param webBrowserAction Description of Parameter
30      *@param originalJavascript Description of Parameter
31      *@return The RefactoreddJavascript value
32      */

33     public static String JavaDoc getRefactoredJavascript(UrlEncoderIF urlEncoder, String JavaDoc urlBase, String JavaDoc webBrowserAction, String JavaDoc originalJavascript) {
34         String JavaDoc workString = new String JavaDoc(originalJavascript);
35         // we are looking for patterns such as this :
36
// location = URL ;
37
// location.href = URL ;
38
// location.replace ( URL ) ;
39
// open ( URL ) ;
40
// to replace them with
41
// location = webraptor_encode ( URL ) ;
42

43         String JavaDoc[] matchKeywords = {
44                 "location.href", "=", ";",
45                 "location", "=", ";",
46                 "location.replace", "(", ",)",
47                 "open", "(", ",)"};
48
49         for (int i = 0; i < matchKeywords.length; i += 3) {
50             String JavaDoc lookFor = matchKeywords[i];
51             String JavaDoc startReplace = matchKeywords[i + 1];
52             String JavaDoc 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                 // logger.debug(".modifyJavascript found keyword [" + lookFor + "] at position " + foundPos + " startReplacePos=" + startReplacePos);
58
if ((startReplacePos != -1) && (startReplacePos != workString.length())) {
59                     // now let's check that we have the start char.
60
if (workString.charAt(startReplacePos) == startReplace.charAt(0)) {
61                         // ok we have the start character, let's find the position
62
// of the end of the replace string.
63
int endReplacePos = findDelimiters(workString, endReplace, startReplacePos + 1);
64                         if (endReplacePos != -1) {
65                             // endReplacePos might be at end of String which is
66
// considered ok here.
67
String JavaDoc toReplace = workString.substring(startReplacePos + 1, endReplacePos);
68                             StringBuffer JavaDoc newWorkString = new StringBuffer JavaDoc(workString.substring(0, startReplacePos + 1));
69                             //newWorkString.append(JAVASCRIPT_FUNCTION_NAME);
70
//newWorkString.append("(");
71
String JavaDoc newLocation = getRewritedLocationValue(urlEncoder, urlBase, toReplace, webBrowserAction, foundPos);
72                             newWorkString.append("'" + newLocation + "'");
73                             //newWorkString.append(toReplace);
74
//newWorkString.append(")");
75
newWorkString.append(workString.substring(endReplacePos));
76                             workString = newWorkString.toString();
77                         }
78                     }
79                 }
80                 //foundPos = workString.indexOf(lookFor, foundPos + JAVASCRIPT_FUNCTION_NAME.length() + 2);
81
foundPos = workString.indexOf(lookFor, foundPos + 1);
82
83                 logger.debug("Found pos: " + foundPos);
84             }
85
86         }
87         //return originalJavascript;
88
return workString;
89     }
90
91
92     /**
93      * Gets the OnloadJavascript attribute of the JavascriptUtilities class
94      *
95      *@param uBean Description of Parameter
96      *@param nextBean Description of Parameter
97      *@param onload Description of Parameter
98      *@return The OnloadJavascript value
99      */

100     public static String JavaDoc getOnloadJavascript(UrlBean uBean, UrlBean nextBean, String JavaDoc onload) {
101         String JavaDoc contitionClick = "";
102         // process only if its not the last url
103
if (nextBean != null) {
104             String JavaDoc from = nextBean.getFrom();
105             String JavaDoc fromHash = nextBean.getHash();
106             // case of link
107
if (from.equalsIgnoreCase(WebConstants.FROM_LINK)) {
108                 // id of link = builded hash
109
String JavaDoc selectElement = "document.getElementById('" + fromHash + "')";
110                 String JavaDoc clickOnload = selectElement + ".click();";
111                 contitionClick = "if(" + selectElement + " != null){\n" + clickOnload + "\n}";
112             }
113             else {
114                 //case of form
115
FormParamBean fBean = uBean.getSubmittedParamBean(fromHash);
116                 if (fBean != null) {
117                     String JavaDoc name = fBean.getName();
118                     String JavaDoc formParentName = fBean.getFormParentName();
119                     String JavaDoc formParentId = fBean.getFormParentId();
120                     if (formParentName == null || formParentName.equalsIgnoreCase("")) {
121                         String JavaDoc selectElement = "document.getElementById('" + formParentId + "')";
122                         String JavaDoc clickOnload = selectElement + "." + name + ".click();";
123                         contitionClick = "if(" + selectElement + " != null){\n" + clickOnload + "\n}";
124                     }
125                     else {
126                         String JavaDoc selectElement = "document." + formParentName;
127                         String JavaDoc clickOnload = selectElement + "." + name + ".click();";
128                         contitionClick = "if(" + selectElement + " != null){\n" + clickOnload + "\n}";
129                     }
130                 }
131                 else {
132                     logger.warn("submit button not found");
133                     //getFormNameFormHash(fromHash);
134
String JavaDoc submittedFormName = HashUtilities.getFormNameFromHash(fromHash);
135                     if (submittedFormName != null) {
136                         String JavaDoc selectElement = "document." + submittedFormName;
137                         String JavaDoc clickOnload = selectElement + ".submit();";
138                         contitionClick = "if(" + selectElement + " != null){\n" + clickOnload + "\n}";
139
140                     }
141                     else {
142                         String JavaDoc submittedFormId = HashUtilities.getFormIdFromHash(fromHash);
143                         String JavaDoc selectElement = "document.getElementById('" + submittedFormId + "')";
144                         String JavaDoc 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     /**
169      * Gets the RewritedHrefValue attribute of the JavascriptUtilities object
170      *
171      *@param urlEncoder Description of Parameter
172      *@param urlBase Description of Parameter
173      *@param href Description of Parameter
174      *@param webBrowserAction Description of Parameter
175      *@param position Description of Parameter
176      *@return The RewritedHrefValue value
177      */

178     private static String JavaDoc getRewritedLocationValue(UrlEncoderIF urlEncoder, String JavaDoc urlBase, String JavaDoc href, String JavaDoc webBrowserAction, int position) {
179         //build a wrapper and add it to the urlMap
180
String JavaDoc hash = HashUtilities.buildJavascriptLocationHash("" + position);
181         String JavaDoc from = WebConstants.FROM_LINK;
182         String JavaDoc mimeType = "";
183         URLWrapper wrapper = new URLWrapper(href, from, "GET", mimeType, hash);
184
185         //encode url
186
//href = URLUtilities.getHrefAbsoluteValue(urlBase, href);
187

188         /*
189          * UrlEncoderIF encoder = SessionManager.getUrlEncoder(request);
190          * encoder.setUrlWrapper(wrapper);
191          * encoder.setAction(webBrowserAction);
192          */

193         href = urlEncoder.getEncodedUrl();
194         return href;
195     }
196
197
198     /**
199      * Description of the Method
200      *
201      *@param inputString Description of Parameter
202      *@param delimiterStr Description of Parameter
203      *@param initialPos Description of Parameter
204      *@return Description of the Returned Value
205      */

206     private static int findDelimiters(String JavaDoc inputString, String JavaDoc delimiterStr, int initialPos) {
207         ArrayList JavaDoc originalDelimiters = new ArrayList JavaDoc();
208         originalDelimiters.add("\"");
209         originalDelimiters.add("'");
210         originalDelimiters.add("(");
211         // originalDelimiters.add("\n");
212
originalDelimiters.add("\\");
213         // we add the passed delimiter
214

215         for (int i = 0; i < delimiterStr.length(); i++) {
216             originalDelimiters.add(delimiterStr.substring(i, i + 1));
217         }
218
219         ArrayList JavaDoc inSingleQuoteString = new ArrayList JavaDoc();
220         inSingleQuoteString.add("\\");
221         inSingleQuoteString.add("'");
222         ArrayList JavaDoc inDoubleQuoteString = new ArrayList JavaDoc();
223         inDoubleQuoteString.add("\\");
224         inDoubleQuoteString.add("\"");
225         ArrayList JavaDoc delimiters = new ArrayList JavaDoc(originalDelimiters);
226         boolean inString = false;
227         String JavaDoc startStringChar = null;
228         StringBuffer JavaDoc currentString = new StringBuffer JavaDoc();
229         String JavaDoc 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 JavaDoc 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 JavaDoc testDelimiter = (String JavaDoc) 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                 /*
286                  * if (curDelimiter.equals("\n")) {
287                  * logger.debug (".modifyJavascript curDelimiter=[\n] inString=[" +
288                  * inString +
289                  * "] delimiters=[" + delimiters + "]");
290                  * } else {
291                  * logger.debug (".modifyJavascript curDelimiter=[" + curDelimiter +
292                  * "] inString=[" + inString +
293                  * "] delimiters=[" + delimiters + "]");
294                  * }
295                  */

296                 if (!inString) {
297                     // we have detected the start of a String, let's remember
298
// that and store the String delimiter character.
299
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                     // we are parsing the inside of a String.
321
if (curDelimiter.equals("\\")) {
322                         // last char in before the delimiter is an
323
// escape character, let's unescape and continue
324
// the string parsing.
325
currentString.append(twoChars.charAt(1));
326                         i += 1;
327                     }
328                     else {
329                         // we found a real string delimiter, let's check
330
// for it's validity.
331
if (curDelimiter.equals(startStringChar)) {
332                             // we found the real end of the string !
333
// logger.debug(".findDelimiter completed string parsing. Result=[" + currentString.toString() + "]");
334

335
336
337                             // we now prepare an empty string buffer for the next parsing.
338
currentString = new StringBuffer JavaDoc();
339                             delimiters = originalDelimiters;
340                             inString = false;
341                             startStringChar = null;
342                         }
343                         else {
344                             // we found different end and start chars,
345
// this means we are still in the string
346
currentString.append(twoChars.charAt(0));
347                         }
348                     }
349                 }
350             }
351         }
352
353         return -1;
354     }
355
356
357
358     /**
359      * Description of the Method
360      *
361      *@param inputString Description of Parameter
362      *@param initialPos Description of Parameter
363      *@return Description of the Returned Value
364      */

365     private static int trimLeftWhiteSpace(String JavaDoc inputString, int initialPos) {
366         StringBuffer JavaDoc resultBuffer = new StringBuffer JavaDoc();
367         // whitespace is defined as comments, line feeds, and spaces
368
ArrayList JavaDoc originalDelimiters = new ArrayList JavaDoc();
369         originalDelimiters.add("/*");
370         originalDelimiters.add(" ");
371         originalDelimiters.add("\n");
372
373         ArrayList JavaDoc inMultipleLineComment = new ArrayList JavaDoc();
374         inMultipleLineComment.add("*/");
375         ArrayList JavaDoc inSingleLineComment = new ArrayList JavaDoc();
376         inSingleLineComment.add("\n");
377         ArrayList JavaDoc delimiters = new ArrayList JavaDoc(originalDelimiters);
378         boolean inComment = false;
379         boolean inLineComment = false;
380         String JavaDoc 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 JavaDoc 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 JavaDoc testDelimiter = (String JavaDoc) 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                     // no delimiter outside of comments means we are no
414
// longer in whitespace.
415
return i;
416                 }
417             }
418             else {
419
420                 /*
421                  * if (curDelimiter.equals("\n")) {
422                  * logger.debug (".modifyJavascript curDelimiter=[\n] inString=[" +
423                  * inString + "] inComment=[" + inComment +
424                  * "] inLineComment=[" + inLineComment +
425                  * "] delimiters=[" + delimiters + "]");
426                  * } else {
427                  * logger.debug (".modifyJavascript curDelimiter=[" + curDelimiter +
428                  * "] inString=[" + inString +
429                  * "] inComment=[" + inComment +
430                  * "] inLineComment=[" + inLineComment +
431                  * "] delimiters=[" + delimiters + "]");
432                  * }
433                  */

434                 if (!inComment) {
435                     // we have detected the start of a String, let's remember
436
// that and store the String delimiter character.
437
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                     // we are inside a comment, let's ignore everything
452
// until the end of the line or the end of the comment.
453
if (curDelimiter.equals("\n")) {
454                         // we check the end of line in the case of the single
455
// line comment
456
if (inLineComment) {
457                             inComment = false;
458                             inLineComment = false;
459                             delimiters = originalDelimiters;
460                         }
461                     }
462                     else if (curDelimiter.equals("*/")) {
463                         // we must now check that this delimiter is preceded
464
// by a "*" character to close the comment.
465
inComment = false;
466                         delimiters = originalDelimiters;
467                     }
468                 }
469
470             }
471
472         }
473
474         return i;
475     }
476
477 }
478
Popular Tags