/*! ******************************************************************************
*
* Pentaho Data Integration
*
* Copyright (C) 2002-2016 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.trans.steps.autodoc;
import java.awt.image.BufferedImage;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;
import org.jfree.ui.Drawable;
import org.pentaho.di.core.Const;
import org.pentaho.di.core.util.Utils;
import org.pentaho.di.core.RowMetaAndData;
import org.pentaho.di.core.database.Database;
import org.pentaho.di.core.database.DatabaseMeta;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.logging.LogChannel;
import org.pentaho.di.core.logging.LogChannelInterface;
import org.pentaho.di.core.logging.LogStatus;
import org.pentaho.di.core.logging.LogTableInterface;
import org.pentaho.di.core.logging.LoggingObjectInterface;
import org.pentaho.di.core.xml.XMLHandler;
import org.pentaho.di.job.JobMeta;
import org.pentaho.di.trans.TransMeta;
public class KettleFileTableModel implements TableModel {
public enum Field {
location( ReportSubjectLocation.class ), filename( String.class ), name( String.class ), description(
String.class ), extended_description( String.class ), logging( String.class ), creation( String.class ),
modification( String.class ), last_exec_result( String.class ), image( Drawable.class );
private Class<?> clazz;
private Field( Class<?> clazz ) {
this.clazz = clazz;
}
public Class<?> getClazz() {
return clazz;
}
}
private List<ReportSubjectLocation> locations;
private LoggingObjectInterface parentObject;
private LogChannelInterface log;
public KettleFileTableModel() {
}
public KettleFileTableModel( LoggingObjectInterface parentObject, List<ReportSubjectLocation> locations ) {
this.parentObject = parentObject;
this.locations = locations;
this.log = new LogChannel( "Kettle File Table Model", parentObject );
}
public void addTableModelListener( TableModelListener tableModelListener ) {
}
public Class<?> getColumnClass( int index ) {
return Field.values()[index].getClazz();
}
public int getColumnCount() {
return Field.values().length;
}
public String getColumnName( int index ) {
return Field.values()[index].name();
}
public int getRowCount() {
return locations.size();
}
public Object getValueAt( int rowIndex, int columnIndex ) {
ReportSubjectLocation location = locations.get( rowIndex );
Field field = Field.values()[columnIndex];
try {
switch ( field ) {
case location:
return location;
case filename:
return location.getFilename();
case name:
return getName( location );
case description:
return getDescription( location );
case extended_description:
return getExtendedDescription( location );
case logging:
return getLogging( location );
case creation:
return getCreation( location );
case modification:
return getModification( location );
case last_exec_result:
return getLastExecutionResult( log, parentObject, location );
case image:
return getImage( location );
default:
throw new RuntimeException( "Unhandled field type: " + field + " in function getValueAt()" );
}
} catch ( Exception e ) {
log.logError( "Unable to get data for field: " + field + " : " + e.getMessage() );
return null;
}
}
public static String getName( ReportSubjectLocation filename ) throws KettleException {
if ( filename.isTransformation() ) {
return TransformationInformation.getInstance().getTransMeta( filename ).getName();
} else {
return JobInformation.getInstance().getJobMeta( filename ).getName();
}
}
public static String getDescription( ReportSubjectLocation filename ) throws KettleException {
if ( filename.isTransformation() ) {
return TransformationInformation.getInstance().getTransMeta( filename ).getDescription();
} else {
return JobInformation.getInstance().getJobMeta( filename ).getDescription();
}
}
public static String getExtendedDescription( ReportSubjectLocation filename ) throws KettleException {
if ( filename.isTransformation() ) {
return TransformationInformation.getInstance().getTransMeta( filename ).getExtendedDescription();
} else {
return JobInformation.getInstance().getJobMeta( filename ).getExtendedDescription();
}
}
public static String getLogging( ReportSubjectLocation filename ) throws KettleException {
List<LogTableInterface> logTables;
if ( filename.isTransformation() ) {
TransMeta transMeta = TransformationInformation.getInstance().getTransMeta( filename );
logTables = transMeta.getLogTables();
} else {
JobMeta jobMeta = JobInformation.getInstance().getJobMeta( filename );
logTables = jobMeta.getLogTables();
}
String logging = "";
for ( Iterator<LogTableInterface> iterator = logTables.iterator(); iterator.hasNext(); ) {
LogTableInterface logTableInterface = iterator.next();
if ( logTableInterface.getDatabaseMeta() != null && !Utils.isEmpty( logTableInterface.getTableName() ) ) {
if ( logging.length() > 0 ) {
logging += ", ";
}
logging += logTableInterface.getTableName() + "@" + logTableInterface.getDatabaseMeta().getName();
}
}
return logging;
}
public static BufferedImage getImage( ReportSubjectLocation filename ) throws KettleException {
if ( filename.isTransformation() ) {
return TransformationInformation.getInstance().getImage( filename );
} else {
return JobInformation.getInstance().getImage( filename );
}
}
public static String getCreation( ReportSubjectLocation filename ) throws KettleException {
Date date = null;
String user = null;
if ( filename.isTransformation() ) {
date = TransformationInformation.getInstance().getTransMeta( filename ).getCreatedDate();
user = TransformationInformation.getInstance().getTransMeta( filename ).getCreatedUser();
} else {
date = JobInformation.getInstance().getJobMeta( filename ).getCreatedDate();
user = JobInformation.getInstance().getJobMeta( filename ).getCreatedUser();
}
return Const.NVL( XMLHandler.date2string( date ), "-" ) + " by " + Const.NVL( user, "-" );
}
public static String getModification( ReportSubjectLocation filename ) throws KettleException {
Date date = null;
String user = null;
if ( filename.isTransformation() ) {
date = TransformationInformation.getInstance().getTransMeta( filename ).getModifiedDate();
user = TransformationInformation.getInstance().getTransMeta( filename ).getModifiedUser();
} else {
date = JobInformation.getInstance().getJobMeta( filename ).getModifiedDate();
user = JobInformation.getInstance().getJobMeta( filename ).getModifiedUser();
}
return Const.NVL( XMLHandler.date2string( date ), "-" ) + " by " + Const.NVL( user, "-" );
}
public static String getLastExecutionResult( LogChannelInterface log, LoggingObjectInterface parentObject,
ReportSubjectLocation filename ) throws KettleException {
LogTableInterface logTable = null;
if ( filename.isTransformation() ) {
TransMeta transMeta = TransformationInformation.getInstance().getTransMeta( filename );
logTable = transMeta.getTransLogTable();
} else {
JobMeta jobMeta = JobInformation.getInstance().getJobMeta( filename );
logTable = jobMeta.getJobLogTable();
}
if ( logTable != null && logTable.isDefined() ) {
DatabaseMeta dbMeta = logTable.getDatabaseMeta();
Database database = new Database( parentObject, dbMeta );
try {
database.connect();
String sql = "SELECT ";
sql += dbMeta.quoteField( logTable.getStatusField().getFieldName() ) + ", ";
sql += dbMeta.quoteField( logTable.getLogDateField().getFieldName() ) + ", ";
sql += dbMeta.quoteField( logTable.getErrorsField().getFieldName() ) + "";
sql += " FROM ";
sql += dbMeta.getQuotedSchemaTableCombination( logTable.getSchemaName(), logTable.getTableName() );
sql += " ORDER BY " + dbMeta.quoteField( logTable.getLogDateField().getFieldName() ) + " DESC";
RowMetaAndData oneRow = database.getOneRow( sql );
String status = oneRow.getString( 0, "?" );
Date date = oneRow.getDate( 1, null );
Long nrErrors = oneRow.getInteger( 2 );
String evaluation;
if ( status.equalsIgnoreCase( LogStatus.END.getStatus() ) ) {
evaluation = "Ended";
} else if ( status.equalsIgnoreCase( LogStatus.START.getStatus() ) ) {
evaluation = "Started";
} else if ( status.equalsIgnoreCase( LogStatus.STOP.getStatus() ) ) {
evaluation = "Stopped";
} else if ( status.equalsIgnoreCase( LogStatus.RUNNING.getStatus() ) ) {
evaluation = "Running";
} else if ( status.equalsIgnoreCase( LogStatus.PAUSED.getStatus() ) ) {
evaluation = "Paused";
} else if ( status.equalsIgnoreCase( LogStatus.ERROR.getStatus() ) ) {
evaluation = "Failed";
} else {
evaluation = "Unknown";
}
if ( nrErrors > 0 ) {
evaluation += " with errors";
} else {
evaluation += " with success";
}
return evaluation + " at " + XMLHandler.date2string( date );
} catch ( Exception e ) {
log.logBasic( "Unable to get logging information from log table" + logTable );
} finally {
database.disconnect();
}
}
return null;
}
public boolean isCellEditable( int arg0, int arg1 ) {
return false;
}
public void removeTableModelListener( TableModelListener arg0 ) {
}
public void setValueAt( Object arg0, int arg1, int arg2 ) {
}
}