Changeset 16374


Ignore:
Timestamp:
2008-07-14T12:10:15+12:00 (16 years 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.

Location:
greenstone3/trunk/src/java/org/greenstone/gsdl3
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • 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    }
Note: See TracChangeset for help on using the changeset viewer.