1 package org.jahia.clipbuilder.html.struts.webBrowser; 2 3 import java.util.*; 4 5 import javax.servlet.http.*; 6 7 import org.apache.struts.action.*; 8 import org.jahia.clipbuilder.html.*; 9 import org.jahia.clipbuilder.html.bean.*; 10 import org.jahia.clipbuilder.html.struts.Util.Constants; 11 import org.jahia.clipbuilder.html.util.*; 12 import org.jahia.clipbuilder.html.web.*; 13 import org.jahia.clipbuilder.html.web.Constant.*; 14 import org.jahia.clipbuilder.html.web.Url.*; 15 import org.jahia.clipbuilder.html.web.html.*; 16 import org.jahia.clipbuilder.html.web.html.Impl.ExtractorFilter.*; 17 import com.vipan.util.ExpiringCache; 18 19 24 public class WebBrowserAction extends org.apache.struts.action.Action { 25 28 private static HashMap cacheHacheMap = new HashMap(); 29 32 private static org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(WebBrowserAction.class); 33 34 35 41 public ClipperBean getClipperBean(HttpServletRequest request) { 42 ClipperBean bean = new ClipperBean(); 43 bean = SessionManager.getClipperBean(request); 44 if (bean == null) { 46 logger.error("[ClipperBean error: Not found]"); 47 } 48 return bean; 49 } 50 51 52 53 63 public ActionForward execute(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) throws Exception { 64 if (!SessionManager.sessionExist(request)) { 66 return actionMapping.findForward("showError"); 67 } 68 69 ActionForward forward = actionMapping.getInputForward(); 71 WebBrowserForm form = (WebBrowserForm) actionForm; 72 ClipperBean cBean = SessionManager.getClipperBean(request); 73 if (cBean == null) { 74 logger.error("[WebBrowser - Execute - ClipperBean not found ]"); 75 forward = actionMapping.findForward("description"); 76 } 77 78 try { 80 logger.debug("[WebBrowser - Execute ]"); 81 82 if (SessionManager.getHTMLDocumentBuilder(request) == null) { 84 logger.debug("[WebBrowser - Execute - Init link hash ]"); 85 form.setLinkHash(Constants.FIRST_URL_HASH); 86 form.setFrom(Constants.FIRST_URL_FROM); 87 logger.debug("add sourceUrl "); 88 initHTMLDocumentBuilder(request, response); 89 } 90 91 synchronizeUrlEncoder(request, response); 93 94 logger.debug("[ WebBrowser ]"); 96 97 String showParam = form.getShow(); 100 logger.debug("Show Param: " + showParam); 101 String html = "Error HTML not Set"; 102 if (showParam != null) { 103 if (showParam.equalsIgnoreCase(Constants.WEB_BROWSER_SHOW_BROWSE)) { 104 logger.debug(" SHOW BROWSE DOCUMENT "); 105 106 HTMLDocument doc = addUrlBeanAndGetHTMLDocument(request, response, form); 108 html = doc.getTransformedDocumentAsString(); 109 110 List framesList = doc.getFramesList(); 112 if (framesList != null && framesList.size() > 0) { 113 form.setFrameUrlList(framesList); 114 forward = actionMapping.findForward("showFrameSelection"); 115 } 116 117 } 118 119 else if (showParam.equalsIgnoreCase(Constants.WEB_BROWSER_SHOW_LAST_DOCUMENT)) { 120 logger.debug(" SHOW LAST DOCUMENT "); 121 122 HTMLDocument doc = getLastRecordedHTMLDocument(request, response, form); 124 125 doc.getTransformer().setBuilder(SessionManager.getHTMLDocumentBuilder(request)); 127 128 html = doc.getTransformedDocumentAsString(); 130 } 131 else if (showParam.equalsIgnoreCase(Constants.WEB_BROWSER_SHOW_EDIPARAMS)) { 132 logger.debug(" SHOW EDIT PARAMS DOCUMENT "); 133 int positionUrl = form.getPositionUrl(); 134 135 HTMLDocument doc = getClipperBean(request).getUrlBean(positionUrl).getDocument(); 137 138 doc.getTransformer().setBuilder(SessionManager.getHTMLDocumentBuilder(request)); 140 141 html = doc.getDocumentWhithParamLabelAsString(); 143 } 144 else if (showParam.equalsIgnoreCase(Constants.WEB_BROWSER_SHOW_CHEW)) { 145 logger.debug(" SHOW CHEW DOCUMENT "); 146 147 HTMLDocument doc = getLastRecordedHTMLDocument(request, response, form); 149 150 doc.getTransformer().setBuilder(SessionManager.getHTMLDocumentBuilder(request)); 152 153 FilterBean filterBean = cBean.getFilterBean(); 155 String tagName = filterBean.getKeyPart(ChewExtractorFilter.CHEW_TAG_NAME); 156 157 html = doc.getChewDocumentAsString(tagName); 159 } 160 else if (showParam.equalsIgnoreCase(Constants.WEB_BROWSER_SHOW_PREVIEW)) { 161 logger.debug(" SHOW PREVIEW"); 162 html = buildSelectedPart(request); 163 } 164 else if (showParam.equalsIgnoreCase(Constants.WEB_BROWSER_SHOW_TEST)) { 165 logger.debug(" TEST PREVIEW"); 166 html = retrieveHTMLPart(request, response, form); 167 } 168 169 else { 170 logger.error("Show Param Value not expected: " + form); 171 } 172 } 173 else { 174 logger.error("Show Param not found"); 175 } 176 177 184 logger.debug("End execution: write html"); 185 logger.debug(html); 186 form.setContent(StringUtilities.repareHTML(html)); 187 188 } 189 catch (Exception ex) { 190 ActionErrors actionErrors = new ActionErrors(); 192 logger.error("Error has occured"); 193 forward = actionMapping.findForward("showError"); 194 ActionError e = new ActionError("errors.message", ex.getMessage()); 195 actionErrors.add("errors.message", e); 196 saveErrors(request, actionErrors); 197 198 } 199 finally { 200 return forward; 201 } 202 } 203 204 205 206 209 210 217 private void setQueryParamBeanForFormParamBean(UrlBean newUrlBean, UrlBean previousUrlBean, ClipperBean bean) { 218 String formParentHash = newUrlBean.getHash(); 220 221 List queryParamList = newUrlBean.getQueryParamBeanList(); 223 for (int i = 0; i < queryParamList.size(); i++) { 224 225 QueryParamBean qBean = (QueryParamBean) queryParamList.get(i); 227 String qName = qBean.getName(); 228 int qPosition = qBean.getPosition(); 229 230 FormParamBean fBean = previousUrlBean.getFormParamByNameAndFormParentHash(qName, qPosition, formParentHash); 232 if (fBean != null) { 233 logger.debug("[ Form param bean for queryBean: " + qName + " and Parent form: " + formParentHash + "found ]"); 234 fBean.setQueryParamBean(qBean); 235 } 236 else { 237 logger.error("Previous Url: " + previousUrlBean.getAbsoluteUrlValue()); 238 logger.error("[ Form param bean for queryBean: " + qName + " and form: " + formParentHash + " not found ]"); 239 } 240 } 241 242 } 243 244 245 254 private HTMLDocument getLastRecordedHTMLDocument(HttpServletRequest request, HttpServletResponse response, WebBrowserForm form) { 255 ClipperBean bean = getClipperBean(request); 257 258 UrlBean uBean = bean.getLastRecordedUrlBean(); 260 if (uBean == null) { 261 logger.debug("[ UrlBean found in recorder bean ]"); 262 uBean = SessionManager.getRecorderBean(request).getCurrentUrlBean(); 263 } 264 else { 265 int position = bean.getPositionLastRecordeUrl(); 266 logger.debug("[Url " + bean.getUrlBean(position).getAbsoluteUrlValue() + " is currently in process]"); 267 logger.debug("[ UrlBean found in clipper bean ]"); 268 269 } 270 271 HTMLDocument htmlDocument = uBean.getDocument(); 273 if (htmlDocument == null) { 274 logger.error("[Error htmlDocument not found]"); 276 } 277 else { 278 logger.debug("[find url in the manager]"); 279 } 280 281 form.setLinkHash(uBean.getHash()); 284 287 return htmlDocument; 288 } 289 290 291 297 private String getNameSpace(HttpServletRequest request) { 298 String nameSpace = RequestParameterManager.getNameSpace(request); 299 return nameSpace; 300 } 301 302 303 309 private void synchronizeUrlEncoder(HttpServletRequest request, HttpServletResponse response) { 310 HTMLDocumentBuilder builder = SessionManager.getHTMLDocumentBuilder(request); 311 if (builder != null) { 312 builder.setUrlEncoder(UrlEncoderFactory.getServletUrlEncoder(request, response)); 313 SessionManager.setHTMLDocumentBuilder(request, builder); 314 } 315 else { 316 logger.error(" HTMLDocument is not in session ---> HTMLDocument is null !!"); 317 } 318 } 319 320 321 330 private String retrieveHTMLPart(HttpServletRequest request, HttpServletResponse response, WebBrowserForm form) throws Exception { 331 332 ClipperBean cBean = SessionManager.getClipperBean(request); 333 String html = "WebClipping error"; 334 String cacheExpiration = cBean.getConfigurationBean().getPortletCacheExpiration(); 336 String nameSpace = getNameSpace(request); 338 if (cacheExpiration != null && !cacheExpiration.equalsIgnoreCase("")) { 339 ExpiringCache cache = (ExpiringCache) cacheHacheMap.get(nameSpace); 340 if (cache == null) { 341 long ttl = Long.parseLong(cacheExpiration); 343 cache = new ExpiringCache(ttl, 30 * 60 * 1000, 1, 2 * 60 * 60 * 1000); 344 cacheHacheMap.put(nameSpace, cache); 345 } 346 347 String key = buildCacheKey(nameSpace, request.getRemoteUser(), cBean.getConfigurationBean().getPortletCacheContext()); 349 Object cachedObject = cache.recover(key); 353 354 if (cachedObject == null) { 356 logger.debug("html not in cache"); 357 logger.debug("Run web clipper"); 358 html = runWebSimulator(request, response, form, cBean); 360 361 if (cache != null) { 362 cache.admit(key, html); 363 } 364 else { 365 logger.debug("html not cached"); 366 } 367 368 } 369 else { 371 logger.debug("html found in cache"); 372 html = (String ) cachedObject; 374 } 375 376 379 } 380 else { 381 html = runWebSimulator(request, response, form, cBean); 383 } 384 return html; 385 } 386 387 388 389 400 private HTMLDocument buildHTMLDocument(HttpServletRequest request, HttpServletResponse response, UrlBean uBean, String httpMethod) throws Exception { 401 402 HTMLDocumentBuilder builder = SessionManager.getHTMLDocumentBuilder(request); 404 builder.setHttpMethod(httpMethod); 405 builder.setUBean(uBean); 406 builder.setUrlEncoder(UrlEncoderFactory.getServletUrlEncoder(request, response)); 407 408 409 HTMLDocument doc = builder.execute(request, response); 411 412 SessionManager.setHTMLDocumentBuilder(request, builder); 414 return doc; 415 } 416 417 418 428 private String runWebSimulator(HttpServletRequest request, HttpServletResponse httpServletResponse, WebBrowserForm form, ClipperBean bean) throws Exception { 429 String html; 430 WebBrowserSimulator wbs = new WebBrowserSimulator(request, httpServletResponse, getClipperBean(request)); 432 433 wbs.execute(WebBrowserSimulator.MODE_LOOP); 434 435 if (wbs.isFinished()) { 437 form.setFrom(Constants.WEB_BROWSER_SHOW_BROWSE); 438 439 html = wbs.getHTMLPart(); 440 RecordingBean rc = new RecordingBean(RecordingBean.STOP); 442 logger.debug("[Set Session Attributes]"); 443 SessionManager.setRecorderBean(request, rc); 444 SessionManager.removeWebBrowserSimulator(request); 445 446 } 447 else { 448 html = wbs.getFinalHtmlResponse(); 449 } 450 451 return html; 452 } 453 454 455 467 private HTMLDocument addUrlBeanAndGetHTMLDocument(HttpServletRequest request, HttpServletResponse response, WebBrowserForm form) throws Exception { 468 ClipperBean bean = SessionManager.getClipperBean(request); 470 RecordingBean rBean = SessionManager.getRecorderBean(request); 471 472 UrlBean uBean = buildUrlBeanWhithDoument(request, response, form); 474 475 HTMLDocument doc = uBean.getDocument(); 477 478 boolean recording = false; 480 if (rBean != null) { 481 recording = rBean.getStatut() == RecordingBean.START; 482 } 483 484 if (recording) { 486 logger.debug("[ Statut = Recording : " + uBean.getAbsoluteUrlValue() + "]"); 487 logger.debug("[add the url " + uBean.getAbsoluteUrlValue() + " to the clipper bean]"); 489 bean.addUrlBean(uBean); 491 492 } 493 else { 494 logger.debug("[ Statut = Not Recording : " + uBean.getAbsoluteUrlValue() + "]"); 496 rBean.setCurrentUrlBean(uBean); 498 } 499 500 503 List errors = doc.getTransformationErrors(); 505 ActionErrors actionErrors = new ActionErrors(); 506 for (int i = 0; i < errors.size(); i++) { 507 String error = errors.get(i).toString(); 508 ActionMessage e = new ActionMessage("errors.message", error); 509 actionErrors.add("errors.message", e); 510 } 511 saveMessages(request, actionErrors); 512 513 return doc; 514 } 515 516 517 526 private UrlBean buildUrlBeanWhithDoument(HttpServletRequest request, HttpServletResponse response, WebBrowserForm form) throws Exception { 527 ClipperBean cBean = getClipperBean(request); 529 UrlBean previousUrlBean = cBean.getLastRecordedUrlBean(); 530 if (previousUrlBean == null) { 531 previousUrlBean = SessionManager.getRecorderBean(request).getCurrentUrlBean(); 532 } 533 534 HTMLDocumentBuilder builder = SessionManager.getHTMLDocumentBuilder(request); 536 if (builder == null) { 537 initHTMLDocumentBuilder(request, response); 538 builder = SessionManager.getHTMLDocumentBuilder(request); 539 } 540 541 String hash = form.getLinkHash(); 543 URLMap map = builder.getUrlMap(); 544 URLWrapper uw = map.getSourceUrl(hash); 545 if (uw == null) { 546 logger.error("Error"); 547 logger.error("Key = " + hash); 548 } 549 String relativeURL = uw.getSourceUrl(); 550 551 String baseUrl = ""; 553 if (!URLUtilities.isRelatif(relativeURL)) { 554 baseUrl = relativeURL; 555 } 556 else { 557 baseUrl = previousUrlBean.getAbsoluteUrlValue(); 559 } 560 561 form.setFrom(uw.getFrom()); 563 String from = form.getFrom(); 564 logger.debug("[ URL is: " + relativeURL + " ]"); 565 logger.debug("WebBrowser action: from: " + from); 566 logger.debug("WebBrowse action: hash: " + hash); 567 568 UrlBean uBean = new UrlBean(cBean, baseUrl, relativeURL, getParam(request), from, hash); 570 571 setQueryParamBeanForFormParamBean(uBean, previousUrlBean, cBean); 573 574 HTMLDocument htmlDocument = buildHTMLDocument(request, response, uBean, uw.getMethod()); 576 577 uBean.setDocument(htmlDocument); 579 return uBean; 580 } 581 582 583 589 private void initHTMLDocumentBuilder(HttpServletRequest request, HttpServletResponse response) { 590 ClipperBean cBean = SessionManager.getClipperBean(request); 591 592 URLWrapper uw = new URLWrapper(); 594 uw.setSourceUrl(cBean.getTargetUrl()); 595 uw.setMethod("GET"); 596 uw.setFrom(Constants.FIRST_URL_HASH); 597 URLMap map = new URLMap(); 598 map.addSourceUrl(uw, Constants.FIRST_URL_HASH); 599 HTMLDocumentBuilder builder = new HTMLDocumentBuilder(map, UrlEncoderFactory.getServletUrlEncoder(request, response)); 600 601 ConfigureBean configBean = getClipperBean(request).getConfigurationBean(); 603 604 String ssl = configBean.getEnableSSL(); 606 if (ssl == null) { 607 org.jahia.clipbuilder.html.web.RegisterSSLProctocol.unregisterSSLProtocol(); 608 } 609 else { 610 org.jahia.clipbuilder.html.web.RegisterSSLProctocol.registerSSLProtocol(); 611 } 612 613 int browserJavascriptEvent = Integer.parseInt(configBean.getBrowserJavascriptEvent()); 615 int browserJavascriptCode = Integer.parseInt(configBean.getBrowserJavascriptCode()); 616 617 int clientType = Integer.parseInt(configBean.getClient()); 619 int parserType = Integer.parseInt(configBean.getHtmlDocument()); 620 621 String javascript = configBean.getEnableJavascript(); 623 boolean javascriptBool = true; 624 if (javascript == null) { 625 javascriptBool = false; 626 } 627 628 String css = configBean.getEnableCSS(); 630 boolean cssBool = true; 631 if (css == null) { 632 cssBool = false; 633 } 634 635 org.org.apache.commons.httpclient.Header[] headers = new org.org.apache.commons.httpclient.Header[1]; 637 headers = null; 638 String encodingValue = response.getCharacterEncoding(); 639 640 logger.debug("[ Encoding is " + encodingValue + " ]"); 641 643 builder.configure(clientType, parserType, browserJavascriptEvent, browserJavascriptCode, javascriptBool, cssBool, headers); 645 646 SessionManager.setHTMLDocumentBuilder(request, builder); 648 } 649 650 651 658 private String buildSelectedPart(HttpServletRequest request) throws WebClippingException { 659 String selectedPart = null; 661 try { 662 ClipperBean bean = getClipperBean(request); 663 if (bean == null) { 664 665 logger.error("[ClipperBean not found]"); 666 } 667 FilterBean filterBean = bean.getFilterBean(); 668 logger.debug("[Filter class: " + filterBean.getClass().toString() + " ]"); 669 670 UrlBean uBean = bean.getLastRecordedUrlBean(); 672 HTMLDocument doc = uBean.getDocument(); 673 if (doc == null) { 674 logger.debug("[ Url is: " + bean.getLastRecordedUrlBean().getAbsoluteURL() + " ]"); 675 logger.error("[ Document is null ]"); 676 } 677 678 doc.getTransformer().setBuilder(SessionManager.getHTMLDocumentBuilder(request)); 680 681 ExtractorFilter filter = ExtractorFilterFactory.getInstance().getFilterImplementation(filterBean.getName()); 683 Map keyMap = filterBean.getKeyMap(); 684 filter.setKeyMap(keyMap); 685 int mode = filterBean.getMode(); 686 filter.setMode(mode); 687 selectedPart = filter.getSelectedPart(doc, ExtractorFilter.ACTION_BUILD_KEY_PART); 688 } 689 catch (Exception ex) { 690 ex.printStackTrace(); 691 selectedPart = " Error has occured"; 692 throw new WebClippingException("Select part", ex); 693 } 694 695 697 return selectedPart; 698 } 699 700 701 707 public static void setNewExpirationCache(String nameSpace, long ttl) { 708 ExpiringCache cache = new ExpiringCache(ttl, 30 * 60 * 1000, 1, 2 * 60 * 60 * 1000); 709 cacheHacheMap.put(nameSpace, cache); 710 } 711 712 713 719 public static Map getParam(HttpServletRequest httpServletRequest) { 720 Map paramsMap = new HashMap(httpServletRequest.getParameterMap()); 721 paramsMap.remove("linkHash"); 723 paramsMap.remove("nameSpace"); 724 paramsMap.remove("show"); 725 return paramsMap; 726 } 727 728 729 736 public static void removeObjectFromCache(String nameSpace, String remoteUser, ClipperBean cBean) { 737 String key = buildCacheKey(nameSpace, remoteUser, cBean.getConfigurationBean().getPortletCacheContext()); 738 ExpiringCache cache = (ExpiringCache) cacheHacheMap.get(nameSpace); 739 if (cache != null) { 740 cache.admit(key, null); 741 } 742 } 743 744 745 746 754 private static String buildCacheKey(String nameSpace, String user, String cacheContext) { 755 String key = nameSpace; 756 int cc = Integer.parseInt(cacheContext); 757 if (cc == org.jahia.clipbuilder.html.util.Constants.PORTLET_CACHE_PORTAL) { 758 return key; 759 } 760 else if (cc == org.jahia.clipbuilder.html.util.Constants.PORTLET_CACHE_USER) { 761 return key + "::" + user; 762 } 763 764 logger.error("cache context value false: user portalcontext value"); 765 return key; 766 } 767 768 } 769 | Popular Tags |