blob: edfc62a47b5623f3d651a8f12fb180b7513b1bed [file] [log] [blame]
/**************************************************************
*
* 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 java.io.InputStream;
import java.io.IOException;
import java.util.Enumeration;
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.DocumentDeserializer;
import org.openoffice.xmerge.converter.dom.DOMDocument;
//import org.openoffice.xmerge.converter.xml.sxw.SxwDocument;
import org.openoffice.xmerge.converter.xml.xslt.GenericOfficeDocument;
import org.openoffice.xmerge.util.Debug;
import org.openoffice.xmerge.util.registry.ConverterInfo;
// Imported TraX classes
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.dom.DOMSource;
//import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.URIResolver;
import javax.xml.transform.Source;
//
//import org.apache.xalan.serialize.Serializer;
//import org.apache.xalan.serialize.SerializerFactory;
//import org.apache.xalan.templates.OutputProperties;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
// Imported java classes
import java.io.FileNotFoundException;
/**
* <p>Xslt implementation of
* org.openoffice.xmerge.DocumentSerializer
* for the {@link
* org.openoffice.xmerge.converter.xml.xslt.PluginFactoryImpl
* PluginFactoryImpl}.</p>
*
* <p>The <code>serialize</code> method transforms the DOM
* document from the given <code>Document</code> object by
* means of a supplied Xsl Stylesheet.</p>
*
* @author Aidan Butler
*/
public final class DocumentDeserializerImpl
implements DocumentDeserializer,URIResolver {
/** A <code>ConvertData</code> object assigned to this object. */
private InputStream is = null;
private ConvertData cd = null;
private PluginFactoryImpl pluginFactory = null;
/**
* Constructor that assigns the given <code>ConvertData</code>
* to this object.
*
* @param pf A <code>PluginFactoryImpl</code> object.
*
* @param cd A <code>ConvertData</code> object to read data for
* the conversion process by the <code>deserialize</code>
* method.
*/
public DocumentDeserializerImpl(PluginFactoryImpl pf,ConvertData cd) {
this.cd = cd;
pluginFactory = pf;
}
/*
* This method performs the xslt transformation on the supplied <code>
* Document</code> and returns a <code>ByteArrayOutputStream</code> object.
*
* Xslt transformation code
*
* @return baos A <code>ByteArrayOutputStream</code> object containing
* the result of the Xslt transformation.
* @throws TransformerException,TransformerConfigurationException
* , FileNotFoundException,IOException
*
*/
public Document deserialize() throws ConvertException, IOException {
log("\nFound the XSLT deserializer");
Enumeration enumerate = cd.getDocumentEnumeration();
org.w3c.dom.Document domDoc=null;
DOMDocument docOut=null;
GenericOfficeDocument doc = null;
ByteArrayOutputStream baos =null;
GenericOfficeDocument sxwDoc = new GenericOfficeDocument("output");
while (enumerate.hasMoreElements()) {
docOut = (DOMDocument) enumerate.nextElement();
}
domDoc = docOut.getContentDOM();
try{
baos = transform(domDoc);
sxwDoc.initContentDOM();
DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
dFactory.setNamespaceAware(true);
DocumentBuilder dBuilder = dFactory.newDocumentBuilder();
sxwDoc.setContentDOM(dBuilder.parse(new ByteArrayInputStream(baos.toByteArray())));
}
catch(Exception e){
System.out.println("The following error occurred:"+e);
}
return sxwDoc;
}
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 xslt transformation on the supplied Dom Tree.
*
* Xslt transformation code
*
* @throws TransformerException,TransformerConfigurationException
* , FileNotFoundException,IOException
*
*/
private ByteArrayOutputStream transform(org.w3c.dom.Document xmlDoc)
throws TransformerException,TransformerConfigurationException
, FileNotFoundException,IOException{
log("\nTransforming...");
ConverterInfo ci = pluginFactory.getConverterInfo();
ByteArrayOutputStream baos= new ByteArrayOutputStream();
try{
DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
dFactory.setNamespaceAware(true);
DocumentBuilder dBuilder = dFactory.newDocumentBuilder();
String teststr = ci.getXsltDeserial();
teststr= teststr.substring(0,6);
org.w3c.dom.Document xslDoc=null;
if ((teststr.equals("http:/"))||(teststr.equals("file:/"))
||(teststr.equals("jar://"))){
log(ci.getXsltDeserial());
xslDoc= dBuilder.parse(ci.getXsltDeserial());
}
else{
log(ci.getJarName()+"!/"+ci.getXsltDeserial());
xslDoc = dBuilder.parse(
"jar:"+ci.getJarName()+"!/"+ci.getXsltDeserial());
}
DOMSource xslDomSource = new DOMSource(xslDoc);
DOMSource xmlDomSource = new DOMSource(xmlDoc);
//call the tranformer using the XSL, Source and Result dom.
TransformerFactory tFactory = TransformerFactory.newInstance();
tFactory.setURIResolver(this);
Transformer transformer = tFactory.newTransformer(xslDomSource);
transformer.transform(xmlDomSource,new StreamResult(baos));
/*
// Serialize for output to standard out
Serializer serializer = SerializerFactory.getSerializer
(OutputProperties.getDefaultMethodProperties("xml"));
serializer.setOutputStream(System.out);
serializer.asDOMSerializer().serialize(xmlDomResult.getNode());
*/
log("\n** Transform Complete ***");
}
catch (StackOverflowError sOE){
System.out.println("\nERROR : Stack Overflow Error During Transformation\n Try increasing the stack size by passing the -Xss1m option to the JRE.");
throw sOE;
}
catch(Exception e){
System.out.println("An error occured in the transformation : "+e);
}
return baos;
}
/**
* Sends message to the log object.
*
* @param str Debug message.
*/
private void log(String str) {
Debug.log(Debug.TRACE, str);
}
}