//package lu.tudor.santec.gecamed.core.gui.controller.document.writer;
//
//import java.awt.BorderLayout;
//import java.io.BufferedReader;
//import java.io.File;
//import java.io.IOException;
//import java.io.InputStream;
//import java.io.InputStreamReader;
//import java.io.PrintStream;
//import java.util.LinkedList;
//import java.util.concurrent.TimeUnit;
//
//import javax.swing.JLabel;
//
//import lu.tudor.santec.gecamed.core.gui.MainFrame;
//import lu.tudor.santec.gecamed.core.gui.widgets.GECAMedBaseDialogImpl;
//import lu.tudor.santec.gecamed.core.utils.GECAMedUtils;
//
//import org.apache.log4j.Logger;
//
//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.connection.NoConnectException;
//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: OOoConnector.java,v $
// */
//
//public class OOoSocketConnector extends Thread
//{
//	
//	private static final String SHUTDOWNHOOK_KEY	= "OOoServerShutdownHook";
//
//	private static final String CONNECTION_STRING	= "uno:socket,host=localhost,port=[PORT];urp;StarOffice.ComponentContext";
//	
//	private static final String ACCEPTION_STRING	= "-accept=socket,host=localhost,port=[PORT];urp;";
//
//	
//	
//	/** the logger Object for this class */
//	private static Logger logger = Logger.getLogger(OOoSocketConnector.class.getName());
//
//	private static OOoSocketConnector instance;
//	
//	private static OOoConnectionDialog connectionDialog;
//	
//	private static int port = 8100;
//	
//	private static LinkedList<Process>	oooProcesses	= new LinkedList<Process>();
//	
//	private static LinkedList<Thread>	pipeTheads		= new LinkedList<Thread>();
//	
//	private static boolean endEverything = false;
//	
//	private Thread shutdownHook;
//	
//	private String[] runCommand = new String[]
//			{
//				null,
//				"-nologo",
//				"-nodefault",
//				"-norestore",
//				"-nocrashreport",
//				"-nolockcheck",
//				null
//			};
//	
//	
//	private OOoSocketConnector ()
//	{
//		shutdownHook = new Thread()
//		{
//			@Override
//			public void run ()
//			{
//				disconnect();
//			}
//		};
//	}
//	
//	
//	public void setOOoProgramPath (String oooProgramPath)
//	{
//		File sOfficeExe	= new File (oooProgramPath + File.separator + 
//				(GECAMedUtils.getOS() == GECAMedUtils.OS_WINDOWS ? "soffice.exe" : "soffice"));
//		
//		if (!sOfficeExe.exists())
//			throw new RuntimeException("Office executable found file not found: " + sOfficeExe.getAbsolutePath());
//		
//		runCommand[0]	= sOfficeExe.getAbsolutePath();
//	}
//	
//	
//	private boolean tryToConnect;
//	public XComponentContext connect () throws Exception 
//	{
//		endEverything = false;
//		tryToConnect = true;
//		new Thread("Start OOo server")
//		{
//			public void run() 
//			{
//				startServer();
//			}
//		}.start();
//		
//		// connect with the server
//		XComponentContext		xLocalContext			= Bootstrap.createInitialComponentContext(null);
//        XMultiComponentFactory	xLocalServiceManager	= xLocalContext.getServiceManager();
//        if (xLocalServiceManager == null)
//            throw new BootstrapException("no initial service manager!");
//        
//        // wait for sOffice to start
//        XUnoUrlResolver		xUrlResolver	= UnoUrlResolver.create(xLocalContext);
//        XComponentContext	xContext		= null;
//        Object				context;
//        
//        try
//        {
//	        showConnectionDialog();
//	        String connectionString;
//			for (int i = 0; tryToConnect && xContext == null; i++)
//			{
//				try
//				{
//					connectionString = CONNECTION_STRING.replace("[PORT]", String.valueOf(port));
//					context = xUrlResolver.resolve(connectionString);
//					logger.info("Trying to connect to OpenOffice with connection string:\n" + connectionString);
//					xContext = (XComponentContext) UnoRuntime.queryInterface(XComponentContext.class, context);
//					if (xContext == null)
//					{
//						throw new BootstrapException("no component context!");
//					}
//				}
//				catch (NoConnectException ex)
//				{
//					if (i >= 240)
//					{
//						throw new BootstrapException(ex.toString());
//					}
//					Thread.sleep(500);
//				}
//			}
//			
//			return xContext;
//        }
//        finally
//        {
//        	closeConnectionDialog();
//        }
//	}
//	
//	
//	private void startServer ()
//	{
//		// start the server
//		try
//		{
//			runCommand[runCommand.length - 1] = ACCEPTION_STRING.replace("[PORT]", String.valueOf(port));
//			Process oooProcess = Runtime.getRuntime().exec(runCommand);
//			
//			oooProcesses.add(oooProcess);
//			
//			logger.info("OpenOffice service started with command:\n" + GECAMedUtils.print(runCommand, ", ", true));
//			MainFrame.addShutdownHook(SHUTDOWNHOOK_KEY, shutdownHook);
//			
//			pipe(oooProcess.getInputStream(), System.out, "CI: ");
//			pipe(oooProcess.getErrorStream(), System.err, "CE: ");
//			
//			try
//			{
//				if (oooProcess.waitFor(15, TimeUnit.SECONDS))
//				{
//					int processExitCode = oooProcess.exitValue();
//					logger.warn("OOo server ended with exit code " + processExitCode);
//					
//					oooProcesses.remove(oooProcess);
//					
////					if (tryToConnect && processExitCode == 1)
////					{
////						port++;
////						logger.info("Trying to restart the server on another port (" + port + ")");
////						startServer();
////					}
//				}
//				else
//				{
//					logger.info("OpenOffice server seems to run fine. Stopped waiting.");
//				}
//			}
//			catch (Exception e)
//			{
//				logger.error("Waiting for OOo server ended with an exception", e);
//			}
//		}
//		catch (IOException e)
//		{
//			logger.error("Error while starting the OpenOffice instance to listen for our requests.", e);
//		}
//		finally
//		{
//			closeConnectionDialog();
//		}
//	}
//	
//	
//	public void disconnect ()
//	{
//		endEverything = true;
//		
//		closeConnectionDialog();
//		
//		Process p;
//		while (!oooProcesses.isEmpty())
//		{
//			p	= oooProcesses.poll();
//			if (p.isAlive())
//				p.destroy();
//		}
//		
//		Thread t;
//		while (!pipeTheads.isEmpty())
//		{
//			t	= pipeTheads.poll();
//			if (t.isAlive())
//				t.interrupt();
//		}
//	}
//	
//	
//	private static void pipe (final InputStream in, final PrintStream out, final String prefix)
//	{
//		Thread t = new Thread("Pipe: " + prefix)
//		{
//			@Override
//			public void run ()
//			{
//				BufferedReader r = new BufferedReader(new InputStreamReader(in));
//				try
//				{
//					for (;;)
//					{
//						String s = r.readLine();
//						if (endEverything || s == null)
//							break;
//						
//						out.println(prefix + s);
//						logger.info(prefix + s);
//					}
//				}
//				catch (java.io.IOException e)
//				{
//					logger.error("Error reading the process output ("+prefix+").", e);
//				}
//				finally
//				{
//					pipeTheads.remove(this);
//				}
//			}
//		};
//		pipeTheads.add(t);
//		t.start();
//	}
//
//	
//	public static OOoSocketConnector getInstance (String oooProgramPath)
//	{
//		if (instance == null)
//			instance = new OOoSocketConnector();
//		
//		if (oooProgramPath != null)
//			instance.setOOoProgramPath(oooProgramPath);
//		return instance;
//	}
//	
//	
//	private void showConnectionDialog()
//	{
//		if (connectionDialog == null)
//			connectionDialog = new OOoConnectionDialog();
//		
//		if (connectionDialog.isVisible())
//			return;
//		
//		connectionDialog.showDialog();
//	}
//	
//	
//	private static void closeConnectionDialog ()
//	{
//		if (connectionDialog == null)
//			return;
//		
//		connectionDialog.setVisible(false);
//	}
//	
//	
//	private class OOoConnectionDialog extends GECAMedBaseDialogImpl
//	{
//		private static final long	serialVersionUID	= 1L;
//
//
//		public OOoConnectionDialog ()
//		{
//			super(MainFrame.getInstance(), "Connection to OpenOffice", OK_BUTTON_MODE);
//			
//			JLabel message = new JLabel("<html>Trying to connect to OpenOffice.<br>Press cancel, to end.</html>");
//			
//			mainPanel.setLayout(new BorderLayout());
//			mainPanel.add(message, BorderLayout.CENTER);
//			
//			okButton.setText(cancelButton.getText());
//		}
//		
//		
//		public void showDialog ()
//		{
//			new Thread("Show OOo ConnectionDialog")
//			{
//				@Override
//				public void run ()
//				{
//					pack();
//					setLocationRelativeTo(getOwner());
//					setVisible(true);
//				}
//			}.start();
//		}
//		
//		
//		@Override
//		public void okActionCalled ()
//		{
//			// this is actually the "cancel" action
//			tryToConnect = false;
//			super.okActionCalled();
//		}
//		
//		
//		@Override
//		public void closeActionCalled ()
//		{
//			tryToConnect = false;
//			super.closeActionCalled();
//		}
//	}
//}
