/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ package org.openoffice.xmerge.converter.xml.xslt; import org.w3c.dom.NodeList; import org.w3c.dom.Node; import org.w3c.dom.Element; import org.w3c.dom.*; import java.io.IOException; import java.io.ByteArrayOutputStream; import java.io.ByteArrayInputStream; import org.openoffice.xmerge.Document; import org.openoffice.xmerge.ConvertData; import org.openoffice.xmerge.ConvertException; import org.openoffice.xmerge.DocumentSerializer; import org.openoffice.xmerge.converter.xml.xslt.GenericOfficeDocument; import org.openoffice.xmerge.converter.dom.DOMDocument; import org.openoffice.xmerge.util.registry.ConverterInfo; import org.openoffice.xmerge.converter.xml.OfficeConstants; // Imported TraX classes import javax.xml.transform.TransformerFactory; import javax.xml.transform.Transformer; import javax.xml.transform.stream.StreamSource; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.URIResolver; import javax.xml.transform.Source; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; // Imported java classes import java.io.FileNotFoundException; /** *

Xslt implementation of * org.openoffice.xmerge.DocumentSerializer * for the {@link * org.openoffice.xmerge.converter.xml.xslt.PluginFactoryImpl * PluginFactoryImpl}.

* *

The serialize method transforms the DOM * document from the given Document object by * means of a supplied Xsl Stylesheet.

