/*! ****************************************************************************** * * Pentaho Data Integration * * Copyright (C) 2002-2013 by Pentaho : http://www.pentaho.com * ******************************************************************************* * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ******************************************************************************/ package org.pentaho.di.core.database; import org.pentaho.di.core.Const; import org.pentaho.di.core.exception.KettleDatabaseException; import org.pentaho.di.core.exception.KettleException; import org.pentaho.di.core.logging.LoggingObjectInterface; import org.pentaho.di.core.logging.LoggingObjectType; import org.pentaho.di.core.logging.SimpleLoggingObject; import org.pentaho.di.i18n.BaseMessages; /** * * @author matt * */ public class DatabaseFactory implements DatabaseFactoryInterface { private static Class<?> PKG = Database.class; // for i18n purposes, needed by Translator2!! public static final LoggingObjectInterface loggingObject = new SimpleLoggingObject( "Database factory", LoggingObjectType.GENERAL, null ); public DatabaseFactory() { } @Override public String getConnectionTestReport( DatabaseMeta databaseMeta ) throws KettleDatabaseException { if ( databaseMeta.getAccessType() != DatabaseMeta.TYPE_ACCESS_PLUGIN ) { StringBuilder report = new StringBuilder(); Database db = new Database( loggingObject, databaseMeta ); if ( databaseMeta.isPartitioned() ) { PartitionDatabaseMeta[] partitioningInformation = databaseMeta.getPartitioningInformation(); for ( int i = 0; i < partitioningInformation.length; i++ ) { try { db.connect( partitioningInformation[i].getPartitionId() ); report.append( BaseMessages.getString( PKG, "DatabaseMeta.report.ConnectionWithPartOk", databaseMeta .getName(), partitioningInformation[i].getPartitionId() ) + Const.CR ); } catch ( KettleException e ) { report.append( BaseMessages.getString( PKG, "DatabaseMeta.report.ConnectionWithPartError", databaseMeta.getName(), partitioningInformation[i].getPartitionId(), e.toString() ) + Const.CR ); report.append( Const.getStackTracker( e ) + Const.CR ); } finally { db.disconnect(); } appendConnectionInfo( report, db.environmentSubstitute( partitioningInformation[i].getHostname() ), db .environmentSubstitute( partitioningInformation[i].getPort() ), db .environmentSubstitute( partitioningInformation[i].getDatabaseName() ) ); report.append( Const.CR ); } } else { try { db.connect(); report.append( BaseMessages.getString( PKG, "DatabaseMeta.report.ConnectionOk", databaseMeta.getName() ) + Const.CR ); } catch ( KettleException e ) { report.append( BaseMessages.getString( PKG, "DatabaseMeta.report.ConnectionError", databaseMeta .getName() ) + e.toString() + Const.CR ); report.append( Const.getStackTracker( e ) + Const.CR ); } finally { db.disconnect(); } if ( databaseMeta.getAccessType() == DatabaseMeta.TYPE_ACCESS_JNDI ) { appendJndiConnectionInfo( report, db.environmentSubstitute( databaseMeta.getDatabaseName() ) ); } else { appendConnectionInfo( report, db, databaseMeta ); } report.append( Const.CR ); } return report.toString(); } else { return BaseMessages.getString( PKG, "BaseDatabaseMeta.TestConnectionReportNotImplemented.Message" ); } } private StringBuilder appendJndiConnectionInfo( StringBuilder report, String jndiName ) { report.append( BaseMessages.getString( PKG, "DatabaseMeta.report.JndiName" ) ).append( jndiName ).append( Const.CR ); return report; } private StringBuilder appendConnectionInfo( StringBuilder report, Database db, DatabaseMeta databaseMeta ) { // Check to see if the interface is of a type GenericDatabaseMeta, since it does not have hostname and port fields if ( databaseMeta.getDatabaseInterface() instanceof GenericDatabaseMeta ) { String customUrl = databaseMeta.getAttributes().getProperty( GenericDatabaseMeta.ATRRIBUTE_CUSTOM_URL ); String customDriverClass = databaseMeta.getAttributes().getProperty( GenericDatabaseMeta.ATRRIBUTE_CUSTOM_DRIVER_CLASS ); return report.append( BaseMessages.getString( PKG, "GenericDatabaseMeta.report.customUrl" ) ).append( db.environmentSubstitute( customUrl ) ).append( Const.CR ).append( BaseMessages.getString( PKG, "GenericDatabaseMeta.report.customDriverClass" ) ).append( db.environmentSubstitute( customDriverClass ) ).append( Const.CR ); } return appendConnectionInfo( report, db.environmentSubstitute( databaseMeta.getHostname() ), db .environmentSubstitute( databaseMeta.getDatabasePortNumberString() ), db .environmentSubstitute( databaseMeta.getDatabaseName() ) ); } //CHECKSTYLE:LineLength:OFF private StringBuilder appendConnectionInfo( StringBuilder report, String hostName, String portNumber, String dbName ) { report.append( BaseMessages.getString( PKG, "DatabaseMeta.report.Hostname" ) ).append( hostName ).append( Const.CR ); report.append( BaseMessages.getString( PKG, "DatabaseMeta.report.Port" ) ).append( portNumber ).append( Const.CR ); report.append( BaseMessages.getString( PKG, "DatabaseMeta.report.DatabaseName" ) ).append( dbName ).append( Const.CR ); return report; } }