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 getTypes()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 getFileName(String origName)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 importer(com.sun.star.beans.PropertyValue[] aSourceData, com.sun.star.xml.sax.XDocumentHandler xDocHandler, java.lang.String[] msUserData)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 exporter(com.sun.star.beans.PropertyValue[] aSourceData, java.lang.String[] msUserData)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 replace(String origString, String origChar, String replaceChar)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 needsMask(String origString)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 startDocument()376 public void startDocument () { 377 //System.out.println("\nStart Document!"); 378 } 379 endDocument()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 startElement(String str, com.sun.star.xml.sax.XAttributeList xattribs)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 endElement(String str)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 } characters(String str)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 ignorableWhitespace(String str)455 public void ignorableWhitespace(String str){ 456 457 458 } processingInstruction(String aTarget, String aData)459 public void processingInstruction(String aTarget, String aData){ 460 461 } 462 setDocumentLocator(com.sun.star.xml.sax.XLocator xLocator)463 public void setDocumentLocator(com.sun.star.xml.sax.XLocator xLocator){ 464 465 } 466 467 468 469 470 471 convert(com.sun.star.io.XInputStream xml,com.sun.star.io.XOutputStream device, boolean convertFromOffice,String pluginUrl,String FileName,String offMime,String sdMime)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 getPath(URI uri)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 getImplementationId()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 getServiceName()645 public String getServiceName() { 646 return( __serviceName ); 647 } 648 649 // Implement methods from interface XServiceInfo supportsService(String stringServiceName)650 public boolean supportsService(String stringServiceName) { 651 return( stringServiceName.equals( __serviceName ) ); 652 } 653 getImplementationName()654 public String getImplementationName() { 655 return( _XMergeBridge.class.getName() ); 656 } 657 getSupportedServiceNames()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 */ __getServiceFactory(String implName, XMultiServiceFactory multiFactory, XRegistryKey regKey)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