All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.sourceforge.squirrel_sql.client.session.action.DumpSessionCommand Maven / Gradle / Ivy

package net.sourceforge.squirrel_sql.client.session.action;
/*
 * Copyright (C) 2002 Colin Bell
 * [email protected]
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import net.sourceforge.squirrel_sql.client.session.ISession;
import net.sourceforge.squirrel_sql.fw.datasetviewer.DataSetViewerTextFileDestination;
import net.sourceforge.squirrel_sql.fw.datasetviewer.IDataSetViewer;
import net.sourceforge.squirrel_sql.fw.datasetviewer.ObjectArrayDataSet;
import net.sourceforge.squirrel_sql.fw.sql.ISQLConnection;
import net.sourceforge.squirrel_sql.fw.sql.SQLDatabaseMetaData;
import net.sourceforge.squirrel_sql.fw.util.ICommand;
import net.sourceforge.squirrel_sql.fw.util.IMessageHandler;
import net.sourceforge.squirrel_sql.fw.util.log.ILogger;
import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
import net.sourceforge.squirrel_sql.fw.xml.XMLBeanWriter;
import net.sourceforge.squirrel_sql.fw.xml.XMLException;

/**
 * This ICommand will dump the status of a session to a text
 * file.
 *
 * @author  Colin Bell
 */
public class DumpSessionCommand implements ICommand
{
	/** Logger for this class. */
	private final ILogger s_log =
		LoggerController.createLogger(DumpSessionCommand.class);

	/** Prefix for temp file names. */
	private static final String PREFIX = "dump";

	/** Suffix for temp file names. */
	private static final String SUFFIX = "tmp";

	/** Used to separate lines of data in the dump file. */
	private static String SEP = "===================================================";

	/** Session to be dumped. */
	private ISession _session;

	/** File to dump session to. */
	private File _outFile;

	/** Message handler to write errors to. */
	private IMessageHandler _msgHandler;

	/**
	 * Default ctor.
	 */
	public DumpSessionCommand()
	{
		this(null, null);
	}

	/**
	 * Ctor using sessions message handler for errors.
	 *
	 * @param	outFile		File to dump session to.
	 */
	public DumpSessionCommand(File outFile)
	{
		this(outFile, null);
	}

	/**
	 * Ctor.
	 *
	 * @param	outFile		File to dump session to.
	 * @param	msgHandler	Message handler. If null then the sessions
	 * 						message handler will be used for errors.
	 */
	public DumpSessionCommand(File outFile, IMessageHandler msgHandler)
	{
		super();
		_outFile = outFile;
		_msgHandler = msgHandler;
	}

	/**
	 * Set the file to dump to.
	 *
	 * @param	file	File to dump to.
	 * 
	 * @throws	IllegalArgumentException
	 *			Thrown if a null ISession or File passed.
	 */
	public void setDumpFile(File file)
	{
		if (file == null)
		{
			throw new IllegalArgumentException("Null Dump File passed");
		}
		_outFile = file;
	}

	/**
	 * Set the session to dump.
	 *
	 * @param	session	Session to be dumped.
	 * 
	 * @throws	IllegalArgumentException
	 *			Thrown if a null ISession or File passed.
	 */
	public void setSession(ISession session)
	{
		if (session == null)
		{
			throw new IllegalArgumentException("Null ISession passed");
		}
		_session = session;
	}

