| 
      
      
      From: <mwl...@us...> - 2010-01-04 17:30:23
      
     | 
| Revision: 1004
          http://cishell.svn.sourceforge.net/cishell/?rev=1004&view=rev
Author:   mwlinnem
Date:     2010-01-04 17:30:10 +0000 (Mon, 04 Jan 2010)
Log Message:
-----------
Modified to show a text file with a databases schema when a user chooses to "View" a database.
Modified Paths:
--------------
    trunk/clients/gui/org.cishell.reference.gui.persistence/META-INF/MANIFEST.MF
    trunk/clients/gui/org.cishell.reference.gui.persistence/src/org/cishell/reference/gui/persistence/view/FileView.java
    trunk/clients/gui/org.cishell.reference.gui.persistence/src/org/cishell/reference/gui/persistence/view/core/FileViewer.java
    trunk/clients/gui/org.cishell.reference.gui.persistence/src/org/cishell/reference/gui/persistence/viewwith/FileViewWith.java
Added Paths:
-----------
    trunk/clients/gui/org.cishell.reference.gui.persistence/src/org/cishell/reference/gui/persistence/view/core/DatabaseSchemaOverviewGenerator.java
Modified: trunk/clients/gui/org.cishell.reference.gui.persistence/META-INF/MANIFEST.MF
===================================================================
--- trunk/clients/gui/org.cishell.reference.gui.persistence/META-INF/MANIFEST.MF	2010-01-04 17:29:08 UTC (rev 1003)
+++ trunk/clients/gui/org.cishell.reference.gui.persistence/META-INF/MANIFEST.MF	2010-01-04 17:30:10 UTC (rev 1004)
@@ -12,6 +12,7 @@
  org.cishell.reference.service.conversion,
  org.cishell.reference.service.metatype,
  org.cishell.service.conversion;version="1.0.0",
+ org.cishell.service.database,
  org.cishell.service.guibuilder;version="1.0.0",
  org.cishell.utilities,
  org.osgi.framework;version="1.3.0",
