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