	/**
	 * Dump the session.
	 */
	public void execute()
	{
		if (_session == null)
		{
			throw new IllegalStateException("Trying to dump null session");
		}
		if (_outFile == null)
		{
			throw new IllegalStateException("Trying to dump session to null file");
		}

		final List files = new ArrayList();
		final List titles = new ArrayList();
		synchronized (_session)
		{
			final ISQLConnection conn = _session.getSQLConnection();
			final SQLDatabaseMetaData md = conn.getSQLMetaData();

			// Dump session properties.
			try
			{
				files.add(createJavaBeanDumpFile(_session.getProperties()));
				titles.add("Session Properties");
			}
			catch (Throwable th)
			{
				final String msg = "Error dumping driver info";
				showErrorMessage(msg);
				showErrorMessage(th);
				s_log.error(msg, th);
			}
	
			// Dump driver information.
			try
			{
				files.add(createJavaBeanDumpFile(_session.getDriver()));
				titles.add("Driver");
			}
			catch (Throwable th)
			{
				final String msg = "Error dumping driver info";
                showErrorMessage(msg);
                showErrorMessage(th);
				s_log.error(msg, th);
			}
	
			// Dump alias information.
			try
			{
				files.add(createJavaBeanDumpFile(_session.getAlias()));
				titles.add("Alias");
			}
			catch (Throwable th)
			{
				final String msg = "Error dumping alias info";
				showErrorMessage(msg);
				showErrorMessage(th);
				s_log.error(msg, th);
			}
	
			// Dump general connection info.
			try
			{
				files.add(createGeneralConnectionDumpFile(conn));
				titles.add("Connection - General");
			}
			catch (Throwable th)
			{
				final String msg = "Error dumping general connection info";
				showErrorMessage(msg);
				showErrorMessage(th);
				s_log.error(msg, th);
			}
	
			// Dump meta data.
			try
			{
				File tempFile = File.createTempFile(PREFIX, SUFFIX);
				IDataSetViewer dest = new DataSetViewerTextFileDestination(tempFile);
				dest.show(conn.getSQLMetaData().getMetaDataSet());
				files.add(tempFile);
				titles.add("Metadata");
			}
			catch (Throwable th)
			{
				final String msg = "Error dumping metadata";
				showErrorMessage(msg);
				showErrorMessage(th);
				s_log.error(msg, th);
			}
	
			// Dump catalogs.
			try
			{
				File tempFile = File.createTempFile(PREFIX, SUFFIX);
				IDataSetViewer dest = new DataSetViewerTextFileDestination(tempFile);
				dest.show(new ObjectArrayDataSet(md.getCatalogs()));
				files.add(tempFile);
				titles.add("Catalogs");
			}
			catch (Throwable th)
			{
				final String msg = "Error dumping catalogs";
				showErrorMessage(msg);
				showErrorMessage(th);
				s_log.error(msg, th);
			}
	
			// Dump schemas.
			try
			{
				File tempFile = File.createTempFile(PREFIX, SUFFIX);
				IDataSetViewer dest = new DataSetViewerTextFileDestination(tempFile);
				dest.show(new ObjectArrayDataSet(_session.getSchemaInfo().getSchemas()));
				files.add(tempFile);
				titles.add("Schemas");
			}
			catch (Throwable th)
			{
				final String msg = "Error dumping schemas";
				showErrorMessage(msg);
				showErrorMessage(th);
				s_log.error(msg, th);
			}
	
			// Dump data types.
			try
			{
				File tempFile = File.createTempFile(PREFIX, SUFFIX);
				IDataSetViewer dest = new DataSetViewerTextFileDestination(tempFile);
				dest.show(conn.getSQLMetaData().getTypesDataSet());
				files.add(tempFile);
				titles.add("Data Types");
			}
			catch (Throwable th)
			{
				final String msg = "Error dumping data types";
				showErrorMessage(msg);
				showErrorMessage(th);
				s_log.error(msg, th);
			}
	
			// Dump table types.
			try
			{
				File tempFile = File.createTempFile(PREFIX, SUFFIX);
				IDataSetViewer dest = new DataSetViewerTextFileDestination(tempFile);
				dest.show(new ObjectArrayDataSet(md.getTableTypes()));
				files.add(tempFile);
				titles.add("Table Types");
			}
			catch (Throwable th)
			{
				final String msg = "Error dumping table types";
				showErrorMessage(msg);
				showErrorMessage(th);
				s_log.error(msg, th);
			}
		}

		combineTempFiles(titles, files);
		deleteTempFiles(files);
	}

	private void combineTempFiles(List titles, List files)
	{
		try
		{
			PrintWriter wtr = new PrintWriter(new FileWriter(_outFile));
			try
			{
				wtr.println("SQuirreL SQL Client Session Dump " +
								Calendar.getInstance().getTime());
				for (int i = 0, limit = files.size(); i < limit; ++i)
				{
					wtr.println();
					wtr.println();
					wtr.println(SEP);
					wtr.println(titles.get(i));
					wtr.println(SEP);
					File file = files.get(i);
					BufferedReader rdr = new BufferedReader(new FileReader(file));
					try
					{
						String line = null;
						while((line = rdr.readLine()) != null)
						{
							wtr.println(line);
						}
					}
					finally
					{
						rdr.close();
					}
				}
			}
			finally
			{
				wtr.close();
			}
		}
		catch (IOException ex)
		{
			final String msg = "Error combining temp files into dump file";
			showErrorMessage(msg);
			showErrorMessage(ex);
			s_log.error(msg, ex);
		}
	}

	private void deleteTempFiles(List files)
	{
		for (int i = 0, limit = files.size(); i < limit; ++i)
		{
			if (!(files.get(i)).delete())
			{
				s_log.error("Couldn't delete temporary DumpSession file");
			}
		}
	}

	private File createJavaBeanDumpFile(Object obj)
		throws IOException, XMLException
	{
		File tempFile = File.createTempFile(PREFIX, SUFFIX);
		XMLBeanWriter wtr = new XMLBeanWriter(obj);
		wtr.save(tempFile);

		return tempFile;
	}

	private File createGeneralConnectionDumpFile(ISQLConnection conn)
		throws IOException
	{
		Connection myConn = conn.getConnection();
	
		File tempFile = File.createTempFile(PREFIX, SUFFIX);
		PrintWriter wtr = new PrintWriter(new FileWriter(tempFile));
		try
		{
			// Dump general connection info.
			String line = null;
			try
			{
				line = String.valueOf(myConn.getTransactionIsolation());
			}
			catch (Throwable th)
			{
				line = th.toString();
			}
			wtr.println("transIsolation: " + line);
			try
			{
				line = String.valueOf(myConn.isReadOnly());
			}
			catch (Throwable th)
			{
				line = th.toString();
			}
			wtr.println("readonly: " + line);

			return tempFile;
		}
		finally
		{
			wtr.close();
		}
	}
    
    private void showErrorMessage(String msg) {
        if (_session != null) {
            _session.showErrorMessage(msg);
        } else if (_msgHandler != null) {
            _msgHandler.showErrorMessage(msg);
        } else {
            s_log.error("No IMessageHandler or ISession configured");
        }        
    }
    
    private void showErrorMessage(Throwable th) {
        if (_session != null) {
            _session.showErrorMessage(th);
        } else if (_msgHandler != null) {
            _msgHandler.showErrorMessage(th, null);
        } else {
            s_log.error("No IMessageHandler or ISession configured");
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy