//package lu.tudor.santec.gecamed.core.gui.controller.document.writer;
//
//import java.io.BufferedReader;
//import java.io.File;
//import java.io.InputStream;
//import java.io.InputStreamReader;
//import java.io.PrintStream;
//import java.util.Random;
//
//import com.sun.star.bridge.UnoUrlResolver;
//import com.sun.star.bridge.XUnoUrlResolver;
//import com.sun.star.comp.helper.Bootstrap;
//import com.sun.star.comp.helper.BootstrapException;
//import com.sun.star.lang.XMultiComponentFactory;
//import com.sun.star.uno.UnoRuntime;
//import com.sun.star.uno.XComponentContext;
//
///**
// * @author jens.ferring(at)tudor.lu
// * 
// * @version
// * <br>$Log: OOoPipeConnector.java,v $
// */
//
//public class OOoPipeConnector
//{
//	public static XComponentContext bootstrap(File oooProgramDir) throws BootstrapException 
//	{
//		XComponentContext xContext = null;
//		
//		try
//		{
//			// create default local component context                
//			XComponentContext xLocalContext = Bootstrap.createInitialComponentContext(null);
//			if (xLocalContext == null)
//				throw new BootstrapException("no local component context!");
//			
//			// find office executable relative to this class's class loader
//			String sOffice = System.getProperty("os.name").startsWith("Windows") ?
//					"soffice.exe" : "soffice";
//			File fOffice = new File(oooProgramDir, sOffice);
//			if (!fOffice.exists())
//				throw new BootstrapException("no office executable found!");
//			
//			// create random pipe name
//			String sPipeName = "uno" +
//					Long.toString((new Random()).nextLong() & 0x7fffffffffffffffL);
//			
//			// create call with arguments
//			String[] cmdArray = new String[7];
//			cmdArray[0] = fOffice.getPath();
//			cmdArray[1] = "-nologo";
//			cmdArray[2] = "-nodefault";
//			cmdArray[3] = "-norestore";
//			cmdArray[4] = "-nocrashreport";
//			cmdArray[5] = "-nolockcheck";
//			cmdArray[6] = "-accept=pipe,name=" + sPipeName + ";urp;";
//			
//			// start office process
//			Process p = Runtime.getRuntime().exec(cmdArray);
//			pipe(p.getInputStream(), System.out, "CO> ");
//			pipe(p.getErrorStream(), System.err, "CE> ");
//			
//			// initial service manager
//			XMultiComponentFactory xLocalServiceManager =
//					xLocalContext.getServiceManager();
//			if (xLocalServiceManager == null)
//				throw new BootstrapException("no initial service manager!");
//			
//			// create a URL resolver
//			XUnoUrlResolver xUrlResolver =
//					UnoUrlResolver.create(xLocalContext);
//			
//			// connection string
//			String sConnect = "uno:pipe,name=" + sPipeName +
//					";urp;StarOffice.ComponentContext";
//			
//			// wait until office is started
//			for (int i = 0;; ++i)
//			{
//				try
//				{
//					// try to connect to office
//					Object context = xUrlResolver.resolve(sConnect);
//					xContext = UnoRuntime.queryInterface(
//							XComponentContext.class, context);
//					if (xContext == null)
//						throw new BootstrapException("no component context!");
//					break;
//				}
//				catch (com.sun.star.connection.NoConnectException ex)
//				{
//					// Wait 500 ms, then try to connect again, but do not wait
//					// longer than 5 min (= 600 * 500 ms) total:
//					if (i == 600)
//					{
//						throw new BootstrapException(ex.toString());
//					}
//					Thread.currentThread().sleep(500);
//				}
//			}
//		}
//		catch (BootstrapException e)
//		{
//			throw e;
//		}
//		catch (java.lang.RuntimeException e)
//		{
//			throw e;
//		}
//		catch (java.lang.Exception e)
//		{
//			throw new BootstrapException(e);
//		}
//		
//		return xContext;
//	}
//	
//	
//	private static void pipe (
//			final InputStream in, final PrintStream out, final String prefix)
//	{
//		
//		new Thread("Pipe: " + prefix)
//		{
//			public void run ()
//			{
//				BufferedReader r = new BufferedReader(
//						new InputStreamReader(in));
//				try
//				{
//					for (;;)
//					{
//						String s = r.readLine();
//						if (s == null)
//						{
//							break;
//						}
//						out.println(prefix + s);
//					}
//				}
//				catch (java.io.IOException e)
//				{
//					e.printStackTrace(System.err);
//				}
//			}
//		}.start();
//	}
//}
