gt: 			String[] resultArray = new String[result.size()];
context: /*
   *  RapidMiner
   *
   *  Copyright (C) 2001-2011 by Rapid-I and the contributors
   *
   *  Complete list of developers available at our web site:
   *
   *       http://rapid-i.com
   *
   *  This program is free software: you can redistribute it and/or modify
   *  it under the terms of the GNU Affero General Public License as published by
   *  the Free Software Foundation, either version 3 of the License, or
   *  (at your option) any later version.
   *
   *  This program 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 Affero General Public License for more details.
   *
   *  You should have received a copy of the GNU Affero General Public License
   *  along with this program.  If not, see http://www.gnu.org/licenses/.
   */
  package com.rapidminer.gui;
  
  import java.awt.BorderLayout;
  import java.awt.FlowLayout;
  import java.awt.event.ActionEvent;
  import java.awt.event.ActionListener;
  import java.sql.PreparedStatement;
  import java.sql.ResultSet;
  import java.sql.ResultSetMetaData;
  import java.sql.SQLException;
  import java.util.LinkedList;
  import java.util.List;
  
  import javax.swing.JButton;
  import javax.swing.JDialog;
  import javax.swing.JLabel;
  import javax.swing.JPanel;
  import javax.swing.JScrollPane;
  import javax.swing.JTable;
  import javax.swing.table.DefaultTableModel;
  import javax.swing.table.TableModel;
  
  import com.rapidminer.ObjectVisualizer;
  import com.rapidminer.gui.tools.ExtendedJScrollPane;
  import com.rapidminer.gui.tools.ExtendedJTable;
  import com.rapidminer.gui.tools.SwingTools;
  import com.rapidminer.operator.OperatorException;
  import com.rapidminer.tools.LoggingHandler;
  import com.rapidminer.tools.Tools;
  import com.rapidminer.tools.jdbc.DatabaseHandler;
  
  /**
   * Queries the database table for the row with the requested ID
   * and creates a generic example visualizer. This visualizer simply 
   * displays the attribute values of the example. Adding this operator 
   * is might be necessary to enable the visualization of single examples 
   * in the provided plotter or graph components. In contrast to the 
   * usual example visualizer, this version does not load the complete
   * data set into memory but simply queries the information from the
   * database and just shows the single row.
   * 
   * @author Ingo Mierswa
   */
  public class DatabaseExampleVisualization implements ObjectVisualizer {
  	
  	private DatabaseHandler handler;
  	
  	private PreparedStatement statement;
  	
  	public DatabaseExampleVisualization(String databaseURL, String userName, String password, int databaseSystem, String tableName, String columnName, LoggingHandler logging) {		
  		try {
  			this.handler = DatabaseHandler.getConnectedDatabaseHandler(databaseURL, userName, password);
  
  			String query = 
  				"SELECT * FROM " + 
  				handler.getStatementCreator().makeIdentifier(tableName) + 
  				" WHERE " + 
  				handler.getStatementCreator().makeIdentifier(columnName) + 
  				" = ?";
  
  			this.statement = this.handler.createPreparedStatement(query, false);
  		} catch (OperatorException e) {
  			logging.logError("Cannot connect to database: " + e.getMessage());
  		} catch (SQLException e) {
  			logging.logError("Cannot connect to database: " + e.getMessage());
  		}
  	}
  
  	@Override
  	public void finalize() throws Throwable {
  		super.finalize();
  		
  		if (statement != null) {
  			try {
  				statement.close();
  			} catch (SQLException e) {
  				// do nothing
  			}
  		}
  		if (handler != null) {
  			try {
  				handler.disconnect();
  			} catch (SQLException e) {
  				// do nothing
  			}
  		}
  	}
  	
  	public void startVisualization(Object objId) {
  		if ((handler == null) || (statement == null))
  			return;
  		
  		try {
  			statement.setObject(1, objId);
  			ResultSet rs = statement.executeQuery();
  			
  			// show data
  			final JDialog dialog = new JDialog(RapidMinerGUI.getMainFrame(), "Example: " + objId, false);
  			dialog.getContentPane().setLayout(new BorderLayout());
  
  	        if (rs != null) {
  	        	boolean dataAvailable = rs.next();
  	        	if (dataAvailable) {
  	        		ResultSetMetaData metaData = rs.getMetaData();
  	        		String[] columnNames = new String[] { "Attribute", "Value" };
  	        		String[][] data = new String[metaData.getColumnCount()][2];
  	        		for (int c = 1; c <= data.length; c++) {
  	        			data[c - 1][0] = metaData.getColumnName(c);
  	        			Object result = rs.getObject(c);
  	        			String value = "?";
  	        			if (result != null) {
  	        				if (result instanceof Number) {
  	        					value = Tools.formatIntegerIfPossible(((Number)result).doubleValue());
  	        				} else {
  	        					value = result.toString();
  	        				}
  	        			}
  	        			data[c - 1][1] = value;
  	        		}            
  	        		JTable table = new ExtendedJTable();
  	        		table.setDefaultEditor(Object.class, null);
  	        		TableModel tableModel = new DefaultTableModel(data, columnNames);
  	        		table.setModel(tableModel);
  	        		JScrollPane scrollPane = new ExtendedJScrollPane(table);
  	        		dialog.getContentPane().add(scrollPane, BorderLayout.CENTER);
  	        	} else {
  		            JLabel noInfoLabel = new JLabel("No information available for object '" + objId + "'.");
  		            dialog.getContentPane().add(noInfoLabel, BorderLayout.CENTER);	        		
  	        	}
  	        } else {
  	            JLabel noInfoLabel = new JLabel("No information available for object '" + objId + "'.");
  	            dialog.getContentPane().add(noInfoLabel, BorderLayout.CENTER);
  	        }
  
  			JPanel buttons = new JPanel(new FlowLayout());
  			JButton okButton = new JButton("Ok");
  			okButton.addActionListener(new ActionListener() {
  				public void actionPerformed(ActionEvent e) {
  				    dialog.dispose();
  				}
  			});
  			buttons.add(okButton);
  			dialog.getContentPane().add(buttons, BorderLayout.SOUTH);
  			dialog.pack();
  			dialog.setLocationRelativeTo(RapidMinerGUI.getMainFrame());
  			dialog.setVisible(true);
  			
  			// clean up
  			if (rs != null)
  				rs.close();
  		} catch (SQLException e) {
  			SwingTools.showSimpleErrorMessage("cannot_retrieve_obj_inf", e, objId);
  		}	
  	}
  	
  	public String getDetailData(Object objId, String fieldName) { 		
  		if ((handler == null) || (statement == null))
  			return null;
  		
  		try {
  			statement.setObject(1, objId);
  			ResultSet rs = statement.executeQuery();
  			
  			String resultString = null;
  			
  	        if (rs != null) {
  	        	boolean dataAvailable = rs.next();
  	        	if (dataAvailable) {
  	        		Object result = rs.getObject(fieldName);
  	        		String value = "?";
  	        		if (result != null) {
  	        			if (result instanceof Number) {
  	        				value = Tools.formatIntegerIfPossible(((Number)result).doubleValue());
  	        			} else {
  	        				value = result.toString();
  	        			}
  	        		}
  	        		resultString = value;
  	        	}
  	        }
  	        
  	        // clean up
  			if (rs != null)
  				rs.close();
  			
  			return resultString;
  		} catch (SQLException e) {
  			return null;
  		}
  	}
  	
  	public String[] getFieldNames(Object objId) {
  		if ((handler == null) || (statement == null))
  			return new String[0];
  		
  		try {
  			statement.setObject(1, objId);
  			ResultSet rs = statement.executeQuery();
  			
  			// show data
  			List<String> result = new LinkedList<String>();
  	        if (rs != null) {
  	        	boolean dataAvailable = rs.next();
  	        	if (dataAvailable) {
  	        		ResultSetMetaData metaData = rs.getMetaData();
  	        		for (int c = 1; c <= metaData.getColumnCount(); c++) {
  	        			result.add(metaData.getColumnName(c));
  	        		}            
  	 
  	        	}
  	        }
  			
  			// clean up
  			if (rs != null)
  				rs.close();
  			
  