Changeset 33632
- Timestamp:
- 2019-11-07T14:53:54+13:00 (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
main/trunk/greenstone3/src/java/org/greenstone/gsdl3/core/TransformingReceptionist.java
r33079 r33632 49 49 public class TransformingReceptionist extends Receptionist 50 50 { 51 protected static finalint CONFIG_PASS = 1;52 protected static finalint TEXT_PASS = 2;51 protected static final String CONFIG_FORMAT_FILE = "config_format.xsl"; //int CONFIG_PASS = 1; 52 protected static final String TEXT_FORMAT_FILE = "text_fragment_format.xsl"; //int TEXT_PASS = 2; 53 53 54 54 static Logger logger = Logger.getLogger(org.greenstone.gsdl3.core.TransformingReceptionist.class.getName()); … … 57 57 static final String preprocess_xsl_filename = GlobalProperties.getGSDL3Home() + File.separatorChar + "interfaces" + File.separatorChar + "core" + File.separatorChar + "transform" + File.separatorChar + "preProcess.xsl"; 58 58 59 static final String gslib_filename = "gslib.xsl"; 60 59 61 /** the list of xslt to use for actions */ 60 62 protected HashMap<String, String> xslt_map = null; … … 610 612 611 613 /** 612 * transform the page using xslt we need to get any format element out of613 * the page and add it to the xslt before transforming614 * transform the page using xslt. 615 * we need to get any format element out of the page and add it to the xslt before transforming 614 616 */ 615 protected Node transformPage(Element page ,String currentInterface,String output)617 protected Node transformPage(Element page_xml, String currentInterface, String output) 616 618 { 617 619 _debug = false; 618 620 619 Element request = (Element) GSXML.getChildByTagName(page , GSXML.PAGE_REQUEST_ELEM);621 Element request = (Element) GSXML.getChildByTagName(page_xml, GSXML.PAGE_REQUEST_ELEM); 620 622 621 623 //logger.info("Current output mode is: " + output + ", current interface name is: " + currentInterface); 622 624 623 // DocType defaults in case the skin doesn't have an "xsl:output" element624 String qualifiedName = "html";625 String publicID = "-//W3C//DTD HTML 4.01 Transitional//EN";626 String systemID = "http://www.w3.org/TR/html4/loose.dtd";627 628 // We need to create an empty document with a predefined DocType,629 // that will then be used for the transformation by the DOMResult630 Document docWithDoctype = converter.newDOM(qualifiedName, publicID, systemID);631 632 625 if (output.equals("xsltclient")) 633 626 { 634 String baseURL = request.getAttribute(GSXML.BASE_URL); 635 636 // If you're just getting the client-side transform page, why bother with the rest of this? 637 Element html = docWithDoctype.createElement("html"); 638 Element img = docWithDoctype.createElement("img"); 639 img.setAttribute("src", "loading.gif"); // Make it dynamic 640 img.setAttribute("alt", "Please wait..."); 641 Text title_text = docWithDoctype.createTextNode("Please wait..."); // Make this language dependent 642 Element head = docWithDoctype.createElement("head"); 643 644 // e.g., <base href="http://localhost:8383/greenstone3/" /><!-- [if lte IE 6]></base><![endif] --> 645 Element base = docWithDoctype.createElement("base"); 646 base.setAttribute("href",baseURL); 647 Comment opt_end_base = docWithDoctype.createComment("[if lte IE 6]></base><![endif]"); 648 649 Element title = docWithDoctype.createElement("title"); 650 title.appendChild(title_text); 651 652 Element body = docWithDoctype.createElement("body"); 653 654 Element jquery_script = docWithDoctype.createElement("script"); 655 jquery_script.setAttribute("src", "jquery-1.10-min.js"); 656 jquery_script.setAttribute("type", "text/javascript"); 657 Comment jquery_comment = docWithDoctype.createComment("jQuery"); 658 jquery_script.appendChild(jquery_comment); 659 660 Element saxonce_script = docWithDoctype.createElement("script"); 661 saxonce_script.setAttribute("src", "Saxonce/Saxonce.nocache.js"); 662 saxonce_script.setAttribute("type", "text/javascript"); 663 Comment saxonce_comment = docWithDoctype.createComment("SaxonCE"); 664 saxonce_script.appendChild(saxonce_comment); 665 666 Element xsltutil_script = docWithDoctype.createElement("script"); 667 xsltutil_script.setAttribute("src", "xslt-util.js"); 668 xsltutil_script.setAttribute("type", "text/javascript"); 669 Comment xsltutil_comment = docWithDoctype.createComment("JavaScript version of XSLTUtil.java"); 670 xsltutil_script.appendChild(xsltutil_comment); 671 672 Element script = docWithDoctype.createElement("script"); 673 Comment script_comment = docWithDoctype.createComment("Filler for browser"); 674 script.setAttribute("src", "client-side-xslt.js"); 675 script.setAttribute("type", "text/javascript"); 676 script.appendChild(script_comment); 677 678 Element pagevar = docWithDoctype.createElement("script"); 679 Element style = docWithDoctype.createElement("style"); 680 style.setAttribute("type", "text/css"); 681 Text style_text = docWithDoctype.createTextNode("body { text-align: center; padding: 50px; font: 14pt Arial, sans-serif; font-weight: bold; }"); 682 pagevar.setAttribute("type", "text/javascript"); 683 Text page_var_text = docWithDoctype.createTextNode("var placeholder = true;"); 684 685 html.appendChild(head); 686 head.appendChild(base); head.appendChild(opt_end_base); 687 head.appendChild(title); 688 head.appendChild(style); 689 style.appendChild(style_text); 690 html.appendChild(body); 691 head.appendChild(pagevar); 692 head.appendChild(jquery_script); 693 head.appendChild(saxonce_script); 694 head.appendChild(xsltutil_script); 695 head.appendChild(script); 696 pagevar.appendChild(page_var_text); 697 698 body.appendChild(img); 699 docWithDoctype.appendChild(html); 700 701 return (Node) docWithDoctype; 702 } 703 704 // Passing in the pretty string here means it needs to be generated even when not debugging; so use custom function to return blank when debug is off 705 //logger.debug("page before transforming:"); 706 //logger.debug(this.converter.getPrettyStringLogger(page, logger)); 707 627 return generateXSLTClientOutput(request); 628 } 629 708 630 String action = request.getAttribute(GSXML.ACTION_ATT); 709 631 String subaction = request.getAttribute(GSXML.SUBACTION_ATT); … … 713 635 // for now, if output=xml, we don't transform the page, we just return 714 636 // the page xml 715 Document theXML= null;637 Document page_with_xslt_params_doc = null; 716 638 717 639 if (output.equals("xml") || (output.equals("json")) || output.equals("clientside")) 718 640 { 719 // Append some bits and pieces first...720 theXML= converter.newDOM();641 // Append the xsltparams to the page 642 page_with_xslt_params_doc = converter.newDOM(); 721 643 // Import into new document first! 722 Node newPage = theXML.importNode(page, true); 723 theXML.appendChild(newPage); 724 Element root = theXML.createElement("xsltparams"); 725 newPage.appendChild(root); 726 727 Element libname = theXML.createElement("param"); 728 libname.setAttribute("name", "library_name"); 729 Text libnametext = theXML.createTextNode((String) config_params.get(GSConstants.LIBRARY_NAME)); 730 libname.appendChild(libnametext); 731 732 Element intname = theXML.createElement("param"); 733 intname.setAttribute("name", "interface_name"); 734 Text intnametext = theXML.createTextNode((String) config_params.get(GSConstants.INTERFACE_NAME)); 735 intname.appendChild(intnametext); 736 737 Element siteName = theXML.createElement("param"); 738 siteName.setAttribute("name", "site_name"); 739 Text siteNameText = theXML.createTextNode((String) config_params.get(GSConstants.SITE_NAME)); 740 siteName.appendChild(siteNameText); 741 742 Element clientSideXSLTName = theXML.createElement("param"); 743 clientSideXSLTName.setAttribute("name", "use_client_side_xslt"); 644 Node page_with_xslt_params = page_with_xslt_params_doc.importNode(page_xml, true); 645 page_with_xslt_params_doc.appendChild(page_with_xslt_params); 646 Element xslt_params = page_with_xslt_params_doc.createElement("xsltparams"); 647 page_with_xslt_params.appendChild(xslt_params); 648 649 GSXML.addParameter2ToList(xslt_params, "library_name", (String) config_params.get(GSConstants.LIBRARY_NAME)); 650 GSXML.addParameter2ToList(xslt_params, "interface_name", (String) config_params.get(GSConstants.INTERFACE_NAME)); 651 GSXML.addParameter2ToList(xslt_params, "site_name", (String) config_params.get(GSConstants.SITE_NAME)); 744 652 Boolean useClientXSLT = (Boolean) config_params.get(GSConstants.USE_CLIENT_SIDE_XSLT); 745 Text clientSideXSLTNameText = theXML.createTextNode(useClientXSLT.toString());746 clientSideXSLTName.appendChild(clientSideXSLTNameText);653 GSXML.addParameter2ToList(xslt_params, "use_client_side_xslt", useClientXSLT.toString()); 654 GSXML.addParameter2ToList(xslt_params, "filepath", GlobalProperties.getGSDL3Home()); 747 655 748 Element filepath = theXML.createElement("param");749 filepath.setAttribute("name", "filepath");750 Text filepathtext = theXML.createTextNode(GlobalProperties.getGSDL3Home());751 filepath.appendChild(filepathtext);752 753 root.appendChild(libname);754 root.appendChild(intname);755 root.appendChild(siteName);756 root.appendChild(clientSideXSLTName);757 root.appendChild(filepath);758 759 656 if ((output.equals("xml")) || output.equals("json")) 760 657 { 761 // in the case of "json", calling method responsible for converting to JSON-string 762 return theXML.getDocumentElement(); 763 } 658 // Just return the page XML 659 // in the case of "json", calling method responsible for converting to JSON-string 660 return page_with_xslt_params_doc.getDocumentElement(); 661 } 662 // in the case of client side, later on we'll use this doc with xslt params added, 663 // along with the xsl. 764 664 } 765 665 766 666 Element cgi_param_list = (Element) GSXML.getChildByTagName(request, GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER); 767 667 String collection = ""; 768 String inline Template = "";668 String inline_template = ""; 769 669 if (cgi_param_list != null) 770 670 { … … 777 677 } 778 678 779 inline Template = (String) params.get(GSParams.INLINE_TEMPLATE);679 inline_template = (String) params.get(GSParams.INLINE_TEMPLATE); 780 680 String debug_p = (String) params.get(GSParams.DEBUG); 781 681 if (debug_p != null && (debug_p.equals("on") || debug_p.equals("1") || debug_p.equals("true"))) … … 812 712 config_params.put("collName", collection); 813 713 814 Document style_doc = getXSLTDocument(action, subaction, collection); 815 if (style_doc == null) 816 { 817 // this getParseErrorMessage may have originally worked, but now it doesn't. 818 // //String errorPage = this.converter.getParseErrorMessage(); 819 // if (errorPage != null) 820 // { 821 // return XMLTransformer.constructErrorXHTMLPage("Cannot parse the xslt file\n");// + errorPage); 822 // } 823 return page; 824 } 825 714 // find the appropriate stylesheet (based on action/subaction) - eg a=p&sa=home will be home.xsl 715 // This mapping is defined in interfaceConfig.xsl 716 // All versions of the stylesheet (base interface, interface, site, collection) are 717 // merged together into one document 718 Document page_xsl = getXSLTDocument(action, subaction, collection); 719 String page_xsl_filename = getXSLTFilename(action, subaction); // for debug purposes 720 if (page_xsl == null) 721 { 722 logger.error("Couldn't find and/or load the stylesheet ("+page_xsl_filename+") for a="+action+", sa="+subaction+", in collection "+collection); 723 return XMLTransformer.constructErrorXHTMLPage("Couldn't find and/or load the stylesheet \""+page_xsl_filename+"\" for a="+action+", sa="+subaction+", in collection "+collection); 724 } 725 726 if (output.equals("xsl1")) { 727 // if we just output the page_xsl directly then there may be unescaped & in the javascript, 728 // and the page won't display properly 729 return converter.getDOM(getStringFromDocument(page_xsl)); 730 } 731 732 826 733 // put the page into a document - this is necessary for xslt to get 827 734 // the paths right if you have paths relative to the document root 828 735 // eg /page. 829 Document doc = XMLConverter.newDOM();830 doc.appendChild(doc.importNode(page, true));831 Element page_response = (Element) GSXML.getChildByTagName(page , GSXML.PAGE_RESPONSE_ELEM);736 Document page_xml_doc = XMLConverter.newDOM(); 737 page_xml_doc.appendChild(page_xml_doc.importNode(page_xml, true)); 738 Element page_response = (Element) GSXML.getChildByTagName(page_xml, GSXML.PAGE_RESPONSE_ELEM); 832 739 Element format_elem = (Element) GSXML.getChildByTagName(page_response, GSXML.FORMAT_ELEM); 833 740 834 NodeList pageElems = doc.getElementsByTagName("page"); 835 if (pageElems.getLength() > 0) 836 { 837 Element pageElem = (Element) pageElems.item(0); 838 String langAtt = pageElem.getAttribute(GSXML.LANG_ATT); 839 840 if (langAtt != null && langAtt.length() > 0) 841 { 842 config_params.put("lang", langAtt); 843 } 844 } 845 846 if (output.equals("formatelem")) 741 if (output.equals("format")) 847 742 { 848 743 return format_elem; 849 744 } 745 746 // do we have language attribute for page? 747 String lang_att = page_xml.getAttribute(GSXML.LANG_ATT); 748 if (lang_att != null && lang_att.length() > 0) 749 { 750 config_params.put("lang", lang_att); 751 } 752 850 753 if (format_elem != null) 851 754 { 852 //page_response.removeChild(format_elem); 853 logger.debug("format elem=" + this.converter.getPrettyStringLogger(format_elem, logger)); 854 // need to transform the format info 855 String configStylesheet_file = GSFile.stylesheetFile(GlobalProperties.getGSDL3Home(), (String) this.config_params.get(GSConstants.SITE_NAME), collection, (String) this.config_params.get(GSConstants.INTERFACE_NAME), base_interfaces, "config_format.xsl"); 755 //page_response.removeChild(format_elem); 756 757 // need to transform the format info 758 // run config_format.xsl over the format_elem. We need to do this now to turn 759 // eg gsf:template into xsl:template so that the merging works properly. 760 // xsl:templates will get merged 761 // into the main stylesheet, but gsf:templates won't. 762 763 String configStylesheet_file = GSFile.stylesheetFile(GlobalProperties.getGSDL3Home(), (String) this.config_params.get(GSConstants.SITE_NAME), collection, (String) this.config_params.get(GSConstants.INTERFACE_NAME), base_interfaces, CONFIG_FORMAT_FILE); 856 764 Document configStylesheet_doc = this.converter.getDOM(new File(configStylesheet_file)); 857 765 … … 881 789 new_format = (Element) result; 882 790 } 883 logger.debug("new format elem=" + this.converter.getPrettyStringLogger(new_format, logger));791 884 792 if (output.equals("newformat")) 885 793 { … … 887 795 } 888 796 889 // add extracted GSFstatements in to the main stylesheet797 // add the extracted format statements in to the main stylesheet 890 798 if (_debug) 891 799 { 892 800 String siteHome = GSFile.siteHome(GlobalProperties.getGSDL3Home(), (String) this.config_params.get(GSConstants.SITE_NAME)); 893 GSXSLT.mergeStylesheetsDebug( style_doc, new_format, true, true, "OTHER1", GSFile.collectionConfigFile(siteHome, collection));801 GSXSLT.mergeStylesheetsDebug(page_xsl, new_format, true, true, "OTHER1", GSFile.collectionConfigFile(siteHome, collection)); 894 802 } 895 803 else 896 804 { 897 GSXSLT.mergeStylesheets(style_doc, new_format, true); 898 } 899 //System.out.println("added extracted GSF statements into the main stylesheet") ; 900 901 // add extracted GSF statements in to the debug test stylesheet 902 //GSXSLT.mergeStylesheets(oldStyle_doc, new_format); 805 GSXSLT.mergeStylesheets(page_xsl, new_format, true); 806 } 807 903 808 } 904 809 else 905 810 { 906 logger.error(" couldn't parse the config_format stylesheet, adding the format info as is"); 907 GSXSLT.mergeStylesheets(style_doc, format_elem, true); 908 //GSXSLT.mergeStylesheets(oldStyle_doc, format_elem); 909 } 910 logger.debug("the converted stylesheet is:"); 911 logger.debug(this.converter.getPrettyStringLogger(style_doc.getDocumentElement(), logger)); 912 } 913 914 //for debug purposes only 915 Document oldStyle_doc = style_doc; 916 Document preprocessingXsl; 811 // Is this a fatal error, or are there situations where we could carry on here... 812 logger.error(" Couldn't parse the "+CONFIG_FORMAT_FILE+" stylesheet"); 813 return XMLTransformer.constructErrorXHTMLPage("Couldn't find and/or load the stylesheet \""+CONFIG_FORMAT_FILE); 814 //GSXSLT.mergeStylesheets(page_xsl, format_elem, true); 815 } 816 } 817 818 if (output.equals("xsl2")) { 819 return converter.getDOM(getStringFromDocument(page_xsl)); 820 } 821 822 if (inline_template != null) 823 { 824 try 825 { 826 Document inline_template_doc = this.converter.getDOM("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<xsl:stylesheet version=\"1.0\" "+GSXML.ALL_NAMESPACES_ATTS + ">" + inline_template + "</xsl:stylesheet>", "UTF-8"); 827 828 if (_debug) 829 { 830 GSXSLT.mergeStylesheetsDebug(page_xsl, inline_template_doc.getDocumentElement(), true, true, "OTHER2", "INLINE"); 831 } 832 else 833 { 834 //GSXSLT.mergeStylesheets(skinAndLibraryDoc, inlineTemplateDoc.getDocumentElement(), true); 835 GSXSLT.mergeStylesheets(page_xsl, inline_template_doc.getDocumentElement(), true); 836 } 837 } 838 catch (Exception ex) 839 { 840 ex.printStackTrace(); 841 } 842 } 843 844 if (output.equals("xsl3")) { 845 return converter.getDOM(getStringFromDocument(page_xsl)); 846 } 847 848 // once we are here, have got the main page xsl loaded up. Have added in any format statements from the source xml, and added in any inline template which came through cgi params. 849 850 // next we load in the import and include files. - these, too, go through the inheritance cascade (base interface, interface, site, collection) before being added into the main document 851 852 if (_debug) 853 { 854 GSXSLT.inlineImportAndIncludeFilesDebug(page_xsl, null, _debug, page_xsl_filename, (String) this.config_params.get(GSConstants.SITE_NAME), collection, (String) this.config_params.get(GSConstants.INTERFACE_NAME), base_interfaces); 855 } 856 else 857 { 858 GSXSLT.inlineImportAndIncludeFiles(page_xsl, null, (String) this.config_params.get(GSConstants.SITE_NAME), collection, (String) this.config_params.get(GSConstants.INTERFACE_NAME), base_interfaces); 859 860 } 861 862 if (output.equals("xsl4")) { 863 return converter.getDOM(getStringFromDocument(page_xsl)); 864 } 865 866 // The next steg is to process the page_xsl + gslib.xsl by preProcess.xsl to expand all the 867 // gslib elements 868 869 Document preprocessingXsl; 917 870 try 918 871 { 872 // interfaces/core/transform/preProcess.xsl 873 // this takes skinandLibraryXsl, copies skinXSL, merges elements of libraryXsl into it, and replaces gslib elements 919 874 preprocessingXsl = getDoc(preprocess_xsl_filename); 920 875 String errMsg = ((XMLConverter.ParseErrorHandler) parser.getErrorHandler()).getErrorMessage(); 921 876 if (errMsg != null) 922 877 { 923 return XMLTransformer.constructErrorXHTMLPage("error loading preprocess xslt file: " + preprocess_xsl_filename + "\n" + errMsg);878 return XMLTransformer.constructErrorXHTMLPage("error loading core/transform/preProcess xslt file: " + preprocess_xsl_filename + "\n" + errMsg); 924 879 } 925 880 } … … 932 887 e.printStackTrace(); 933 888 System.out.println("error loading preprocess xslt"); 934 return XMLTransformer.constructErrorXHTMLPage("error loading preprocess xslt\n" + e.getMessage()); 935 } 936 889 return XMLTransformer.constructErrorXHTMLPage("Error loading interfaces/core/transform/preProcess xslt\n" + e.getMessage()); 890 } 891 892 // gslib.xsl 937 893 Document libraryXsl = null; 938 894 try 939 895 { 940 libraryXsl = GSXSLT.mergedXSLTDocumentCascade( "gslib.xsl", (String) this.config_params.get(GSConstants.SITE_NAME), collection, (String) this.config_params.get(GSConstants.INTERFACE_NAME), base_interfaces, _debug);896 libraryXsl = GSXSLT.mergedXSLTDocumentCascade(gslib_filename, (String) this.config_params.get(GSConstants.SITE_NAME), collection, (String) this.config_params.get(GSConstants.INTERFACE_NAME), base_interfaces, _debug); 941 897 } 942 898 catch (Exception e) … … 947 903 } 948 904 905 if (output.equals("preprocess")) { 906 return converter.getDOM(getStringFromDocument(preprocessingXsl)); 907 } 908 if (output.equals("gslib")) { 909 return converter.getDOM(getStringFromDocument(libraryXsl)); 910 } 949 911 // Combine the skin file and library variables/templates into one document. 950 912 // Please note: We dont just use xsl:import because the preprocessing stage … … 954 916 Document skinAndLibraryDoc = converter.newDOM(); 955 917 956 // Applying the preprocessing XSLT - in its own block {} to allow use of non-unique variable names 957 { 958 959 skinAndLibraryXsl = converter.newDOM(); 960 Element root = skinAndLibraryXsl.createElement("skinAndLibraryXsl"); 961 skinAndLibraryXsl.appendChild(root); 962 963 Element s = skinAndLibraryXsl.createElement("skinXsl"); 964 s.appendChild(skinAndLibraryXsl.importNode(style_doc.getDocumentElement(), true)); 965 root.appendChild(s); 966 967 Element l = skinAndLibraryXsl.createElement("libraryXsl"); 968 if (libraryXsl != null) 969 { 970 Element libraryXsl_el = libraryXsl.getDocumentElement(); 971 l.appendChild(skinAndLibraryXsl.importNode(libraryXsl_el, true)); 972 } 973 root.appendChild(l); 974 975 //System.out.println("Skin and Library XSL are now together") ; 976 977 //System.out.println("Pre-processing the skin file...") ; 978 979 //pre-process the skin style sheet 980 //In other words, apply the preProcess.xsl to 'skinAndLibraryXsl' in order to 981 //expand all GS-Lib statements into complete XSL statements and also to create 982 //a valid xsl style sheet document. 983 984 XMLTransformer preProcessor = new XMLTransformer(); 985 // Perform the transformation, by passing in: 986 // preprocess-stylesheet, source-xsl (skinAndLibraryXsl), and the node that should 987 // be in the result (skinAndLibraryDoc) 988 preProcessor.transform_withResultNode(preprocessingXsl, skinAndLibraryXsl, skinAndLibraryDoc); 989 //System.out.println("GS-Lib statements are now expanded") ; 990 } 991 992 // there is a thing called a URIResolver which you can set for a 993 // transformer or transformer factory. may be able to use this 994 // instead of this absoluteIncludepaths hack 995 996 //GSXSLT.absoluteIncludePaths(skinAndLibraryDoc, GlobalProperties.getGSDL3Home(), (String) this.config_params.get(GSConstants.SITE_NAME), collection, (String) this.config_params.get(GSConstants.INTERFACE_NAME), base_interfaces); 997 998 //Same but for the debug version when we want the do the transformation like we use to do 999 //without any gslib elements. 1000 GSXSLT.absoluteIncludePaths(oldStyle_doc, GlobalProperties.getGSDL3Home(), (String) this.config_params.get(GSConstants.SITE_NAME), collection, (String) this.config_params.get(GSConstants.INTERFACE_NAME), base_interfaces); 1001 1002 //Send different stages of the skin xslt to the browser for debug purposes only 1003 //using &o=skindoc or &o=skinandlib etc... 1004 if (output.equals("skindoc")) 1005 { 1006 return converter.getDOM(getStringFromDocument(style_doc)); 1007 } 1008 if (output.equals("skinandlib")) 1009 { 1010 return converter.getDOM(getStringFromDocument(skinAndLibraryXsl)); 1011 } 1012 if (output.equals("skinandlibdoc")) 1013 { 1014 1015 Node skinAndLib = converter.getDOM(getStringFromDocument(skinAndLibraryDoc)); 1016 return skinAndLib; 1017 } 1018 if (output.equals("oldskindoc")) 1019 { 1020 return converter.getDOM(getStringFromDocument(oldStyle_doc)); 1021 } 1022 1023 // We now no longer create a document with doctype before the transformation 1024 // We let the XMLTransformer do the work of first working out the doctype from any 1025 // that may be set in the (merged) stylesheets and then setting the doctype when transforming 1026 1027 /* 1028 // Try to get the system and public ID from the current skin xsl document 1029 // otherwise keep the default values. 1030 Element root = skinAndLibraryDoc.getDocumentElement(); 1031 NodeList nodes = root.getElementsByTagName("xsl:output"); 1032 // If there is at least one "xsl:output" command in the final xsl then... 1033 if (nodes.getLength() != 0) 1034 { 1035 // There should be only one element called xsl:output, 1036 // but if this is not the case get the last one 1037 Element xsl_output = (Element) nodes.item(nodes.getLength() - 1); 1038 if (xsl_output != null) 1039 { 1040 // Qualified name will always be html even for xhtml pages 1041 //String attrValue = xsl_output.getAttribute("method"); 1042 //qualifiedName = attrValue.equals("") ? qualifiedName : attrValue; 1043 1044 String attrValue = xsl_output.getAttribute("doctype-system"); 1045 systemID = attrValue.equals("") ? systemID : attrValue; 1046 1047 attrValue = xsl_output.getAttribute("doctype-public"); 1048 publicID = attrValue.equals("") ? publicID : attrValue; 1049 } 1050 } 1051 1052 //System.out.println(converter.getPrettyString(docWithDoctype)); 1053 //System.out.println("Doctype vals: " + qualifiedName + " " + publicID + " " + systemID) ; 1054 1055 docWithDoctype = converter.newDOM(qualifiedName, publicID, systemID); 1056 */ 1057 1058 //System.out.println("Generate final HTML from current skin") ; 1059 //Transformation of the XML message from the receptionist to HTML with doctype 1060 1061 if (inlineTemplate != null) 1062 { 1063 try 1064 { 1065 Document inlineTemplateDoc = this.converter.getDOM("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<xsl:stylesheet version=\"1.0\" "+GSXML.ALL_NAMESPACES_ATTS + ">" + inlineTemplate + "</xsl:stylesheet>", "UTF-8"); 1066 1067 if (_debug) 1068 { 1069 GSXSLT.mergeStylesheetsDebug(skinAndLibraryDoc, inlineTemplateDoc.getDocumentElement(), true, true, "OTHER2", "INLINE"); 1070 } 1071 else 1072 { 1073 GSXSLT.mergeStylesheets(skinAndLibraryDoc, inlineTemplateDoc.getDocumentElement(), true); 1074 } 1075 } 1076 catch (Exception ex) 1077 { 1078 ex.printStackTrace(); 1079 } 1080 } 1081 1082 if (_debug) 1083 { 1084 GSXSLT.inlineImportAndIncludeFilesDebug(skinAndLibraryDoc, null, _debug, this.getGSLibXSLFilename(), (String) this.config_params.get(GSConstants.SITE_NAME), collection, (String) this.config_params.get(GSConstants.INTERFACE_NAME), base_interfaces); 1085 } 1086 else 1087 { 1088 GSXSLT.inlineImportAndIncludeFiles(skinAndLibraryDoc, null, (String) this.config_params.get(GSConstants.SITE_NAME), collection, (String) this.config_params.get(GSConstants.INTERFACE_NAME), base_interfaces); 1089 } 1090 skinAndLibraryDoc = (Document) performFormatPass(collection, skinAndLibraryDoc, doc, new UserContext(request), TEXT_PASS); 1091 skinAndLibraryDoc = (Document) performFormatPass(collection, skinAndLibraryDoc, doc, new UserContext(request), CONFIG_PASS); 1092 1093 if (output.equals("xmlfinal")) 1094 { 1095 return doc; 1096 } 1097 1098 if (output.equals("skinandlibdocfinal") || output.equals("clientside")) 1099 { 1100 if (output.equals("skinandlibdocfinal")) 1101 { 1102 Node skinAndLibFinal = converter.getDOM(getStringFromDocument(skinAndLibraryDoc)); 1103 return skinAndLibFinal; 1104 } 1105 else 1106 { 1107 // Go through and 'fix up' any 'util:...' or 'java:...' attributes the skinAndLibraryDoc has 1108 String lang = (String)config_params.get("lang"); 1109 resolveExtendedNamespaceAttributesXSLT(skinAndLibraryDoc,currentInterface,lang); // test= and select= attributes 1110 resolveExtendedNamespaceAttributesXML(skinAndLibraryDoc,currentInterface,lang); // href= and src= attributes 1111 Node skinAndLibFinal = converter.getDOM(getStringFromDocument(skinAndLibraryDoc)); 1112 1113 // Send XML and skinandlibdoc down the line together 1114 Document finalDoc = converter.newDOM(); 1115 Node finalDocSkin = finalDoc.importNode(skinAndLibraryDoc.getDocumentElement(), true); 1116 Node finalDocXML = finalDoc.importNode(theXML.getDocumentElement(), true); 1117 Element root = finalDoc.createElement("skinlibfinalPlusXML"); 1118 root.appendChild(finalDocSkin); 1119 root.appendChild(finalDocXML); 1120 finalDoc.appendChild(root); 1121 return (Node) finalDoc.getDocumentElement(); 1122 } 1123 1124 1125 1126 1127 } 1128 918 // add in all gslib.xsl's include and import files 919 // debug?? use debug method?? or does it not make sense here?? 920 GSXSLT.inlineImportAndIncludeFiles(libraryXsl, null, (String) this.config_params.get(GSConstants.SITE_NAME), collection, (String) this.config_params.get(GSConstants.INTERFACE_NAME), base_interfaces); 921 922 // now, we transform all the gslib elements 923 { 924 925 926 skinAndLibraryXsl = converter.newDOM(); 927 Element root = skinAndLibraryXsl.createElement("skinAndLibraryXsl"); 928 skinAndLibraryXsl.appendChild(root); 929 930 Element s = skinAndLibraryXsl.createElement("skinXsl"); 931 s.appendChild(skinAndLibraryXsl.importNode(page_xsl.getDocumentElement(), true)); 932 root.appendChild(s); 933 934 Element l = skinAndLibraryXsl.createElement("libraryXsl"); 935 if (libraryXsl != null) 936 { 937 Element libraryXsl_el = libraryXsl.getDocumentElement(); 938 l.appendChild(skinAndLibraryXsl.importNode(libraryXsl_el, true)); 939 } 940 root.appendChild(l); 941 942 XMLTransformer preProcessor = new XMLTransformer(); 943 preProcessor.transform_withResultNode(preprocessingXsl, skinAndLibraryXsl, skinAndLibraryDoc); 944 945 } 946 if (output.equals("xsl5")) { 947 return converter.getDOM(getStringFromDocument(skinAndLibraryDoc)); 948 } 949 950 skinAndLibraryDoc = (Document) transformGSFElements(collection, skinAndLibraryDoc, TEXT_FORMAT_FILE); 951 952 skinAndLibraryDoc = (Document) transformGSFElements(collection, skinAndLibraryDoc, CONFIG_FORMAT_FILE); 953 } 954 955 956 if (output.equals("xsl6") || output.equals("skinandlibdocfinal") 957 { 958 return converter.getDOM(getStringFromDocument(skinAndLibraryDoc)); 959 } 960 961 if (output.equals("clientside")) 962 { 963 964 // Go through and 'fix up' any 'util:...' or 'java:...' attributes the skinAndLibraryDoc has 965 String lang = (String)config_params.get("lang"); 966 resolveExtendedNamespaceAttributesXSLT(skinAndLibraryDoc,currentInterface,lang); // test= and select= attributes 967 resolveExtendedNamespaceAttributesXML(skinAndLibraryDoc,currentInterface,lang); // href= and src= attributes 968 Node skinAndLibFinal = converter.getDOM(getStringFromDocument(skinAndLibraryDoc)); 969 970 // Send XML and skinandlibdoc down the line together 971 Document finalDoc = converter.newDOM(); 972 Node finalDocSkin = finalDoc.importNode(skinAndLibraryDoc.getDocumentElement(), true); 973 Node finalDocXML = finalDoc.importNode(page_with_xslt_params_doc.getDocumentElement(), true); 974 Element root = finalDoc.createElement("skinlibfinalPlusXML"); 975 root.appendChild(finalDocSkin); 976 root.appendChild(finalDocXML); 977 finalDoc.appendChild(root); 978 return (Node) finalDoc.getDocumentElement(); 979 } 980 981 logger.debug("final xml is "); 982 logger.debug(XMLConverter.getPrettyString(page_xml_doc)); 983 984 logger.debug("final xsl is"); 985 logger.debug(XMLConverter.getPrettyString(skinAndLibraryDoc)); 986 1129 987 // The transformer will now work out the resulting doctype from any set in the (merged) stylesheets and 1130 988 // will set this in the output document it creates. So don't pass in any docWithDocType to the transformer 1131 //Node finalResult = this.transformer.transform(skinAndLibraryDoc, doc, config_params, docWithDoctype); 1132 Node finalResult = this.transformer.transform(skinAndLibraryDoc, doc, config_params); 989 990 // Here, we finally transform the page xml source with the complete xsl file 991 Node finalResult = this.transformer.transform(skinAndLibraryDoc, page_xml_doc, config_params); 1133 992 1134 993 if (_debug) … … 1139 998 return finalResult; 1140 999 1141 // The line below will do the transformation like we use to do before having Skin++ implemented, 1142 // it will not contain any GS-Lib statements expanded, and the result will not contain any doctype. 1143 1144 //return (Element)this.transformer.transform(style_doc, doc, config_params); 1145 //return null; // For now - change later 1146 } 1147 1148 protected Node performFormatPass(String collection, Document skinAndLibraryDoc, Document doc, UserContext userContext, int pass) 1149 { 1150 String formatFile; 1151 if (pass == CONFIG_PASS) 1152 { 1153 formatFile = "config_format.xsl"; 1154 } 1155 else 1156 { 1157 formatFile = "text_fragment_format.xsl"; 1158 } 1159 1160 String configStylesheet_file = GSFile.stylesheetFile(GlobalProperties.getGSDL3Home(), (String) this.config_params.get(GSConstants.SITE_NAME), collection, (String) this.config_params.get(GSConstants.INTERFACE_NAME), base_interfaces, formatFile); 1161 Document configStylesheet_doc = this.converter.getDOM(new File(configStylesheet_file)); 1162 1163 if (configStylesheet_doc != null) 1164 { 1165 return this.transformer.transform(configStylesheet_doc, skinAndLibraryDoc, config_params); 1166 } 1167 return skinAndLibraryDoc; 1168 } 1000 } 1001 1002 protected Node generateXSLTClientOutput(Element request) { 1003 1004 // DocType defaults in case the skin doesn't have an "xsl:output" element 1005 String qualifiedName = "html"; 1006 String publicID = "-//W3C//DTD HTML 4.01 Transitional//EN"; 1007 String systemID = "http://www.w3.org/TR/html4/loose.dtd"; 1008 1009 // We need to create an empty document with a predefined DocType, 1010 // that will then be used for the transformation by the DOMResult 1011 Document docWithDoctype = converter.newDOM(qualifiedName, publicID, systemID); 1012 String baseURL = request.getAttribute(GSXML.BASE_URL); 1013 1014 // If you're just getting the client-side transform page, why bother with the rest of this? 1015 Element html = docWithDoctype.createElement("html"); 1016 Element img = docWithDoctype.createElement("img"); 1017 img.setAttribute("src", "loading.gif"); // Make it dynamic 1018 img.setAttribute("alt", "Please wait..."); 1019 Text title_text = docWithDoctype.createTextNode("Please wait..."); // Make this language dependent 1020 Element head = docWithDoctype.createElement("head"); 1021 1022 // e.g., <base href="http://localhost:8383/greenstone3/" /><!-- [if lte IE 6]></base><![endif] --> 1023 Element base = docWithDoctype.createElement("base"); 1024 base.setAttribute("href",baseURL); 1025 Comment opt_end_base = docWithDoctype.createComment("[if lte IE 6]></base><![endif]"); 1026 1027 Element title = docWithDoctype.createElement("title"); 1028 title.appendChild(title_text); 1029 1030 Element body = docWithDoctype.createElement("body"); 1031 1032 Element jquery_script = docWithDoctype.createElement("script"); 1033 jquery_script.setAttribute("src", "jquery-1.10-min.js"); 1034 jquery_script.setAttribute("type", "text/javascript"); 1035 Comment jquery_comment = docWithDoctype.createComment("jQuery"); 1036 jquery_script.appendChild(jquery_comment); 1037 1038 Element saxonce_script = docWithDoctype.createElement("script"); 1039 saxonce_script.setAttribute("src", "Saxonce/Saxonce.nocache.js"); 1040 saxonce_script.setAttribute("type", "text/javascript"); 1041 Comment saxonce_comment = docWithDoctype.createComment("SaxonCE"); 1042 saxonce_script.appendChild(saxonce_comment); 1043 1044 Element xsltutil_script = docWithDoctype.createElement("script"); 1045 xsltutil_script.setAttribute("src", "xslt-util.js"); 1046 xsltutil_script.setAttribute("type", "text/javascript"); 1047 Comment xsltutil_comment = docWithDoctype.createComment("JavaScript version of XSLTUtil.java"); 1048 xsltutil_script.appendChild(xsltutil_comment); 1049 1050 Element script = docWithDoctype.createElement("script"); 1051 Comment script_comment = docWithDoctype.createComment("Filler for browser"); 1052 script.setAttribute("src", "client-side-xslt.js"); 1053 script.setAttribute("type", "text/javascript"); 1054 script.appendChild(script_comment); 1055 1056 Element pagevar = docWithDoctype.createElement("script"); 1057 Element style = docWithDoctype.createElement("style"); 1058 style.setAttribute("type", "text/css"); 1059 Text style_text = docWithDoctype.createTextNode("body { text-align: center; padding: 50px; font: 14pt Arial, sans-serif; font-weight: bold; }"); 1060 pagevar.setAttribute("type", "text/javascript"); 1061 Text page_var_text = docWithDoctype.createTextNode("var placeholder = true;"); 1062 1063 html.appendChild(head); 1064 head.appendChild(base); head.appendChild(opt_end_base); 1065 head.appendChild(title); 1066 head.appendChild(style); 1067 style.appendChild(style_text); 1068 html.appendChild(body); 1069 head.appendChild(pagevar); 1070 head.appendChild(jquery_script); 1071 head.appendChild(saxonce_script); 1072 head.appendChild(xsltutil_script); 1073 head.appendChild(script); 1074 pagevar.appendChild(page_var_text); 1075 1076 body.appendChild(img); 1077 docWithDoctype.appendChild(html); 1078 1079 return (Node) docWithDoctype; 1080 1081 } 1082 1083 // transform the xsl with xsl to replace all gsf elements. We do this in 2 stages - 1084 // first do just a text pass, that way we can have gsf elements in the text content 1085 protected Node transformGSFElements(String collection, Document skinAndLibraryDoc, String formatFile) { 1086 1087 String configStylesheet_file = GSFile.stylesheetFile(GlobalProperties.getGSDL3Home(), (String) this.config_params.get(GSConstants.SITE_NAME), collection, (String) this.config_params.get(GSConstants.INTERFACE_NAME), base_interfaces, formatFile); 1088 Document configStylesheet_doc = this.converter.getDOM(new File(configStylesheet_file)); 1089 1090 if (configStylesheet_doc != null) 1091 { 1092 return this.transformer.transform(configStylesheet_doc, skinAndLibraryDoc, config_params); 1093 } 1094 return skinAndLibraryDoc; 1095 1096 } 1169 1097 1170 1098 // method to convert Document to a proper XML string for debug purposes only … … 1205 1133 } 1206 1134 1135 protected String getXSLTFilename(String action, String subaction) { 1136 String name = null; 1137 if (!subaction.equals("")) 1138 { 1139 String key = action + ":" + subaction; 1140 name = this.xslt_map.get(key); 1141 } 1142 // try the action by itself 1143 if (name == null) 1144 { 1145 name = this.xslt_map.get(action); 1146 } 1147 if (name == null) 1148 { 1149 // so we can reandomly create any named page 1150 if (action.equals("p") && !subaction.equals("")) 1151 { 1152 // TODO: pages/ won't work for interface other than default!! 1153 name = "pages/" + subaction + ".xsl"; 1154 } 1155 1156 } 1157 return name; 1158 } 1159 1160 1207 1161 protected Document getXSLTDocument(String action, String subaction, String collection) 1208 1162 { 1209 String name = null; 1210 if (!subaction.equals("")) 1211 { 1212 String key = action + ":" + subaction; 1213 name = this.xslt_map.get(key); 1214 } 1215 // try the action by itself 1216 if (name == null) 1217 { 1218 name = this.xslt_map.get(action); 1219 } 1220 if (name == null) 1221 { 1222 // so we can reandomly create any named page 1223 if (action.equals("p") && !subaction.equals("")) 1224 { 1225 // TODO: pages/ won't work for interface other than default!! 1226 name = "pages/" + subaction + ".xsl"; 1227 } 1228 1229 } 1230 1163 String name = getXSLTFilename(action, subaction); 1231 1164 Document finalDoc = null; 1232 1165 if(name != null) 1233 1166 { 1234 finalDoc = GSXSLT.mergedXSLTDocumentCascade(name, (String) this.config_params.get(GSConstants.SITE_NAME), collection, (String) this.config_params.get(GSConstants.INTERFACE_NAME), base_interfaces, _debug); 1167 // this finds all the stylesheets named "name" and merges them together, in the order of 1168 // base interface, current interface, site, collection - the latter overriding the former. 1169 // templates with the same name will replace earlier versions 1170 finalDoc = GSXSLT.mergedXSLTDocumentCascade(name, (String) this.config_params.get(GSConstants.SITE_NAME), collection, (String) this.config_params.get(GSConstants.INTERFACE_NAME), base_interfaces, _debug); 1235 1171 } 1236 1172 return finalDoc;
Note:
See TracChangeset
for help on using the changeset viewer.