/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ /** You can find more * information on the following web page: * http://api.openoffice.org/common/ref/com/sun/star/index.html */ /*Java Uno Helper Classes*/ import com.sun.star.lib.uno.adapter.XInputStreamToInputStreamAdapter; import com.sun.star.lib.uno.adapter.XOutputStreamToOutputStreamAdapter; /*StarOffice/Uno Classes*/ import com.sun.star.lang.XMultiServiceFactory; import com.sun.star.lang.XServiceInfo; import com.sun.star.lang.XTypeProvider; import com.sun.star.uno.Type; import com.sun.star.uno.UnoRuntime; import com.sun.star.comp.loader.FactoryHelper; import com.sun.star.lang.XServiceName; import com.sun.star.lang.XSingleServiceFactory; import com.sun.star.registry.XRegistryKey; import com.sun.star.frame.XConfigManager; import com.sun.star.xml.sax.InputSource; import com.sun.star.xml.sax.XParser; import com.sun.star.io.XInputStream; import com.sun.star.io.XOutputStream; import com.sun.star.xml.sax.XDocumentHandler; import com.sun.star.uno.AnyConverter; /* Generated from Idls */ import com.sun.star.xml.XImportFilter; import com.sun.star.xml.XExportFilter; /* XMerge Classes */ import org.openoffice.xmerge.util.registry.ConverterInfoReader; import org.openoffice.xmerge.util.registry.ConverterInfo; import org.openoffice.xmerge.util.registry.ConverterInfoMgr; import org.openoffice.xmerge.Convert; import org.openoffice.xmerge.ConverterFactory; import org.openoffice.xmerge.Document; import org.openoffice.xmerge.ConvertData; import org.openoffice.xmerge.converter.xml.OfficeDocument; /*Java Classes*/ import java.util.Enumeration; import java.io.*; import javax.xml.parsers.*; import java.net.URI; /** This outer class provides an inner class to implement the service * description and a method to instantiate the * component on demand (__getServiceFactory()). */ public class XMergeBridge { private static XMultiServiceFactory xMSF; private static XDocumentHandler exportDocHandler=null; private static XInputStream xInStream =null; private static XOutputStream xOutStream=null; private static String udJarPath=null; private static XOutputStream xos = null; private static XOutputStreamToOutputStreamAdapter adaptedStream=null; private static String offMime=null; private static String sdMime=null; private static String sFileName=null; private static String sURL=""; //private static FileOutputStream adaptedStream =null; /** This inner class provides the component as a concrete implementation * of the service description. It implements the needed interfaces. * @implements XTypeProvider */ static public class _XMergeBridge implements XImportFilter, XExportFilter, XServiceName, XServiceInfo, XDocumentHandler, XTypeProvider { /** The component will be registered under this name. */ static private final String __serviceName = "com.sun.star.documentconversion.XMergeBridge"; public com.sun.star.uno.Type[] getTypes() { Type[] typeReturn = {}; try { typeReturn = new Type[] { new Type( XTypeProvider.class ), new Type( XImportFilter.class ), new Type( XExportFilter.class ), new Type( XServiceName.class ), new Type( XServiceInfo.class ) }; } catch( Exception exception ) { } return( typeReturn ); } String getFileName(String origName) { String name=null; if (origName !=null) { if(origName.equalsIgnoreCase("")) name = "OutFile"; else { if (origName.lastIndexOf("/")>=0){ origName=origName.substring(origName.lastIndexOf("/")+1,origName.length()); } if (origName.lastIndexOf(".")>=0){ name = origName.substring(0,(origName.lastIndexOf("."))); } else{ name=origName; } } } else{ name = "OutFile"; } return name; } public boolean importer(com.sun.star.beans.PropertyValue[] aSourceData, com.sun.star.xml.sax.XDocumentHandler xDocHandler, java.lang.String[] msUserData) throws com.sun.star.uno.RuntimeException { /* System.out.println("\nFound the Importer!\n"); System.out.println("\n"+msUserData[0]); System.out.println("\n"+msUserData[1]); System.out.println("\n"+msUserData[2]); System.out.println("\n"+msUserData[3]); System.out.println("\n"+msUserData[4]); System.out.println("\n"+msUserData[5]); */ sFileName=""; sURL=""; String sDirectory = null; String udConvertClass=msUserData[0]; udJarPath=msUserData[1]; String udImport =msUserData[2]; String udExport =msUserData[3]; offMime =msUserData[4]; sdMime = msUserData[5]; com.sun.star.io.XInputStream xis=null; com.sun.star.beans.PropertyValue[] pValue = aSourceData; for (int i = 0 ; i < pValue.length; i++) { //System.out.println("\n"+pValue[i].Name+" "+pValue[i].Value; try{ //System.out.println("\n"+pValue[i].Name+" "+pValue[i].Value); if (pValue[i].Name.compareTo("InputStream")==0){ xis=(com.sun.star.io.XInputStream)AnyConverter.toObject(new Type(com.sun.star.io.XInputStream.class), pValue[i].Value); } if (pValue[i].Name.compareTo("FileName")==0){ sFileName=(String)AnyConverter.toObject(new Type(java.lang.String.class), pValue[i].Value); } } catch(com.sun.star.lang.IllegalArgumentException AnyExec){ System.out.println("\nIllegalArgumentException "+AnyExec); } } try{ Object xCfgMgrObj=xMSF.createInstance("com.sun.star.config.SpecialConfigManager"); XConfigManager xCfgMgr = (XConfigManager) UnoRuntime.queryInterface( XConfigManager.class , xCfgMgrObj ); String PathString=xCfgMgr.substituteVariables("$(progurl)" ); PathString= PathString.concat("/"); udJarPath= PathString.concat(udJarPath); Object xPipeObj=xMSF.createInstance("com.sun.star.io.Pipe"); xInStream = (XInputStream) UnoRuntime.queryInterface( XInputStream.class , xPipeObj ); xOutStream = (XOutputStream) UnoRuntime.queryInterface( XOutputStream.class , xPipeObj ); convert (xis,xOutStream,false,udJarPath,sFileName,offMime,sdMime); Object xSaxParserObj=xMSF.createInstance("com.sun.star.xml.sax.Parser"); XParser xParser = (XParser) UnoRuntime.queryInterface( XParser.class , xSaxParserObj ); if (xParser==null){ System.out.println("\nParser creation Failed"); } xOutStream.closeOutput(); InputSource aInput = new InputSource(); if (sFileName==null){ sFileName=""; } aInput.sSystemId = sFileName; aInput.aInputStream =xInStream; xParser.setDocumentHandler ( xDocHandler ); xParser.parseStream ( aInput ); xOutStream.closeOutput(); xInStream.closeInput(); } catch (IOException e){ //System.out.println("XMergeBridge IO Exception "+e.getMessage()); return false; } catch (Exception e){ //System.out.println("XMergeBridge Exception "+e+" "+e.getMessage()); return false; } return true; } public boolean exporter(com.sun.star.beans.PropertyValue[] aSourceData, java.lang.String[] msUserData) throws com.sun.star.uno.RuntimeException{ /* System.out.println("\nFound the Exporter!\n"); System.out.println("\n"+msUserData[0]); System.out.println("\n"+msUserData[1]); System.out.println("\n"+msUserData[2]); System.out.println("\n"+msUserData[3]); System.out.println("\n"+msUserData[4]); System.out.println("\n"+msUserData[5]); */ sFileName=null; sURL=null; String sDirectory = null; String title=null; String udConvertClass=msUserData[0]; udJarPath=msUserData[1]; String udImport =msUserData[2]; String udExport =msUserData[3]; offMime =msUserData[4]; sdMime = msUserData[5]; com.sun.star.beans.PropertyValue[] pValue = aSourceData; for (int i = 0 ; i < pValue.length; i++) { //System.out.println("\n"+pValue[i].Name+" "+pValue[i].Value); try{ //System.out.println("\n"+pValue[i].Name+" "+pValue[i].Value); if (pValue[i].Name.compareTo("OutputStream")==0){ xos=(com.sun.star.io.XOutputStream)AnyConverter.toObject(new Type(com.sun.star.io.XOutputStream.class), pValue[i].Value); // System.out.println(pValue[i].Name+" "+xos); } if (pValue[i].Name.compareTo("FileName")==0){ sFileName=(String)AnyConverter.toObject(new Type(java.lang.String.class), pValue[i].Value); //System.out.println(pValue[i].Name+" "+sFileName); } if (pValue[i].Name.compareTo("URL")==0){ sURL=(String)AnyConverter.toObject(new Type(java.lang.String.class), pValue[i].Value); // System.out.println("\nMediaDescriptor url "+pValue[i].Name+" "+sURL); } if (pValue[i].Name.compareTo("Title")==0){ title=(String)AnyConverter.toObject(new Type(java.lang.String.class), pValue[i].Value); //System.out.println(pValue[i].Name+" "+title); } } catch(com.sun.star.lang.IllegalArgumentException AnyExec){ System.out.println("\nIllegalArgumentException "+AnyExec); } } if (sURL==null){ sURL=""; } try{ Object xCfgMgrObj=xMSF.createInstance("com.sun.star.config.SpecialConfigManager"); XConfigManager xCfgMgr = (XConfigManager) UnoRuntime.queryInterface( XConfigManager.class , xCfgMgrObj ); String PathString=xCfgMgr.substituteVariables("$(progurl)" ); PathString= PathString.concat("/"); udJarPath= PathString.concat(udJarPath); Object xPipeObj=xMSF.createInstance("com.sun.star.io.Pipe"); xInStream = (XInputStream) UnoRuntime.queryInterface( XInputStream.class , xPipeObj ); xOutStream = (XOutputStream) UnoRuntime.queryInterface( XOutputStream.class , xPipeObj ); } catch (Exception e){ System.out.println("Exception "+e); return false; } return true; } public String replace(String origString, String origChar, String replaceChar){ String tmp=""; int index=origString.indexOf(origChar); if(index !=-1){ while (index !=-1){ String first =origString.substring(0,index); first=first.concat(replaceChar); tmp=tmp.concat(first); origString=origString.substring(index+1,origString.length()); index=origString.indexOf(origChar); if(index==-1) { tmp=tmp.concat(origString); } } } return tmp; } public String needsMask(String origString){ if (origString.indexOf("&")!=-1){ origString=replace(origString,"&","&"); } if (origString.indexOf("\"")!=-1){ origString=replace(origString,"\"","""); } if (origString.indexOf("<")!=-1){ origString=replace(origString,"<","<"); } if (origString.indexOf(">")!=-1){ origString=replace(origString,">",">"); } return origString; } public void startDocument () { //System.out.println("\nStart Document!"); } public void endDocument()throws com.sun.star.uno.RuntimeException { try{ xOutStream.closeOutput(); convert (xInStream,xos,true,udJarPath,sURL,offMime,sdMime); } catch (IOException e){ //System.out.println("Exception "+e); throw new com.sun.star.uno.RuntimeException(e.getMessage()); } catch (Exception e){ //System.out.println("Exception "+e); throw new com.sun.star.uno.RuntimeException("Xmerge Exception"); } } public void startElement (String str, com.sun.star.xml.sax.XAttributeList xattribs) { str="<".concat(str); if (xattribs !=null) { str= str.concat(" "); int len=xattribs.getLength(); for (short i=0;i"); // System.out.println(str); try{ xOutStream.writeBytes(str.getBytes("UTF-8")); } catch (Exception e){ System.out.println("\n"+e); } } public void endElement(String str){ str=""); try{ xOutStream.writeBytes(str.getBytes("UTF-8")); } catch (Exception e){ System.out.println("\n"+e); } } public void characters(String str){ str=needsMask(str); try{ xOutStream.writeBytes(str.getBytes("UTF-8")); } catch (Exception e){ System.out.println("\n"+e); } } public void ignorableWhitespace(String str){ } public void processingInstruction(String aTarget, String aData){ } public void setDocumentLocator(com.sun.star.xml.sax.XLocator xLocator){ } public void convert (com.sun.star.io.XInputStream xml,com.sun.star.io.XOutputStream device, boolean convertFromOffice,String pluginUrl,String FileName,String offMime,String sdMime) throws com.sun.star.uno.RuntimeException, IOException { String jarName = pluginUrl; String name= getFileName(FileName); ConverterInfo converterInfo = null; Enumeration ciEnum= null; XInputStreamToInputStreamAdapter xis =new XInputStreamToInputStreamAdapter(xml); XOutputStreamToOutputStreamAdapter newxos =new XOutputStreamToOutputStreamAdapter(device); try{ ConverterInfoReader cir = new ConverterInfoReader(jarName,false); ciEnum =cir.getConverterInfoEnumeration(); } catch (ParserConfigurationException pexc){ System.out.println("Error:"+pexc); } catch ( org.xml.sax.SAXException pexc){ System.out.println("Error:"+pexc); } catch(Exception e){ System.out.println("Error:"+e); } ConverterInfoMgr. removeByJar(jarName); if (convertFromOffice) { try { //Check to see if jar contains a plugin Impl ConverterInfoMgr.addPlugIn(ciEnum); ConverterFactory cf = new ConverterFactory(); Convert cv = cf.getConverter(ConverterInfoMgr.findConverterInfo(sdMime,offMime),false); if (cv == null) { System.out.println("\nNo plug-in exists to convert from to "); } else { cv.addInputStream(name,(InputStream)xis,false); ConvertData dataOut = cv.convert(); Enumeration docEnum = dataOut.getDocumentEnumeration(); if (docEnum.hasMoreElements()){ Document docOut = (Document)docEnum.nextElement(); String fileName = docOut.getFileName(); docOut.write(newxos); newxos.flush(); newxos.close(); int i=1; while (docEnum.hasMoreElements() && sURL.startsWith("file:")) { //URI uri=new URI(sFileName); URI uri=new URI(sURL); String newFileName= getPath(uri); //System.out.println("\nURI: "+uri.getPath()); File newFile=null; if (newFileName.lastIndexOf(".")!=-1){ newFile =new File(newFileName.substring(0,newFileName.lastIndexOf("."))+String.valueOf(i)+newFileName.substring(newFileName.lastIndexOf("."))); } else{ newFile =new File(newFileName.concat(String.valueOf(i))); } FileOutputStream fos = new FileOutputStream(newFile); docOut = (Document)docEnum.nextElement(); fileName = docOut.getFileName(); docOut.write(fos); fos.flush(); fos.close(); i++; } } } ConverterInfoMgr.removeByJar(jarName); } catch (StackOverflowError sOE){ 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"); } catch (Exception e) { System.out.println("Error:"+e); throw new IOException("Xmerge Exception"); } } else{ try { //Check to see if jar contains a plugin Impl ConverterInfoMgr.addPlugIn(ciEnum); ConverterFactory cf = new ConverterFactory(); Convert cv = cf.getConverter(ConverterInfoMgr.findConverterInfo(sdMime,offMime),true); if (cv == null) { System.out.println("\nNo plug-in exists to convert to from "); } else { /* ByteArrayOutputStream bout = new ByteArrayOutputStream(); byte[][] buf = new byte[1][4096]; int n=0; while ((n=xml.readSomeBytes(buf, 4096))>0) bout.write(buf[0], 0, n); ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray()); cv.addInputStream(name, bin, false); */ cv.addInputStream(name,(InputStream)xis,false); //System.out.println("\nConverting"); ConvertData dataIn = cv.convert(); //System.out.println("\nFinished Converting"); Enumeration docEnum = dataIn.getDocumentEnumeration(); while (docEnum.hasMoreElements()) { OfficeDocument docIn = (OfficeDocument)docEnum.nextElement(); docIn.write(newxos,false); } //newxos.write(-1); //EOF character //newxos.flush(); newxos.close(); } ConverterInfoMgr.removeByJar(jarName); } catch (StackOverflowError sOE){ 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"); } catch (Exception e) { System.out.println("Error:"+e); throw new IOException("Xmerge Exception"); } } } private String getPath(URI uri){ String path = uri.getPath(); String opSys=System.getProperty("os.name"); if(opSys.indexOf("Windows")!=-1){ path= path.replace('/','\\'); path = path.substring(1); } return path; } // Implement methods from interface XTypeProvider public byte[] getImplementationId() { byte[] byteReturn = {}; byteReturn = new String( "" + this.hashCode() ).getBytes(); return( byteReturn ); } // Implement method from interface XServiceName public String getServiceName() { return( __serviceName ); } // Implement methods from interface XServiceInfo public boolean supportsService(String stringServiceName) { return( stringServiceName.equals( __serviceName ) ); } public String getImplementationName() { return( _XMergeBridge.class.getName() ); } public String[] getSupportedServiceNames() { String[] stringSupportedServiceNames = { __serviceName }; return( stringSupportedServiceNames ); } } /** * Returns a factory for creating the service. * This method is called by the JavaLoader * * @return returns a XSingleServiceFactory for creating the * component * * @param implName the name of the implementation for which a * service is desired * @param multiFactory the service manager to be used if needed * @param regKey the registryKey * * @see com.sun.star.comp.loader.JavaLoader */ public static XSingleServiceFactory __getServiceFactory(String implName, XMultiServiceFactory multiFactory, XRegistryKey regKey) { xMSF= multiFactory; XSingleServiceFactory xSingleServiceFactory = null; if (implName.equals(_XMergeBridge.class.getName()) ) { xSingleServiceFactory = FactoryHelper.getServiceFactory(_XMergeBridge.class, _XMergeBridge.__serviceName, multiFactory, regKey); } return xSingleServiceFactory; } }