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. |