xref: /AOO41X/main/xmerge/source/xmerge/java/org/openoffice/xmerge/converter/xml/xslt/DocumentDeserializerImpl.java (revision 7a3beb322b74df1b6c96e03605837df34781c68f)
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 java.io.InputStream;
27 import java.io.IOException;
28 import java.util.Enumeration;
29 import java.io.ByteArrayOutputStream;
30 import java.io.ByteArrayInputStream;
31 
32 
33 
34 
35 import org.openoffice.xmerge.Document;
36 import org.openoffice.xmerge.ConvertData;
37 import org.openoffice.xmerge.ConvertException;
38 import org.openoffice.xmerge.DocumentDeserializer;
39 import org.openoffice.xmerge.converter.dom.DOMDocument;
40 //import org.openoffice.xmerge.converter.xml.sxw.SxwDocument;
41 import org.openoffice.xmerge.converter.xml.xslt.GenericOfficeDocument;
42 import org.openoffice.xmerge.util.Debug;
43 import org.openoffice.xmerge.util.registry.ConverterInfo;
44 
45 // Imported TraX classes
46 import javax.xml.transform.TransformerFactory;
47 import javax.xml.transform.Transformer;
48 import javax.xml.transform.dom.DOMSource;
49 //import javax.xml.transform.dom.DOMResult;
50 import javax.xml.transform.TransformerException;
51 import javax.xml.transform.TransformerConfigurationException;
52 import javax.xml.transform.stream.StreamResult;
53 import javax.xml.transform.stream.StreamSource;
54 import javax.xml.transform.URIResolver;
55 import javax.xml.transform.Source;
56 
57 
58 //
59 //import org.apache.xalan.serialize.Serializer;
60 //import org.apache.xalan.serialize.SerializerFactory;
61 //import org.apache.xalan.templates.OutputProperties;
62 
63 import javax.xml.parsers.DocumentBuilder;
64 import javax.xml.parsers.DocumentBuilderFactory;
65 
66 // Imported java classes
67 import java.io.FileNotFoundException;
68 
69 
70 /**
71  *  <p>Xslt implementation of
72  *  org.openoffice.xmerge.DocumentSerializer
73  *  for the {@link
74  *  org.openoffice.xmerge.converter.xml.xslt.PluginFactoryImpl
75  *  PluginFactoryImpl}.</p>
76  *
77  *  <p>The <code>serialize</code> method transforms the DOM
78  *  document from the given <code>Document</code> object by
79  *  means of a supplied Xsl Stylesheet.</p>
80  *
81  *  @author      Aidan Butler
82  */
83 public final class DocumentDeserializerImpl
84     implements  DocumentDeserializer,URIResolver {
85 
86     /**  A <code>ConvertData</code> object assigned to this object. */
87     private InputStream is = null;
88     private ConvertData cd = null;
89     private PluginFactoryImpl pluginFactory = null;
90 
91     /**
92      *  Constructor that assigns the given <code>ConvertData</code>
93      *  to this object.
94      *
95      *  @param  pf  A <code>PluginFactoryImpl</code> object.
96      *
97      *  @param  cd  A <code>ConvertData</code> object to read data for
98      *              the conversion process by the <code>deserialize</code>
99      *              method.
100      */
DocumentDeserializerImpl(PluginFactoryImpl pf,ConvertData cd)101     public DocumentDeserializerImpl(PluginFactoryImpl pf,ConvertData cd) {
102         this.cd = cd;
103     pluginFactory = pf;
104     }
105 
106 
107 
108      /*
109      * This method performs the xslt transformation on the supplied <code>
110      * Document</code> and returns a <code>ByteArrayOutputStream</code> object.
111      *
112      *  Xslt transformation code
113      *
114      * @return baos A <code>ByteArrayOutputStream</code> object containing
115      *               the result of the Xslt transformation.
116      * @throws TransformerException,TransformerConfigurationException
117      *        , FileNotFoundException,IOException
118      *
119      */
deserialize()120     public Document deserialize() throws ConvertException, IOException {
121     log("\nFound the XSLT deserializer");
122     Enumeration enumerate = cd.getDocumentEnumeration();
123     org.w3c.dom.Document domDoc=null;
124     DOMDocument docOut=null;
125     GenericOfficeDocument doc = null;
126     ByteArrayOutputStream baos =null;
127     GenericOfficeDocument sxwDoc = new GenericOfficeDocument("output");
128     while (enumerate.hasMoreElements()) {
129          docOut = (DOMDocument) enumerate.nextElement();
130     }
131     domDoc = docOut.getContentDOM();
132     try{
133          baos = transform(domDoc);
134          sxwDoc.initContentDOM();
135          DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
136          dFactory.setNamespaceAware(true);
137          DocumentBuilder dBuilder = dFactory.newDocumentBuilder();
138          sxwDoc.setContentDOM(dBuilder.parse(new ByteArrayInputStream(baos.toByteArray())));
139 
140     }
141     catch(Exception e){
142         System.out.println("The following error occurred:"+e);
143     }
144     return sxwDoc;
145     }
146 
resolve(String href,String base)147  public Source resolve(String href,String base)
148     throws TransformerException{
149         //System.out.println("\nhref "+href+"\nbase "+base);
150         if (href !=null){
151         if(href.equals("javax.xml.transform.dom.DOMSource")|| href.equals(""))
152             return null;
153         try{
154             ConverterInfo ci = pluginFactory.getConverterInfo();
155             String newhRef ="jar:"+ci.getJarName()+"!/"+href;
156             //System.out.println("\n Looking For "+ newhRef);
157             StreamSource sheetFile= new StreamSource(newhRef);
158             return sheetFile;
159         }
160         catch (Exception e){
161             System.out.println("\nException in Xslt Resolver " +e);
162             return null;
163         }
164         }
165         else
166         return null;
167     }
168 
169      /*
170      * This method performs the xslt transformation on the supplied Dom Tree.
171      *
172      *  Xslt transformation code
173      *
174      * @throws TransformerException,TransformerConfigurationException
175      *        , FileNotFoundException,IOException
176      *
177      */
transform(org.w3c.dom.Document xmlDoc)178     private ByteArrayOutputStream  transform(org.w3c.dom.Document xmlDoc)
179        throws TransformerException,TransformerConfigurationException
180           , FileNotFoundException,IOException{
181 
182        log("\nTransforming...");
183        ConverterInfo ci = pluginFactory.getConverterInfo();
184        ByteArrayOutputStream baos= new ByteArrayOutputStream();
185        try{
186           DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
187           dFactory.setNamespaceAware(true);
188           DocumentBuilder dBuilder = dFactory.newDocumentBuilder();
189 
190           String teststr = ci.getXsltDeserial();
191           teststr= teststr.substring(0,6);
192           org.w3c.dom.Document xslDoc=null;
193               if ((teststr.equals("http:/"))||(teststr.equals("file:/"))
194                                         ||(teststr.equals("jar://"))){
195               log(ci.getXsltDeserial());
196               xslDoc= dBuilder.parse(ci.getXsltDeserial());
197 
198           }
199           else{
200               log(ci.getJarName()+"!/"+ci.getXsltDeserial());
201               xslDoc = dBuilder.parse(
202                   "jar:"+ci.getJarName()+"!/"+ci.getXsltDeserial());
203           }
204 
205 
206           DOMSource xslDomSource = new DOMSource(xslDoc);
207           DOMSource xmlDomSource = new DOMSource(xmlDoc);
208 
209            //call the tranformer using the XSL, Source and Result dom.
210           TransformerFactory tFactory = TransformerFactory.newInstance();
211           tFactory.setURIResolver(this);
212           Transformer transformer = tFactory.newTransformer(xslDomSource);
213           transformer.transform(xmlDomSource,new StreamResult(baos));
214           /*
215           // Serialize for output to standard out
216           Serializer serializer = SerializerFactory.getSerializer
217                                    (OutputProperties.getDefaultMethodProperties("xml"));
218           serializer.setOutputStream(System.out);
219           serializer.asDOMSerializer().serialize(xmlDomResult.getNode());
220           */
221 
222           log("\n** Transform Complete ***");
223 
224        }
225        catch (StackOverflowError sOE){
226               System.out.println("\nERROR : Stack Overflow Error During Transformation\n Try increasing the stack size by passing the -Xss1m option to the JRE.");
227           throw sOE;
228        }
229        catch(Exception e){
230               System.out.println("An error occured in the transformation : "+e);
231        }
232         return baos;
233      }
234 
235      /**
236      *  Sends message to the log object.
237      *
238      *  @param  str  Debug message.
239      */
log(String str)240     private void log(String str) {
241 
242         Debug.log(Debug.TRACE, str);
243     }
244 
245 }
246 
247