* * @author Aidan Butler */ public final class DocumentSerializerImpl implements DocumentSerializer,OfficeConstants,URIResolver { /** SXW Document object that this converter processes. */ private GenericOfficeDocument sxwDoc = null; private PluginFactoryImpl pluginFactory = null; /** * Constructor. * * @param pf A PluginFactoryImpl * @param doc A SXW Document to be converted. */ public DocumentSerializerImpl(PluginFactoryImpl pf,Document doc) { pluginFactory=pf; sxwDoc = (GenericOfficeDocument) doc; } /** * Method to convert a Document with an xsl stylesheet. * It creates a Document object, which is then transformed * with the Xslt processor. A ConvertData object is * constructed and returned. * * @return cd A ConvertData object. * @throws ConvertException If any I/O error occurs. * @throws IOException If any I/O error occurs. */ public ConvertData serialize() throws ConvertException, IOException { String docName = sxwDoc.getName(); org.w3c.dom.Document domDoc = sxwDoc.getContentDOM(); org.w3c.dom.Document metaDoc = sxwDoc.getMetaDOM(); org.w3c.dom.Document styleDoc = sxwDoc.getStyleDOM(); ByteArrayOutputStream baos= new ByteArrayOutputStream(); ConvertData cd = new ConvertData(); Node offnode = (Node)domDoc.getDocumentElement(); if (!(offnode.getNodeName()).equals("office:document")){ try{ DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder= builderFactory.newDocumentBuilder(); DOMImplementation domImpl = builder.getDOMImplementation(); DocumentType docType =domImpl.createDocumentType("office:document","-//OpenOffice.org//DTD OfficeDocument 1.0//EN",null); org.w3c.dom.Document newDoc = domImpl.createDocument("http://openoffice.org/2000/office","office:document",docType); Element rootElement=newDoc.getDocumentElement(); rootElement.setAttribute("xmlns:office","http://openoffice.org/2000/office"); rootElement.setAttribute("xmlns:style","http://openoffice.org/2000/style" ); rootElement.setAttribute("xmlns:text","http://openoffice.org/2000/text"); rootElement.setAttribute("xmlns:table","http://openoffice.org/2000/table"); rootElement.setAttribute("xmlns:draw","http://openoffice.org/2000/drawing"); rootElement.setAttribute("xmlns:fo","http://www.w3.org/1999/XSL/Format" ); rootElement.setAttribute("xmlns:xlink","http://www.w3.org/1999/xlink" ); rootElement.setAttribute("xmlns:dc","http://purl.org/dc/elements/1.1/" ); rootElement.setAttribute("xmlns:meta","http://openoffice.org/2000/meta" ); rootElement.setAttribute("xmlns:number","http://openoffice.org/2000/datastyle" ); rootElement.setAttribute("xmlns:svg","http://www.w3.org/2000/svg" ); rootElement.setAttribute("xmlns:chart","http://openoffice.org/2000/chart" ); rootElement.setAttribute("xmlns:dr3d","http://openoffice.org/2000/dr3d" ); rootElement.setAttribute("xmlns:math","http://www.w3.org/1998/Math/MathML" ); rootElement.setAttribute("xmlns:form","http://openoffice.org/2000/form" ); rootElement.setAttribute("xmlns:script","http://openoffice.org/2000/script" ); rootElement.setAttribute("xmlns:config","http://openoffice.org/2001/config" ); rootElement.setAttribute("office:class","text" ); rootElement.setAttribute("office:version","1.0"); NodeList nodeList; Node tmpNode; Node rootNode = (Node)rootElement; if (metaDoc !=null){ nodeList= metaDoc.getElementsByTagName(TAG_OFFICE_META); if (nodeList.getLength()>0){ tmpNode = newDoc.importNode(nodeList.item(0),true); rootNode.appendChild(tmpNode); } } if (styleDoc !=null){ nodeList= styleDoc.getElementsByTagName(TAG_OFFICE_STYLES); if (nodeList.getLength()>0){ tmpNode = newDoc.importNode(nodeList.item(0),true); rootNode.appendChild(tmpNode); } }if (domDoc !=null){ nodeList= domDoc.getElementsByTagName(TAG_OFFICE_AUTOMATIC_STYLES); if (nodeList.getLength()>0){ tmpNode = newDoc.importNode(nodeList.item(0),true); rootNode.appendChild(tmpNode); } nodeList= domDoc.getElementsByTagName(TAG_OFFICE_BODY); if (nodeList.getLength()>0){ tmpNode = newDoc.importNode(nodeList.item(0),true); rootNode.appendChild(tmpNode); } } domDoc=newDoc; }catch(Exception e){ System.out.println("\nAn Exception occurred with Xslt Serializer"+e); } } try{ baos=transform(domDoc); } catch (Exception e){ System.out.println("\n Error with Xslt\n"); } String ext = pluginFactory.getDeviceFileExtension(); DOMDocument resultDomDoc=(DOMDocument)pluginFactory.createDeviceDocument(docName,new ByteArrayInputStream(baos.toByteArray())); cd.addDocument (resultDomDoc); return cd; } public Source resolve(String href,String base) throws TransformerException{ //System.out.println("\nhref "+href+"\nbase "+base); if (href !=null){ if(href.equals("javax.xml.transform.dom.DOMSource")|| href.equals("")) return null; try{ ConverterInfo ci = pluginFactory.getConverterInfo(); String newhRef ="jar:"+ci.getJarName()+"!/"+href; //System.out.println("\n Looking For "+ newhRef); StreamSource sheetFile= new StreamSource(newhRef); return sheetFile; } catch (Exception e){ System.out.println("\nException in Xslt Resolver " +e); return null; } } else return null; } /* * This method performs the sxl transformation on the supplied * Document and returns a DOMResult object. * * Xslt transformation code * * @return baos A ByteArrayOutputStream object containing * the result of the Xslt transformation. * @throws TransformerException,TransformerConfigurationException * , FileNotFoundException,IOException * */ private ByteArrayOutputStream transform(org.w3c.dom.Document domDoc) throws TransformerException,TransformerConfigurationException , FileNotFoundException,IOException{ //System.out.println("\nTransforming..."); ConverterInfo ci = pluginFactory.getConverterInfo(); //DOMResult xmlDomResult = new DOMResult(); ByteArrayOutputStream baos= new ByteArrayOutputStream(); try{ DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance(); dFactory.setNamespaceAware(true); DocumentBuilder dBuilder = dFactory.newDocumentBuilder(); String teststr = ci.getXsltSerial(); teststr= teststr.substring(0,6); org.w3c.dom.Document xslDoc=null; if ((teststr.equals("http:/"))||(teststr.equals("file:/")) ||(teststr.equals("jar://"))){ System.out.println(ci.getXsltSerial()); xslDoc= dBuilder.parse(ci.getXsltSerial()); } else{ //System.out.println(ci.getJarName()+"!/"+ci.getXsltSerial()); xslDoc = dBuilder.parse( "jar:"+ci.getJarName()+"!/"+ci.getXsltSerial()); } DOMSource xslDomSource = new DOMSource(xslDoc); DOMSource xmlDomSource = new DOMSource(domDoc); //call the tranformer using the XSL, Source and Result. TransformerFactory tFactory = TransformerFactory.newInstance(); tFactory.setURIResolver(this); Transformer transformer = tFactory.newTransformer(xslDomSource); transformer.transform(xmlDomSource, new StreamResult(baos)); /* transformer.transform(xmlDomSource, xmlDomResult); //Removed this impl because the DocType was not being written out // Serialize for output to standard out Serializer serializer = SerializerFactory.getSerializer (OutputProperties.getDefaultMethodProperties("xml")); //serializer.setOutputStream(System.out); serializer.setOutputStream(baos); serializer.asDOMSerializer().serialize(xmlDomResult.getNode()); //serializer.asDOMSerializer().serialize(xmlDomSource.getNode()); //System.out.println("\n** Transform Complete ***"); */ } catch(Exception e){ System.out.println("An error occurred in the transformation : "+e); } return baos; } }