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,"&","&"); 361 } 362 if (origString.indexOf("\"")!=-1){ 363 origString=replace(origString,"\"","""); 364 } 365 if (origString.indexOf("<")!=-1){ 366 origString=replace(origString,"<","<"); 367 } 368 if (origString.indexOf(">")!=-1){ 369 origString=replace(origString,">",">"); 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