xref: /AOO41X/main/xmerge/source/bridge/java/XMergeBridge.java (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 /** You can find more
29  * information on the following web page:
30  * http://api.openoffice.org/common/ref/com/sun/star/index.html
31  */
32 
33 
34 /*Java Uno Helper Classes*/
35 import com.sun.star.lib.uno.adapter.XInputStreamToInputStreamAdapter;
36 import com.sun.star.lib.uno.adapter.XOutputStreamToOutputStreamAdapter;
37 
38 /*StarOffice/Uno Classes*/
39 import com.sun.star.lang.XMultiServiceFactory;
40 import com.sun.star.lang.XServiceInfo;
41 import com.sun.star.lang.XTypeProvider;
42 import com.sun.star.uno.Type;
43 import com.sun.star.uno.UnoRuntime;
44 import com.sun.star.comp.loader.FactoryHelper;
45 import com.sun.star.lang.XServiceName;
46 import com.sun.star.lang.XSingleServiceFactory;
47 import com.sun.star.registry.XRegistryKey;
48 import com.sun.star.frame.XConfigManager;
49 import com.sun.star.xml.sax.InputSource;
50 import com.sun.star.xml.sax.XParser;
51 import com.sun.star.io.XInputStream;
52 import com.sun.star.io.XOutputStream;
53 import com.sun.star.xml.sax.XDocumentHandler;
54 import com.sun.star.uno.AnyConverter;
55 
56 /* Generated from Idls */
57 import com.sun.star.xml.XImportFilter;
58 import com.sun.star.xml.XExportFilter;
59 
60 /* XMerge Classes */
61 import org.openoffice.xmerge.util.registry.ConverterInfoReader;
62 import org.openoffice.xmerge.util.registry.ConverterInfo;
63 import org.openoffice.xmerge.util.registry.ConverterInfoMgr;
64 import org.openoffice.xmerge.Convert;
65 import org.openoffice.xmerge.ConverterFactory;
66 import org.openoffice.xmerge.Document;
67 import org.openoffice.xmerge.ConvertData;
68 import org.openoffice.xmerge.converter.xml.OfficeDocument;
69 /*Java Classes*/
70 import java.util.Enumeration;
71 import java.io.*;
72 import javax.xml.parsers.*;
73 import java.net.URI;
74 
75 
76 /** This outer class provides an inner class to implement the service
77  * description and a method to instantiate the
78  * component on demand (__getServiceFactory()).
79  */
80 public class XMergeBridge {
81 
82 
83     private static XMultiServiceFactory xMSF;
84     private static XDocumentHandler exportDocHandler=null;
85     private static XInputStream xInStream =null;
86     private static XOutputStream xOutStream=null;
87     private static String  udJarPath=null;
88     private static XOutputStream xos = null;
89     private static XOutputStreamToOutputStreamAdapter adaptedStream=null;
90     private static String offMime=null;
91     private static String sdMime=null;
92     private static String sFileName=null;
93     private static String sURL="";
94 
95     //private static FileOutputStream adaptedStream =null;
96 
97     /** This inner class provides the component as a concrete implementation
98      * of the service description. It implements the needed interfaces.
99      * @implements XTypeProvider
100      */
101     static public class _XMergeBridge implements
102                                                XImportFilter,
103      XExportFilter,
104         XServiceName,
105         XServiceInfo,
106     XDocumentHandler,
107         XTypeProvider {
108 
109         /** The component will be registered under this name.
110          */
111         static private final String __serviceName = "com.sun.star.documentconversion.XMergeBridge";
112 
113 
114 
115         public com.sun.star.uno.Type[] getTypes() {
116             Type[] typeReturn = {};
117 
118             try {
119                 typeReturn = new Type[] {
120                 new Type( XTypeProvider.class ),
121                 new Type( XImportFilter.class ),
122         new Type( XExportFilter.class ),
123                 new Type( XServiceName.class ),
124                 new Type( XServiceInfo.class ) };
125             }
126             catch( Exception exception ) {
127 
128             }
129 
130             return( typeReturn );
131         }
132 
133     String getFileName(String origName)
134     {
135         String name=null;
136         if (origName !=null)
137         {
138         if(origName.equalsIgnoreCase(""))
139             name = "OutFile";
140         else {
141             if (origName.lastIndexOf("/")>=0){
142                 origName=origName.substring(origName.lastIndexOf("/")+1,origName.length());
143             }
144             if (origName.lastIndexOf(".")>=0){
145             name = origName.substring(0,(origName.lastIndexOf(".")));
146             }
147             else{
148             name=origName;
149             }
150         }
151         }
152         else{
153         name = "OutFile";
154         }
155         return name;
156     }
157 
158 
159 
160     public boolean importer(com.sun.star.beans.PropertyValue[] aSourceData,
161                 com.sun.star.xml.sax.XDocumentHandler xDocHandler,
162                 java.lang.String[] msUserData) throws com.sun.star.uno.RuntimeException {
163                 /*
164         System.out.println("\nFound the Importer!\n");
165 
166         System.out.println("\n"+msUserData[0]);
167         System.out.println("\n"+msUserData[1]);
168         System.out.println("\n"+msUserData[2]);
169         System.out.println("\n"+msUserData[3]);
170         System.out.println("\n"+msUserData[4]);
171         System.out.println("\n"+msUserData[5]);
172         */
173         sFileName="";
174         sURL="";
175         String sDirectory = null;
176         String udConvertClass=msUserData[0];
177         udJarPath=msUserData[1];
178         String udImport =msUserData[2];
179         String udExport =msUserData[3];
180         offMime =msUserData[4];
181         sdMime = msUserData[5];
182         com.sun.star.io.XInputStream xis=null;
183         com.sun.star.beans.PropertyValue[] pValue = aSourceData;
184 
185         for  (int  i = 0 ; i < pValue.length; i++)
186         {
187 
188         //System.out.println("\n"+pValue[i].Name+" "+pValue[i].Value;
189 
190          try{
191              //System.out.println("\n"+pValue[i].Name+" "+pValue[i].Value);
192              if (pValue[i].Name.compareTo("InputStream")==0){
193             xis=(com.sun.star.io.XInputStream)AnyConverter.toObject(new Type(com.sun.star.io.XInputStream.class), pValue[i].Value);
194              }
195              if (pValue[i].Name.compareTo("FileName")==0){
196              sFileName=(String)AnyConverter.toObject(new Type(java.lang.String.class), pValue[i].Value);
197              }
198 
199          }
200          catch(com.sun.star.lang.IllegalArgumentException AnyExec){
201              System.out.println("\nIllegalArgumentException "+AnyExec);
202          }
203 
204 
205 
206         }
207 
208 
209         try{
210 
211         Object xCfgMgrObj=xMSF.createInstance("com.sun.star.config.SpecialConfigManager");
212          XConfigManager xCfgMgr = (XConfigManager) UnoRuntime.queryInterface(
213                                             XConfigManager.class , xCfgMgrObj );
214         String PathString=xCfgMgr.substituteVariables("$(progurl)" );
215         PathString= PathString.concat("/");
216         udJarPath= PathString.concat(udJarPath);
217 
218         Object xPipeObj=xMSF.createInstance("com.sun.star.io.Pipe");
219         xInStream = (XInputStream) UnoRuntime.queryInterface(
220                         XInputStream.class , xPipeObj );
221             xOutStream = (XOutputStream) UnoRuntime.queryInterface(
222                         XOutputStream.class , xPipeObj );
223         convert (xis,xOutStream,false,udJarPath,sFileName,offMime,sdMime);
224         Object xSaxParserObj=xMSF.createInstance("com.sun.star.xml.sax.Parser");
225 
226         XParser xParser = (XParser) UnoRuntime.queryInterface(
227                         XParser.class , xSaxParserObj );
228         if (xParser==null){
229             System.out.println("\nParser creation Failed");
230         }
231         xOutStream.closeOutput();
232         InputSource aInput = new InputSource();
233         if (sFileName==null){
234             sFileName="";
235             }
236         aInput.sSystemId = sFileName;
237         aInput.aInputStream =xInStream;
238                 xParser.setDocumentHandler ( xDocHandler );
239 
240         xParser.parseStream ( aInput );
241         xOutStream.closeOutput();
242         xInStream.closeInput();
243 
244         }
245         catch (IOException e){
246         //System.out.println("XMergeBridge IO Exception "+e.getMessage());
247           return false;
248         }
249          catch (Exception e){
250         //System.out.println("XMergeBridge Exception "+e+" "+e.getMessage());
251         return false;
252         }
253         return true;
254     }
255 
256        public boolean exporter(com.sun.star.beans.PropertyValue[] aSourceData,
257                    java.lang.String[] msUserData) throws com.sun.star.uno.RuntimeException{
258 
259                    /*
260         System.out.println("\nFound the Exporter!\n");
261 
262         System.out.println("\n"+msUserData[0]);
263         System.out.println("\n"+msUserData[1]);
264         System.out.println("\n"+msUserData[2]);
265         System.out.println("\n"+msUserData[3]);
266         System.out.println("\n"+msUserData[4]);
267         System.out.println("\n"+msUserData[5]);
268         */
269         sFileName=null;
270         sURL=null;
271         String sDirectory = null;
272         String title=null;
273         String udConvertClass=msUserData[0];
274         udJarPath=msUserData[1];
275         String udImport =msUserData[2];
276         String udExport =msUserData[3];
277         offMime =msUserData[4];
278         sdMime = msUserData[5];
279 
280         com.sun.star.beans.PropertyValue[] pValue = aSourceData;
281         for  (int  i = 0 ; i < pValue.length; i++)
282         {
283 
284         //System.out.println("\n"+pValue[i].Name+" "+pValue[i].Value);
285 
286 
287         try{
288             //System.out.println("\n"+pValue[i].Name+" "+pValue[i].Value);
289             if (pValue[i].Name.compareTo("OutputStream")==0){
290             xos=(com.sun.star.io.XOutputStream)AnyConverter.toObject(new Type(com.sun.star.io.XOutputStream.class), pValue[i].Value);
291             //  System.out.println(pValue[i].Name+" "+xos);
292             }
293             if (pValue[i].Name.compareTo("FileName")==0){
294             sFileName=(String)AnyConverter.toObject(new Type(java.lang.String.class), pValue[i].Value);
295             //System.out.println(pValue[i].Name+" "+sFileName);
296             }
297             if (pValue[i].Name.compareTo("URL")==0){
298             sURL=(String)AnyConverter.toObject(new Type(java.lang.String.class), pValue[i].Value);
299             // System.out.println("\nMediaDescriptor url "+pValue[i].Name+" "+sURL);
300 
301             }
302             if (pValue[i].Name.compareTo("Title")==0){
303 
304             title=(String)AnyConverter.toObject(new Type(java.lang.String.class), pValue[i].Value);
305             //System.out.println(pValue[i].Name+" "+title);
306             }
307         }
308         catch(com.sun.star.lang.IllegalArgumentException AnyExec){
309              System.out.println("\nIllegalArgumentException "+AnyExec);
310         }
311         }
312 
313 
314         if (sURL==null){
315         sURL="";
316         }
317 
318          try{
319 
320          Object xCfgMgrObj=xMSF.createInstance("com.sun.star.config.SpecialConfigManager");
321          XConfigManager xCfgMgr = (XConfigManager) UnoRuntime.queryInterface(
322                                             XConfigManager.class , xCfgMgrObj );
323 
324         String PathString=xCfgMgr.substituteVariables("$(progurl)" );
325         PathString= PathString.concat("/");
326         udJarPath= PathString.concat(udJarPath);
327 
328         Object xPipeObj=xMSF.createInstance("com.sun.star.io.Pipe");
329         xInStream = (XInputStream) UnoRuntime.queryInterface(
330                         XInputStream.class , xPipeObj );
331         xOutStream = (XOutputStream) UnoRuntime.queryInterface(
332                         XOutputStream.class , xPipeObj );
333            }
334           catch (Exception e){
335         System.out.println("Exception "+e);
336           return false;
337         }
338 
339         return true;
340        }
341 
342     public String replace(String origString, String origChar, String replaceChar){
343            String tmp="";
344            int index=origString.indexOf(origChar);
345            if(index !=-1){
346            while (index !=-1){
347                String first =origString.substring(0,index);
348                first=first.concat(replaceChar);
349                tmp=tmp.concat(first);
350                origString=origString.substring(index+1,origString.length());
351                index=origString.indexOf(origChar);
352                if(index==-1) {
353                tmp=tmp.concat(origString);
354                }
355 
356            }
357 
358            }
359            return tmp;
360     }
361 
362     public String needsMask(String origString){
363         if (origString.indexOf("&")!=-1){
364         origString=replace(origString,"&","&amp;");
365         }
366          if (origString.indexOf("\"")!=-1){
367         origString=replace(origString,"\"","&quot;");
368         }
369         if (origString.indexOf("<")!=-1){
370         origString=replace(origString,"<","&lt;");
371         }
372         if (origString.indexOf(">")!=-1){
373         origString=replace(origString,">","&gt;");
374         }
375         return origString;
376 
377     }
378 
379 
380 
381        public void  startDocument ()    {
382        //System.out.println("\nStart Document!");
383        }
384 
385     public void endDocument()throws com.sun.star.uno.RuntimeException
386     {
387 
388         try{
389         xOutStream.closeOutput();
390         convert (xInStream,xos,true,udJarPath,sURL,offMime,sdMime);
391 
392         }
393         catch (IOException e){
394         //System.out.println("Exception "+e);
395         throw new com.sun.star.uno.RuntimeException(e.getMessage());
396 
397         }
398          catch (Exception e){
399         //System.out.println("Exception "+e);
400         throw new com.sun.star.uno.RuntimeException("Xmerge Exception");
401 
402         }
403     }
404 
405 
406 
407     public void startElement (String str, com.sun.star.xml.sax.XAttributeList xattribs)
408     {
409 
410         str="<".concat(str);
411         if (xattribs !=null)
412         {
413         str= str.concat(" ");
414         int len=xattribs.getLength();
415         for (short i=0;i<len;i++)
416             {
417             str=str.concat(xattribs.getNameByIndex(i));
418             str=str.concat("=\"");
419             str=str.concat(needsMask(xattribs.getValueByIndex(i)));
420             str=str.concat("\" ");
421             }
422         }
423         str=str.concat(">");
424         // System.out.println(str);
425         try{
426          xOutStream.writeBytes(str.getBytes("UTF-8"));
427         }
428         catch (Exception e){
429         System.out.println("\n"+e);
430         }
431 
432     }
433 
434     public void endElement(String str){
435 
436         str="</".concat(str);
437         str=str.concat(">");
438         try{
439          xOutStream.writeBytes(str.getBytes("UTF-8"));
440 
441         }
442         catch (Exception e){
443         System.out.println("\n"+e);
444         }
445 
446 
447     }
448     public void characters(String str){
449         str=needsMask(str);
450         try{
451          xOutStream.writeBytes(str.getBytes("UTF-8"));
452         }
453        catch (Exception e){
454            System.out.println("\n"+e);
455        }
456 
457 
458     }
459 
460     public void ignorableWhitespace(String str){
461 
462 
463     }
464        public void processingInstruction(String aTarget, String aData){
465 
466        }
467 
468     public void setDocumentLocator(com.sun.star.xml.sax.XLocator xLocator){
469 
470     }
471 
472 
473 
474 
475 
476 
477     public void convert (com.sun.star.io.XInputStream xml,com.sun.star.io.XOutputStream device,
478              boolean convertFromOffice,String pluginUrl,String FileName,String offMime,String sdMime) throws com.sun.star.uno.RuntimeException, IOException {
479 
480          String jarName = pluginUrl;
481          String name= getFileName(FileName);
482 
483          ConverterInfo converterInfo = null;
484          Enumeration ciEnum= null;
485 
486          XInputStreamToInputStreamAdapter xis =new XInputStreamToInputStreamAdapter(xml);
487 
488 
489          XOutputStreamToOutputStreamAdapter newxos =new XOutputStreamToOutputStreamAdapter(device);
490          try{
491          ConverterInfoReader cir = new ConverterInfoReader(jarName,false);
492          ciEnum =cir.getConverterInfoEnumeration();
493          }
494          catch (ParserConfigurationException pexc){
495           System.out.println("Error:"+pexc);
496          }
497           catch ( org.xml.sax.SAXException pexc){
498           System.out.println("Error:"+pexc);
499          }
500          catch(Exception e){
501          System.out.println("Error:"+e);
502          }
503          ConverterInfoMgr. removeByJar(jarName);
504          if (convertFromOffice)
505          {
506 
507          try {
508 
509              //Check to see if jar contains a plugin Impl
510 
511                  ConverterInfoMgr.addPlugIn(ciEnum);
512              ConverterFactory cf = new ConverterFactory();
513 
514              Convert cv = cf.getConverter(ConverterInfoMgr.findConverterInfo(sdMime,offMime),false);
515              if (cv == null) {
516                  System.out.println("\nNo plug-in exists to convert from <staroffice/sxw> to <specified format> ");
517 
518              }
519              else
520              {
521                  cv.addInputStream(name,(InputStream)xis,false);
522                  ConvertData dataOut = cv.convert();
523 
524                  Enumeration docEnum = dataOut.getDocumentEnumeration();
525 
526                  if (docEnum.hasMoreElements()){
527                      Document docOut      = (Document)docEnum.nextElement();
528                      String fileName      = docOut.getFileName();
529                      docOut.write(newxos);
530 
531                      newxos.flush();
532                      newxos.close();
533 
534 
535                      int i=1;
536                      while (docEnum.hasMoreElements() && sURL.startsWith("file:")) {
537                      //URI uri=new URI(sFileName);
538                      URI uri=new URI(sURL);
539                      String  newFileName= getPath(uri);
540 
541 
542                      //System.out.println("\nURI: "+uri.getPath());
543                      File newFile=null;
544                      if (newFileName.lastIndexOf(".")!=-1){
545                          newFile =new File(newFileName.substring(0,newFileName.lastIndexOf("."))+String.valueOf(i)+newFileName.substring(newFileName.lastIndexOf(".")));
546                      }
547                      else{
548                         newFile =new File(newFileName.concat(String.valueOf(i)));
549                      }
550 
551                      FileOutputStream fos = new FileOutputStream(newFile);
552                      docOut      = (Document)docEnum.nextElement();
553                      fileName      = docOut.getFileName();
554                      docOut.write(fos);
555                      fos.flush();
556                      fos.close();
557                      i++;
558 
559                      }
560 
561                  }
562              }
563              ConverterInfoMgr.removeByJar(jarName);
564          }
565          catch (StackOverflowError sOE){
566              System.out.println("\nERROR : Stack OverFlow. \n Increase of the JRE by adding the following line to the end of the javarc file \n \"-Xss1m\"\n");
567 
568          }
569          catch (Exception e) {
570              System.out.println("Error:"+e);
571               throw new IOException("Xmerge Exception");
572              }
573          }
574          else{
575 
576          try {
577               //Check to see if jar contains a plugin Impl
578                  ConverterInfoMgr.addPlugIn(ciEnum);
579                  ConverterFactory cf = new ConverterFactory();
580              Convert cv = cf.getConverter(ConverterInfoMgr.findConverterInfo(sdMime,offMime),true);
581              if (cv == null) {
582                  System.out.println("\nNo plug-in exists to convert to <staroffice/sxw> from <specified format>");
583              }
584              else
585              {
586                              /*
587                              ByteArrayOutputStream bout = new ByteArrayOutputStream();
588                              byte[][] buf = new byte[1][4096];
589                              int n=0;
590                              while ((n=xml.readSomeBytes(buf, 4096))>0)
591                                  bout.write(buf[0], 0, n);
592                              ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
593                              cv.addInputStream(name, bin, false);
594                             */
595                  cv.addInputStream(name,(InputStream)xis,false);
596                  //System.out.println("\nConverting");
597                  ConvertData dataIn = cv.convert();
598                  //System.out.println("\nFinished Converting");
599                  Enumeration docEnum = dataIn.getDocumentEnumeration();
600                  while (docEnum.hasMoreElements()) {
601                  OfficeDocument docIn      = (OfficeDocument)docEnum.nextElement();
602 
603                  docIn.write(newxos,false);
604                  }
605                  //newxos.write(-1); //EOF character
606                                //newxos.flush();
607                  newxos.close();
608              }
609              ConverterInfoMgr.removeByJar(jarName);
610          }
611          catch (StackOverflowError sOE){
612               System.out.println("\nERROR : Stack OverFlow. \n Increase of the JRE by adding the following line to the end of the javarc file \n \"-Xss1m\"\n");
613          }
614          catch (Exception e) {
615              System.out.println("Error:"+e);
616              throw new IOException("Xmerge Exception");
617          }
618 
619 
620          }
621 
622     }
623 
624         private String getPath(URI uri){
625         String path = uri.getPath();
626         String opSys=System.getProperty("os.name");
627         if(opSys.indexOf("Windows")!=-1){
628         path= path.replace('/','\\');
629         path = path.substring(1);
630         }
631         return path;
632     }
633 
634 
635 
636 
637 
638 
639 
640         // Implement methods from interface XTypeProvider
641         public byte[] getImplementationId() {
642             byte[] byteReturn = {};
643 
644             byteReturn = new String( "" + this.hashCode() ).getBytes();
645 
646             return( byteReturn );
647         }
648 
649         // Implement method from interface XServiceName
650         public String getServiceName() {
651             return( __serviceName );
652         }
653 
654         // Implement methods from interface XServiceInfo
655         public boolean supportsService(String stringServiceName) {
656             return( stringServiceName.equals( __serviceName ) );
657         }
658 
659         public String getImplementationName() {
660             return( _XMergeBridge.class.getName() );
661         }
662 
663         public String[] getSupportedServiceNames() {
664             String[] stringSupportedServiceNames = { __serviceName };
665             return( stringSupportedServiceNames );
666         }
667     }
668 
669     /**
670      * Returns a factory for creating the service.
671      * This method is called by the <code>JavaLoader</code>
672      *
673      * @return  returns a <code>XSingleServiceFactory</code> for creating the
674      *          component
675      *
676      * @param   implName     the name of the implementation for which a
677      *                       service is desired
678      * @param   multiFactory the service manager to be used if needed
679      * @param   regKey       the registryKey
680      *
681      * @see                  com.sun.star.comp.loader.JavaLoader
682      */
683     public static XSingleServiceFactory __getServiceFactory(String implName,
684     XMultiServiceFactory multiFactory,
685     XRegistryKey regKey) {
686     xMSF= multiFactory;
687         XSingleServiceFactory xSingleServiceFactory = null;
688         if (implName.equals(_XMergeBridge.class.getName()) ) {
689             xSingleServiceFactory = FactoryHelper.getServiceFactory(_XMergeBridge.class,
690             _XMergeBridge.__serviceName,
691             multiFactory,
692             regKey);
693         }
694 
695         return xSingleServiceFactory;
696     }
697 }
698