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