1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 package org.openoffice.xmerge.converter.xml.xslt; 25 26 import org.w3c.dom.NodeList; 27 import org.w3c.dom.Node; 28 import org.w3c.dom.Element; 29 import org.w3c.dom.*; 30 31 import java.io.IOException; 32 import java.io.ByteArrayOutputStream; 33 import java.io.ByteArrayInputStream; 34 35 import org.openoffice.xmerge.Document; 36 import org.openoffice.xmerge.ConvertData; 37 import org.openoffice.xmerge.ConvertException; 38 import org.openoffice.xmerge.DocumentSerializer; 39 import org.openoffice.xmerge.converter.xml.xslt.GenericOfficeDocument; 40 import org.openoffice.xmerge.converter.dom.DOMDocument; 41 import org.openoffice.xmerge.util.registry.ConverterInfo; 42 import org.openoffice.xmerge.converter.xml.OfficeConstants; 43 44 // Imported TraX classes 45 import javax.xml.transform.TransformerFactory; 46 import javax.xml.transform.Transformer; 47 import javax.xml.transform.stream.StreamSource; 48 import javax.xml.transform.stream.StreamResult; 49 import javax.xml.transform.dom.DOMSource; 50 import javax.xml.transform.TransformerException; 51 import javax.xml.transform.TransformerConfigurationException; 52 import javax.xml.transform.URIResolver; 53 import javax.xml.transform.Source; 54 55 import javax.xml.parsers.DocumentBuilder; 56 import javax.xml.parsers.DocumentBuilderFactory; 57 58 // Imported java classes 59 import java.io.FileNotFoundException; 60 61 /** 62 * <p>Xslt implementation of 63 * org.openoffice.xmerge.DocumentSerializer 64 * for the {@link 65 * org.openoffice.xmerge.converter.xml.xslt.PluginFactoryImpl 66 * PluginFactoryImpl}.</p> 67 * 68 * <p>The <code>serialize</code> method transforms the DOM 69 * document from the given <code>Document</code> object by 70 * means of a supplied Xsl Stylesheet.</p> 71 * 72 * @author Aidan Butler 73 */ 74 75 76 public final class DocumentSerializerImpl 77 implements DocumentSerializer,OfficeConstants,URIResolver { 78 79 80 /** SXW <code>Document</code> object that this converter processes. */ 81 private GenericOfficeDocument sxwDoc = null; 82 83 private PluginFactoryImpl pluginFactory = null; 84 85 /** 86 * Constructor. 87 * 88 * @param pf A <code>PluginFactoryImpl</code> 89 * @param doc A SXW <code>Document</code> to be converted. 90 */ DocumentSerializerImpl(PluginFactoryImpl pf,Document doc)91 public DocumentSerializerImpl(PluginFactoryImpl pf,Document doc) { 92 pluginFactory=pf; 93 sxwDoc = (GenericOfficeDocument) doc; 94 } 95 96 97 /** 98 * Method to convert a <code>Document</code> with an xsl stylesheet. 99 * It creates a <code>Document</code> object, which is then transformed 100 * with the Xslt processor. A <code>ConvertData </code> object is 101 * constructed and returned. 102 * 103 * @return cd A <code>ConvertData</code> object. 104 * @throws ConvertException If any I/O error occurs. 105 * @throws IOException If any I/O error occurs. 106 */ serialize()107 public ConvertData serialize() throws ConvertException, IOException { 108 String docName = sxwDoc.getName(); 109 org.w3c.dom.Document domDoc = sxwDoc.getContentDOM(); 110 org.w3c.dom.Document metaDoc = sxwDoc.getMetaDOM(); 111 org.w3c.dom.Document styleDoc = sxwDoc.getStyleDOM(); 112 ByteArrayOutputStream baos= new ByteArrayOutputStream(); 113 ConvertData cd = new ConvertData(); 114 Node offnode = (Node)domDoc.getDocumentElement(); 115 if (!(offnode.getNodeName()).equals("office:document")){ 116 try{ 117 DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); 118 DocumentBuilder builder= builderFactory.newDocumentBuilder(); 119 DOMImplementation domImpl = builder.getDOMImplementation(); 120 DocumentType docType =domImpl.createDocumentType("office:document","-//OpenOffice.org//DTD OfficeDocument 1.0//EN",null); 121 org.w3c.dom.Document newDoc = domImpl.createDocument("http://openoffice.org/2000/office","office:document",docType); 122 123 124 Element rootElement=newDoc.getDocumentElement(); 125 rootElement.setAttribute("xmlns:office","http://openoffice.org/2000/office"); 126 rootElement.setAttribute("xmlns:style","http://openoffice.org/2000/style" ); 127 rootElement.setAttribute("xmlns:text","http://openoffice.org/2000/text"); 128 rootElement.setAttribute("xmlns:table","http://openoffice.org/2000/table"); 129 130 rootElement.setAttribute("xmlns:draw","http://openoffice.org/2000/drawing"); 131 rootElement.setAttribute("xmlns:fo","http://www.w3.org/1999/XSL/Format" ); 132 rootElement.setAttribute("xmlns:xlink","http://www.w3.org/1999/xlink" ); 133 rootElement.setAttribute("xmlns:dc","http://purl.org/dc/elements/1.1/" ); 134 rootElement.setAttribute("xmlns:meta","http://openoffice.org/2000/meta" ); 135 rootElement.setAttribute("xmlns:number","http://openoffice.org/2000/datastyle" ); 136 rootElement.setAttribute("xmlns:svg","http://www.w3.org/2000/svg" ); 137 rootElement.setAttribute("xmlns:chart","http://openoffice.org/2000/chart" ); 138 rootElement.setAttribute("xmlns:dr3d","http://openoffice.org/2000/dr3d" ); 139 rootElement.setAttribute("xmlns:math","http://www.w3.org/1998/Math/MathML" ); 140 rootElement.setAttribute("xmlns:form","http://openoffice.org/2000/form" ); 141 rootElement.setAttribute("xmlns:script","http://openoffice.org/2000/script" ); 142 rootElement.setAttribute("xmlns:config","http://openoffice.org/2001/config" ); 143 rootElement.setAttribute("office:class","text" ); 144 rootElement.setAttribute("office:version","1.0"); 145 146 147 NodeList nodeList; 148 Node tmpNode; 149 Node rootNode = (Node)rootElement; 150 if (metaDoc !=null){ 151 nodeList= metaDoc.getElementsByTagName(TAG_OFFICE_META); 152 if (nodeList.getLength()>0){ 153 tmpNode = newDoc.importNode(nodeList.item(0),true); 154 rootNode.appendChild(tmpNode); 155 } 156 } if (styleDoc !=null){ 157 nodeList= styleDoc.getElementsByTagName(TAG_OFFICE_STYLES); 158 if (nodeList.getLength()>0){ 159 tmpNode = newDoc.importNode(nodeList.item(0),true); 160 rootNode.appendChild(tmpNode); 161 } 162 }if (domDoc !=null){ 163 nodeList= domDoc.getElementsByTagName(TAG_OFFICE_AUTOMATIC_STYLES); 164 if (nodeList.getLength()>0){ 165 tmpNode = newDoc.importNode(nodeList.item(0),true); 166 rootNode.appendChild(tmpNode); 167 } 168 nodeList= domDoc.getElementsByTagName(TAG_OFFICE_BODY); 169 if (nodeList.getLength()>0){ 170 tmpNode = newDoc.importNode(nodeList.item(0),true); 171 rootNode.appendChild(tmpNode); 172 } 173 } 174 domDoc=newDoc; 175 }catch(Exception e){ 176 System.out.println("\nAn Exception occurred with Xslt Serializer"+e); 177 } 178 179 } 180 181 try{ 182 baos=transform(domDoc); 183 } 184 catch (Exception e){ 185 System.out.println("\n Error with Xslt\n"); 186 } 187 188 String ext = pluginFactory.getDeviceFileExtension(); 189 DOMDocument resultDomDoc=(DOMDocument)pluginFactory.createDeviceDocument(docName,new ByteArrayInputStream(baos.toByteArray())); 190 cd.addDocument (resultDomDoc); 191 return cd; 192 } 193 resolve(String href,String base)194 public Source resolve(String href,String base) 195 throws TransformerException{ 196 //System.out.println("\nhref "+href+"\nbase "+base); 197 if (href !=null){ 198 if(href.equals("javax.xml.transform.dom.DOMSource")|| href.equals("")) 199 return null; 200 try{ 201 ConverterInfo ci = pluginFactory.getConverterInfo(); 202 String newhRef ="jar:"+ci.getJarName()+"!/"+href; 203 //System.out.println("\n Looking For "+ newhRef); 204 StreamSource sheetFile= new StreamSource(newhRef); 205 return sheetFile; 206 } 207 catch (Exception e){ 208 System.out.println("\nException in Xslt Resolver " +e); 209 return null; 210 } 211 } 212 else 213 return null; 214 } 215 216 217 /* 218 * This method performs the sxl transformation on the supplied <code> 219 * Document</code> and returns a <code>DOMResult</code> object. 220 * 221 * Xslt transformation code 222 * 223 * @return baos A <code>ByteArrayOutputStream</code> object containing 224 * the result of the Xslt transformation. 225 * @throws TransformerException,TransformerConfigurationException 226 * , FileNotFoundException,IOException 227 * 228 */ 229 230 transform(org.w3c.dom.Document domDoc)231 private ByteArrayOutputStream transform(org.w3c.dom.Document domDoc) 232 throws TransformerException,TransformerConfigurationException 233 , FileNotFoundException,IOException{ 234 //System.out.println("\nTransforming..."); 235 ConverterInfo ci = pluginFactory.getConverterInfo(); 236 //DOMResult xmlDomResult = new DOMResult(); 237 ByteArrayOutputStream baos= new ByteArrayOutputStream(); 238 try{ 239 240 DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance(); 241 dFactory.setNamespaceAware(true); 242 243 DocumentBuilder dBuilder = dFactory.newDocumentBuilder(); 244 String teststr = ci.getXsltSerial(); 245 246 teststr= teststr.substring(0,6); 247 org.w3c.dom.Document xslDoc=null; 248 if ((teststr.equals("http:/"))||(teststr.equals("file:/")) 249 ||(teststr.equals("jar://"))){ 250 System.out.println(ci.getXsltSerial()); 251 xslDoc= dBuilder.parse(ci.getXsltSerial()); 252 253 } 254 else{ 255 //System.out.println(ci.getJarName()+"!/"+ci.getXsltSerial()); 256 xslDoc = dBuilder.parse( 257 "jar:"+ci.getJarName()+"!/"+ci.getXsltSerial()); 258 } 259 260 DOMSource xslDomSource = new DOMSource(xslDoc); 261 DOMSource xmlDomSource = new DOMSource(domDoc); 262 263 //call the tranformer using the XSL, Source and Result. 264 TransformerFactory tFactory = TransformerFactory.newInstance(); 265 tFactory.setURIResolver(this); 266 Transformer transformer = tFactory.newTransformer(xslDomSource); 267 268 transformer.transform(xmlDomSource, new StreamResult(baos)); 269 270 /* 271 transformer.transform(xmlDomSource, xmlDomResult); //Removed this impl because the DocType was not being written out 272 273 // Serialize for output to standard out 274 Serializer serializer = SerializerFactory.getSerializer 275 (OutputProperties.getDefaultMethodProperties("xml")); 276 //serializer.setOutputStream(System.out); 277 serializer.setOutputStream(baos); 278 serializer.asDOMSerializer().serialize(xmlDomResult.getNode()); 279 //serializer.asDOMSerializer().serialize(xmlDomSource.getNode()); 280 281 282 //System.out.println("\n** Transform Complete ***"); 283 */ 284 } 285 catch(Exception e){ 286 System.out.println("An error occurred in the transformation : "+e); 287 } 288 return baos; 289 } 290 291 292 } 293 294