greenstone.org greenstone wiki greenstone trac planet greenstone

Changeset 16374

Show
Ignore:
Timestamp:
2008-07-14 12:10:15 (3 months ago)
Author:
davidb
Message:

Change to Skin code (returning Node note Element) so XSLT encodes its DocType? -- important information for IE to render resultant HTML correctly. This also required Skin.java to be changed from using DomResult? to StreamResult?. The former is known to have a problem with loosing its DocType? info, and as it's then read-only, has no elegant way to put back this info.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • greenstone3/trunk/src/java/org/greenstone/gsdl3/LibraryServlet.java

    r14561 r16374  
    77import org.w3c.dom.Document; 
    88import org.w3c.dom.Element; 
     9import org.w3c.dom.Node; 
    910import org.w3c.dom.NodeList; 
    1011import java.io.*; 
     
    497498    //GSXML.printXMLNode(xml_message); 
    498499     
    499     Element xml_result = this.recept.process (xml_message); 
    500     encodeURLs (xml_result, response); 
     500    Node xml_result = this.recept.processToPage (xml_message); 
     501    // encodeURLs (xml_result, response); 
    501502    out.println (this.converter.getPrettyString (xml_result)); 
    502503     
  • greenstone3/trunk/src/java/org/greenstone/gsdl3/core/Receptionist.java

    r15011 r16374  
    129129        return true; 
    130130    } 
     131 
     132    public String process(String xml_in) { 
     133 
     134        Element message = this.converter.getDOM(xml_in).getDocumentElement(); 
     135        Node page = process(message); 
     136        return this.converter.getString(page); 
     137    } 
     138 
     139    public Element process(Element message) { 
     140        Node node = processToPage(message); 
     141 
     142        short nodeType = node.getNodeType(); 
     143 
     144        if (nodeType == Node.DOCUMENT_NODE) { 
     145                Document docNode = (Document)node; 
     146                return docNode.getDocumentElement() ; 
     147        } 
     148        else { 
     149            return null; 
     150        } 
     151    } 
     152 
     153 
     154 
     155 
    131156    /** process using strings - just calls process using Elements */ 
    132     public String process(String xml_in) { 
     157    public String processToPage(String xml_in) { 
    133158 
    134159        Element message = this.converter.getDOM(xml_in).getDocumentElement(); 
    135         Element page = process(message); 
     160        Node page = processToPage(message); 
    136161        return this.converter.getString(page); 
    137162    } 
     163 
    138164 
    139165    /** process - produce a page of data in response to a request  
    140166     * if something goes wrong, it returns null -  
    141167     * TODO:  return a suitable message to the user */ 
    142     public Element process(Element message) { 
     168    public Node processToPage(Element message) { 
    143169 
    144170        // get the request out of the message - assume that there is only one 
     
    221247        //logger.info(" raw page="+this.converter.getString(page)); 
    222248        // transform the result in some way 
    223         Element resulting_page = postProcessPage(page); 
    224     logger.debug("receptionist returned response"); 
    225     logger.debug(this.converter.getString(resulting_page)); 
     249        //Element resulting_page = postProcessPage(page); 
     250 
     251        Node resulting_page = postProcessPage(page); 
     252 
     253        logger.debug("receptionist returned response"); 
     254        logger.debug(this.converter.getString(resulting_page)); 
    226255//    logger.info("receptionist returned response"); 
    227256//    logger.info(this.converter.getString(resulting_page)); 
     
    285314    } 
    286315 
    287     protected Element postProcessPage(Element page) { 
     316    protected Node postProcessPage(Element page) { 
    288317        return page; 
    289318    } 
  • greenstone3/trunk/src/java/org/greenstone/gsdl3/core/Skin.java

    r16314 r16374  
    175175         
    176176         
    177         public Element transformPage(Page page) throws Exception{ 
     177        public Node transformPage(Page page) throws Exception{ 
    178178                 
    179179                Element p = page.getPage() ; 
     
    209209                } catch (Exception e) { 
    210210                        System.out.println("error loading preprocessing xslt") ; 
    211                        e.printStackTrace() ; 
     211                e.printStackTrace() ; 
    212212                        return constructErrorPage(e) ; 
    213213                } 
     
    259259                //return sourceXml.getDocumentElement() ; 
    260260                 
    261                 Document finalPage = receptionist.converter.newDOM(); 
     261                // Document finalPage = receptionist.converter.newDOM(); // **** 
     262                Document finalPageParsed = null; 
     263 
    262264                //transform source doc 
    263265                try { 
    264266                 
    265                 //Tranform XSL DOM to String     
     267                    /* 
     268                    //Tranform XSL DOM to String         
    266269                        TransformerFactory tf = TransformerFactory.newInstance(); 
    267270                        Transformer trans = tf.newTransformer(); 
    268271                        StringWriter sw = new StringWriter(); 
    269272                        trans.transform(new DOMSource(processedXsl), new StreamResult(sw)); 
    270                         String theXSLAnswer = sw.toString(); 
    271                          
    272                         //writefile("c:\\mr49\\stylesheet.xsl", theXSLAnswer); 
    273                          
    274                          
    275                 //Tranform XML DOM to String     
     273                        // String theXSLAnswer = sw.toString(); // **** 
     274                         
     275                         
     276                        //Tranform XML DOM to String     
    276277                        TransformerFactory tf2 = TransformerFactory.newInstance(); 
    277278                        Transformer trans2 = tf2.newTransformer(); 
    278279                        StringWriter sw2 = new StringWriter(); 
    279280                        trans2.transform(new DOMSource(sourceXml), new StreamResult(sw2)); 
    280                         String theXMLAnswer = sw2.toString(); 
    281                          
    282                         //writefile("c:\\mr49\\xml.xml", theXMLAnswer); 
    283  
    284                          
     281                        //String theXMLAnswer = sw2.toString(); 
     282                        */ 
     283 
    285284                        Transformer transformer = transformerFactory.newTransformer(new DOMSource(processedXsl)); 
    286                         //Transformer transformer = transformerFactory.newTransformer(new StreamSource("c:\\mr49\\stylesheet.xsl")); 
    287                         transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"); 
    288                         DOMResult result = new DOMResult(); 
    289                         result.setNode(finalPage); 
     285                        // transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"); 
     286                        //DOMResult result = new DOMResult(); 
     287                        //result.setNode(finalPage); 
    290288                         
    291289                        //transformer.transform(new DOMSource(sourceXml), result2); 
    292290                        StringWriter result2 = new StringWriter(); 
    293                         transformer.transform(new DOMSource(sourceXml), result); 
    294                          
    295                         //transformer.transform(new DOMSource(sourceXml), new StreamResult(result2)); 
    296                         //writefile("c:\\mr49\\result.html", result2.toString()); 
    297                         //System.err.println("outputting result:"); 
    298                         //System.err.println(this.converter.getPrettyString(finalPage)); 
    299                         /* 
    300                         //Testing stuff 
    301                          
    302                                 TransformerFactory tFactory = TransformerFactory.newInstance(); 
    303                                 Transformer with identity transformation 
    304                                 Transformer transformer2 =  tFactory.newTransformer(new DOMSource(processedXsl)); 
    305              
    306                                 String xml="<root><a><b><c>aaa</c></b></a></root>"; 
    307                                 StringWriter result2 = new StringWriter(); 
    308             //Transfrom xml (in String) to formatted xml (in String)                         
    309                                 transformer2.transform(new StreamSource(new StringReader(theXMLAnswer)), new StreamResult(result2)); 
    310             //Output result             
    311                                 writefile("c:\\mr49\\testHTML.txt", result2.toString()); 
    312                 */ 
    313                          
    314                          
    315                          
     291                        transformer.transform(new DOMSource(sourceXml), new StreamResult(result2)); 
     292 
     293                        XMLConverter converter = new XMLConverter(); 
     294                        finalPageParsed = converter.getDOM(result2.toString());                                  
    316295                         
    317296                } catch (TransformerException e) { 
     
    326305                } 
    327306                         
    328                 return finalPage.getDocumentElement()
     307                return finalPageParsed
    329308        } 
    330309         
     
    438417        } 
    439418         
    440         private void writefile(String filename, String contents){ 
    441          
    442         File testFile = new File(filename); 
    443                  
    444  
    445     //use buffering 
    446      
    447          
    448     try { 
    449         Writer output = new BufferedWriter(new FileWriter(testFile)); 
    450       //FileWriter always assumes default encoding is OK! 
    451       output.write( contents ); 
    452            output.close(); 
    453     } 
    454          
    455         catch (Exception e) { 
    456         e.printStackTrace(); 
    457         } 
    458          
    459          
    460     
    461   } 
    462419 
    463420}        
  • greenstone3/trunk/src/java/org/greenstone/gsdl3/core/SkinnedReceptionist.java

    r16314 r16374  
    77import org.w3c.dom.Document;  
    88import org.w3c.dom.Element;  
     9import org.w3c.dom.Node;  
    910 
    1011import org.greenstone.gsdl3.util.*; 
     
    2425        } 
    2526         
    26         protected Element postProcessPage(Element p) { 
     27        protected Node postProcessPage(Element p) { 
    2728                try { 
    2829                        //Avoid the duplicate attribute in the namespaces declaration of the generated html file 
     
    7677                         
    7778                         
     79                        Node np = null; 
    7880                        try { 
    7981                                if (skin != null && !output.equals("xml")) { 
    80                                         //System.out.println("Skin exists") ; 
    81                                         p = skin.transformPage(page); 
    82                                         //System.out.println("done skinning") ; 
    83                                          
    84                                         //System.out.println("SkinnedPage = " + this.converter.getPrettyString(p)) ; 
     82                                        np = skin.transformPage(page); 
    8583                                }  
     84                                else { 
     85                                    np = p; 
     86                                } 
    8687                        } catch (Exception e) { 
    8788                                e.printStackTrace() ; 
     
    9091                         
    9192                         
    92                         return p ; 
     93                        return np ; 
    9394                } catch (Exception e) { 
    9495                        e.printStackTrace() ; 
     
    340341        } 
    341342         
    342         protected Element transformPage(Element page) { 
     343        protected Node transformPage(Element page) { 
    343344                return super.transformPage(page) ; 
    344345        } 
  • greenstone3/trunk/src/java/org/greenstone/gsdl3/core/TransformingReceptionist.java

    r13270 r16374  
    116116 
    117117 
    118     protected Element postProcessPage(Element page) { 
     118    protected Node postProcessPage(Element page) { 
    119119         
    120120        // might need to add some data to the page 
    121121        addExtraInfo(page); 
    122122        // transform the page using xslt 
    123         Element transformed_page = transformPage(page); 
     123        Node transformed_page = transformPage(page); 
    124124         
    125125        return transformed_page; 
     
    132132     * we need to get any format element out of the page and add it to the xslt 
    133133     * before transforming */ 
    134     protected Element transformPage(Element page) { 
     134    protected Node transformPage(Element page) { 
    135135 
    136136        logger.debug("page before transfomring:"); 
     
    184184                format_doc.appendChild(format_doc.importNode(format_elem, true)); 
    185185                Element new_format = (Element)this.transformer.transform(stylesheet_doc, format_doc); 
    186             logger.debug("new format elem="+this.converter.getPrettyString(new_format)); 
     186               logger.debug("new format elem="+this.converter.getPrettyString(new_format)); 
    187187             
    188             // add it in to the main stylesheet 
     188               // add it in to the main stylesheet 
    189189                GSXSLT.mergeStylesheets(style_doc, new_format); 
    190190            } else { 
     
    196196        } 
    197197         
    198         // there is a thing called a URIResolver which you can set for a transformer or transformer factory. may be able to use this instead of this absoluteIncludepaths hack 
    199         GSXSLT.absoluteIncludePaths(style_doc, GlobalProperties.getGSDL3Home(), (String)this.config_params.get(GSConstants.SITE_NAME), collection, (String)this.config_params.get(GSConstants.INTERFACE_NAME), base_interfaces); 
    200         // put the page into a document - this is necessary for xslt to get the paths right if you have paths relative to the document root eg /page. 
     198        // there is a thing called a URIResolver which you can set for a 
     199        // transformer or transformer factory. may be able to use this 
     200        // instead of this absoluteIncludepaths hack 
     201 
     202        GSXSLT.absoluteIncludePaths(style_doc, GlobalProperties.getGSDL3Home(),  
     203                                    (String)this.config_params.get(GSConstants.SITE_NAME),  
     204                                    collection, (String)this.config_params.get(GSConstants.INTERFACE_NAME),  
     205                                    base_interfaces); 
     206 
     207        // put the page into a document - this is necessary for xslt to get 
     208        // the paths right if you have paths relative to the document root 
     209        // eg /page. 
     210 
    201211        Document doc = this.converter.newDOM(); 
    202212        doc.appendChild(doc.importNode(page, true)); 
  • greenstone3/trunk/src/java/org/greenstone/gsdl3/util/XMLConverter.java

    r13210 r16374  
    2121// XML classes 
    2222import org.w3c.dom.Document;  
     23import org.w3c.dom.DocumentType;  
    2324import org.w3c.dom.Node;  
    2425import org.w3c.dom.NodeList; 
     
    173174 
    174175        if (nodeType == Node.DOCUMENT_NODE) { 
    175             getString(((Document)xmlNode).getDocumentElement(), xmlRepresentation, depth, pretty); 
     176            Document xmlDocNode = (Document)xmlNode; 
     177             
     178            if (xmlDocNode.getDoctype() == null) { 
     179                System.err.println("Doctype is null."); 
     180            } 
     181            else { 
     182                 
     183                DocumentType dt = xmlDocNode.getDoctype(); 
     184                 
     185                String name = dt.getName(); 
     186                String pid  = dt.getPublicId(); 
     187                String sid  = dt.getSystemId(); 
     188                 
     189                String doctype_str = "<!DOCTYPE " + dt.getName() + " PUBLIC \"" + pid + "\"" + sid + "\">\n"; 
     190                 
     191                xmlRepresentation.append(doctype_str); 
     192            } 
     193            getString(xmlDocNode.getDocumentElement(), xmlRepresentation, depth, pretty); 
    176194            return; 
    177195        }