@@ -24,4 +25,4 @@
 Service-Component: OSGI-INF/load.xml, OSGI-INF/save.xml, OSGI-INF/view.xml, OSGI-INF/viewwith.xml
 Require-Bundle: org.eclipse.swt,
  org.eclipse.ui
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
Modified: trunk/clients/gui/org.cishell.reference.gui.persistence/src/org/cishell/reference/gui/persistence/view/FileView.java
===================================================================
--- trunk/clients/gui/org.cishell.reference.gui.persistence/src/org/cishell/reference/gui/persistence/view/FileView.java	2010-01-04 17:29:08 UTC (rev 1003)
+++ trunk/clients/gui/org.cishell.reference.gui.persistence/src/org/cishell/reference/gui/persistence/view/FileView.java	2010-01-04 17:30:10 UTC (rev 1004)
@@ -33,7 +33,8 @@
 			try {
 				FileViewer.viewDataFile(this.dataToView[ii],
 										this.ciShellContext,
-										this.conversionManager);
+										this.conversionManager,
+										this.logger);
 			} catch (FileViewingException fileViewingException) {
 				String logMessage =
     				"Error: Unable to view data \"" +
Added: trunk/clients/gui/org.cishell.reference.gui.persistence/src/org/cishell/reference/gui/persistence/view/core/DatabaseSchemaOverviewGenerator.java
===================================================================
--- trunk/clients/gui/org.cishell.reference.gui.persistence/src/org/cishell/reference/gui/persistence/view/core/DatabaseSchemaOverviewGenerator.java	                        (rev 0)
+++ trunk/clients/gui/org.cishell.reference.gui.persistence/src/org/cishell/reference/gui/persistence/view/core/DatabaseSchemaOverviewGenerator.java	2010-01-04 17:30:10 UTC (rev 1004)
@@ -0,0 +1,129 @@
+package org.cishell.reference.gui.persistence.view.core;
+
+import java.io.File;
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.cishell.service.database.Database;
+import org.cishell.utilities.FileUtilities;
+
+public class DatabaseSchemaOverviewGenerator {
+
+	private static final String newLine = System.getProperty("line.separator");
+
+	public static File generateDatabaseSchemaOverview(Database db) throws Exception {
+
+		// Setup
+
+		Connection dbConnection = db.getConnection();
+		String applicationSchemaName = db.getApplicationSchemaName();
+
+		StringBuffer dbOverview = new StringBuffer();
+
+		// Generating text
+
+		String headerText = getHeaderText();
+		dbOverview.append(headerText);
+		List<String> tableNames = getTableNames(dbConnection, applicationSchemaName);
+		for (String tableName : tableNames) {
+
+			String tableSchemaText = getTableSchemaAsText(dbConnection, tableName,
+					applicationSchemaName);
+			String foreignKeyReferencesText = getForeignKeyReferencesAsText(dbConnection,
+					tableName, applicationSchemaName);
+
+			dbOverview.append(tableSchemaText);
+			dbOverview.append(foreignKeyReferencesText);
+			dbOverview.append(newLine);
+		}
+
+		// Returning text as file
+
+		File dbOverviewFile = FileUtilities.writeTextIntoTemporaryDirectory(dbOverview.toString(),
+				"txt");
+		return dbOverviewFile;
+	}
+
+	private static String getHeaderText() {
+		StringBuffer headerText = new StringBuffer();
+
+		headerText.append("Database Tables:" + newLine);
+		headerText.append("********************" + newLine);
+		headerText.append(newLine);
+		headerText.append(newLine);
+
+		return headerText.toString();
+	}
+
+	// write the table's name, and the names and types of all the columns in
+	// that table
+	private static String getTableSchemaAsText(Connection dbConnection, String tableName,
+			String applicationSchemaName) throws SQLException {
+
+		StringBuffer tableSchemaAsText = new StringBuffer();
+		tableSchemaAsText.append(tableName + " (");
+
+		ResultSet columns = dbConnection.getMetaData().getColumns(null, applicationSchemaName,
+				tableName, null);
+		while (columns.next()) {
+			String columnName = columns.getString("COLUMN_NAME");
+			String columnType = columns.getString("TYPE_NAME");
+
+			tableSchemaAsText.append(" " + columnName + " " + columnType + ",");
+		}
+		tableSchemaAsText.deleteCharAt(tableSchemaAsText.length() - 1); // (delete
+																		// final
+																		// comma)
+		tableSchemaAsText.append(")" + newLine);
+
+		return tableSchemaAsText.toString();
+	}
+
+	// write which foreign keys in the table reference which other tables
+	private static String getForeignKeyReferencesAsText(Connection dbConnection, String tableName,
+			String applicationSchemaName) throws SQLException {
+		StringBuffer foreignKeyReferencesAsText = new StringBuffer();
+
+		ResultSet foreignKeys = dbConnection.getMetaData().getImportedKeys(null,
+				applicationSchemaName, tableName);
+		while (foreignKeys.next()) {
+			String foreignKey = foreignKeys.getString("FKCOLUMN_NAME");
+			String referencedTable = foreignKeys.getString("PKTABLE_NAME");
+			String referencedTableKey = foreignKeys.getString("PKCOLUMN_NAME");
+
+			foreignKeyReferencesAsText.append("    " + foreignKey + " -----> " + referencedTable
+					+ "." + referencedTableKey);
+			foreignKeyReferencesAsText.append(newLine);
+		}
+		return foreignKeyReferencesAsText.toString();
+	}
+
+	// ---UTIL--
+
+	private static List<String> getTableNames(Connection dbConnection, String defaultSchemaName)
+			throws SQLException {
+		DatabaseMetaData dbMetadata = dbConnection.getMetaData();
+		ResultSet allTableNames = dbMetadata.getTables(null, defaultSchemaName, null, null);
+
+		// Names of tables that are not system tables.
+		List<String> nonSystemTableNames = new ArrayList<String>();
+		while (allTableNames.next()) {
+			String schemaName = allTableNames.getString("TABLE_SCHEM");
+			if (isNonSystemSchemaName(schemaName, defaultSchemaName)) {
+				String tableName = allTableNames.getString("TABLE_NAME");
+				nonSystemTableNames.add(tableName);
+			}
+		}
+
+		return nonSystemTableNames;
+	}
+
+	private static boolean isNonSystemSchemaName(String tableSchemaName, String defaultSchemaName) {
+		return tableSchemaName.indexOf(defaultSchemaName) != -1;
+	}
+}
\ No newline at end of file
Modified: trunk/clients/gui/org.cishell.reference.gui.persistence/src/org/cishell/reference/gui/persistence/view/core/FileViewer.java
===================================================================
--- trunk/clients/gui/org.cishell.reference.gui.persistence/src/org/cishell/reference/gui/persistence/view/core/FileViewer.java	2010-01-04 17:29:08 UTC (rev 1003)
+++ trunk/clients/gui/org.cishell.reference.gui.persistence/src/org/cishell/reference/gui/persistence/view/core/FileViewer.java	2010-01-04 17:30:10 UTC (rev 1004)
@@ -14,6 +14,7 @@
 import org.cishell.service.conversion.ConversionException;
 import org.cishell.service.conversion.Converter;
 import org.cishell.service.conversion.DataConversionService;
+import org.cishell.service.database.Database;
 import org.cishell.utilities.FileCopyingException;
 import org.cishell.utilities.FileUtilities;
 import org.eclipse.swt.program.Program;
@@ -32,35 +33,57 @@
 	public static final String CSV_MIME_TYPE = "file:text/csv";
 	public static final String TEMPORARY_CSV_FILE_NAME = "xxx-Session-";
 	public static final String CSV_FILE_EXTENSION = "csv";
+	public static final String TXT_FILE_EXTENSION = "txt";
 	public static final String ANY_FILE_FORMAT_PATTERN =
 		"(file:.*)|(file-ext:.*)";
 	
 	public static void viewDataFile(Data data,
 									CIShellContext ciShellContext,
-									DataConversionService conversionManager)
+									DataConversionService conversionManager,
+									LogService logger)
 			throws FileViewingException {
-		viewDataFileWithProgram(data, "", ciShellContext, conversionManager);
+		viewDataFileWithProgram(data, "", ciShellContext, conversionManager, logger);
 	}
 	
 	public static void viewDataFileWithProgram(
 			Data data,
 			String customFileExtension,
 			CIShellContext ciShellContext,
-			DataConversionService converterManager)
+			DataConversionService converterManager,
+			LogService logger)
 			throws FileViewingException {
 		FileWithExtension fileWithExtension =
-			convertDataForViewing(data, ciShellContext, converterManager);
+			convertDataForViewing(data, ciShellContext, converterManager,
+					logger);
 		viewFileWithExtension(fileWithExtension, customFileExtension);
 	}
 	
 	private static FileWithExtension convertDataForViewing(
 			Data data,
 			CIShellContext ciShellContext,
-			DataConversionService converterManager)
-			throws FileViewingException {
+			DataConversionService converterManager,
+			LogService logger) throws FileViewingException {
 		try {
 			String dataFormat = data.getFormat();
 			//TODO: Add image viewing support here (shouldn't be too hard)
+			if (dataIsDB(data, converterManager)) {
+				try {
+				Data genericDBData = converterManager.convert(data, Database.GENERIC_DB_MIME_TYPE);
+				Database genericDatabase = (Database) genericDBData.getData();
+				
+				File dbSchemaOverview = 
+					DatabaseSchemaOverviewGenerator.generateDatabaseSchemaOverview(genericDatabase);
+				
+				return new FileWithExtension(dbSchemaOverview, TXT_FILE_EXTENSION);
+				} catch (ConversionException e) {
+					//continue attempts to view for other formats
+				} catch (Exception e) {
+					String message = "Unexpected error occurred while generating "
+						+ "database schema overview. Attempting to view the data item"
+						+ "by other means.";
+					logger.log(LogService.LOG_WARNING, message, e);
+				}
+			}
 			if (isCSVFormat(data)) {
 				/*
 				 * The data is already a CSV file, so it just needs to
@@ -97,7 +120,7 @@
 				 *  text-viewing program.
 				 */
 				return new FileWithExtension(
-					prepareTextFileForViewing(data), "txt");
+					prepareTextFileForViewing(data), TXT_FILE_EXTENSION);
 			} else if (convertersExist(
 				data, ANY_FILE_EXTENSION_FILTER, converterManager)) {
 				/*
@@ -176,6 +199,21 @@
 		}
 	}
 	
+	private static boolean dataIsDB (
+			Data data,
+			DataConversionService converterManager) {
+		if (has_DB_MimeType_Prefix(data) ||
+				convertersExist(data, Database.GENERIC_DB_MIME_TYPE, converterManager)) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+	
+	private static boolean has_DB_MimeType_Prefix(Data data) {
+		return data.getFormat().startsWith(Database.DB_MIME_TYPE_PREFIX);
+	}
+	
 	private static boolean dataIsFile(Data data, String dataFormat) {
 		if (data.getData() instanceof File ||
 				dataFormat.startsWith(ANY_MIME_TYPE) ||
Modified: trunk/clients/gui/org.cishell.reference.gui.persistence/src/org/cishell/reference/gui/persistence/viewwith/FileViewWith.java
===================================================================
--- trunk/clients/gui/org.cishell.reference.gui.persistence/src/org/cishell/reference/gui/persistence/viewwith/FileViewWith.java	2010-01-04 17:29:08 UTC (rev 1003)
+++ trunk/clients/gui/org.cishell.reference.gui.persistence/src/org/cishell/reference/gui/persistence/viewwith/FileViewWith.java	2010-01-04 17:30:10 UTC (rev 1004)
@@ -41,7 +41,8 @@
 					this.dataToView[ii],
 					viewWithType,
 					this.ciShellContext,
-					this.conversionManager);
+					this.conversionManager,
+					this.logger);
     		} catch (FileViewingException fileViewingException) {
     			String logMessage =
     				"Error: Unable to view data \"" +
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 |