You are experienced Java developer. Write an example of a java code which calls a method `callShowColumns` of class `MetadataServerAPIHelper`. Here are the implementations of helper classes. 

package com.amazon.redshift.jdbc;

import com.amazon.redshift.logger.RedshiftLogger;
import com.amazon.redshift.util.RedshiftException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class MetadataServerAPIHelper extends MetadataAPIHelper {
   public MetadataServerAPIHelper(RedshiftConnectionImpl connection) {
      super(connection);
   }

   protected ResultSet getCatalogsServerAPI(String catalog) throws SQLException {
      if (RedshiftLogger.isEnable()) {
         this.connection.getLogger().logDebug("Calling Server API SHOW DATABASES");
      }

      String sql = null;
      ResultSet rs = null;
      if (catalog == null) {
         sql = "SHOW DATABASES;";
      } else {
         sql = MessageFormat.format("SHOW DATABASES LIKE ''{0}'';", catalog);
      }

      rs = this.runQuery(sql);
      if (RedshiftLogger.isEnable()) {
         this.connection.getLogger().logDebug("Successfully executed SHOW DATABASE for catalog = {0}", catalog);
      }

      return rs;
   }

   protected List<ResultSet> getSchemasServerAPI(String catalog, String schemaPattern, boolean retEmpty, boolean isSingleDatabaseMetaData) throws SQLException {
      if (RedshiftLogger.isEnable()) {
         this.connection.getLogger().logDebug("Calling Server API SHOW SCHEMAS");
      }

      List<ResultSet> intermediateRs = new ArrayList();
      if (!retEmpty) {
         Object catalogList;
         try {
            if (this.checkNameIsExactName(catalog)) {
               catalogList = new ArrayList();
               ((List)catalogList).add(catalog);
            } else {
               catalogList = this.getCatalogList(catalog, isSingleDatabaseMetaData);
            }
         } catch (Exception var9) {
            throw new RedshiftException("MetadataServerAPIHelper.getSchemasServerAPI.getCatalogList " + var9.getMessage());
         }

         if (catalogList == null) {
            throw new RedshiftException("Error when creating catalogList ... ");
         }

         Iterator var7 = ((List)catalogList).iterator();

         while(var7.hasNext()) {
            String curCatalog = (String)var7.next();
            intermediateRs.add(this.callShowSchemas(curCatalog, schemaPattern));
         }

         if (RedshiftLogger.isEnable()) {
            this.connection.getLogger().logDebug("Successfully executed SHOW SCHEMAS for catalog = {0}, schemaPattern = {1}", catalog, schemaPattern);
         }
      }

      return intermediateRs;
   }

   protected List<ResultSet> getTablesServerAPI(String catalog, String schemaPattern, String tableNamePattern, boolean retEmpty, boolean isSingleDatabaseMetaData) throws SQLException {
      if (RedshiftLogger.isEnable()) {
         this.connection.getLogger().logDebug("Calling Server API SHOW TABLES");
      }

      List<ResultSet> intermediateRs = new ArrayList();
      if (!retEmpty) {
         Object catalogList;
         try {
            if (this.checkNameIsExactName(catalog)) {
               catalogList = new ArrayList();
               ((List)catalogList).add(catalog);
            } else {
               catalogList = this.getCatalogList(catalog, isSingleDatabaseMetaData);
            }
         } catch (Exception var11) {
            throw new RedshiftException("MetadataServerAPIHelper.getTablesServerAPI.getCatalogList " + var11.getMessage());
         }

         if (catalogList == null) {
            throw new RedshiftException("Error when creating catalogList ... ");
         }

         Iterator var8 = ((List)catalogList).iterator();

         while(true) {
            while(var8.hasNext()) {
               String curCat = (String)var8.next();
               if (this.checkNameIsExactName(schemaPattern) && ((List)catalogList).size() == 1) {
                  intermediateRs.add(this.callShowTables(curCat, schemaPattern, tableNamePattern));
               } else {
                  ResultSet schemasRs = this.callShowSchemas(curCat, schemaPattern);

                  while(schemasRs.next()) {
                     intermediateRs.add(this.callShowTables(curCat, schemasRs.getString("schema_name"), tableNamePattern));
                  }
               }
            }

            if (RedshiftLogger.isEnable()) {
               this.connection.getLogger().logDebug("Successfully executed SHOW TABLES for catalog = {0}, schemaPattern = {1}, tableNamePattern = {2}", catalog, schemaPattern, tableNamePattern);
            }
            break;
         }
      }

      return intermediateRs;
   }

   protected List<ResultSet> getColumnsServerAPI(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern, boolean retEmpty, boolean isSingleDatabaseMetaData) throws SQLException {
      if (RedshiftLogger.isEnable()) {
         this.connection.getLogger().logDebug("Calling Server API SHOW COLUMNS");
      }

      List<ResultSet> intermediateRs = new ArrayList();
      if (!retEmpty) {
         Object catalogList;
         try {
            if (this.checkNameIsExactName(catalog)) {
               catalogList = new ArrayList();
               ((List)catalogList).add(catalog);
            } else {
               catalogList = this.getCatalogList(catalog, isSingleDatabaseMetaData);
            }
         } catch (Exception var13) {
            throw new RedshiftException("MetadataServerAPIHelper.getColumnsServerAPI.getCatalogList " + var13.getMessage());
         }

         if (catalogList == null) {
            throw new RedshiftException("Error when creating catalogList ... ");
         } else {
            Iterator var9 = ((List)catalogList).iterator();

            while(true) {
               while(true) {
                  label65:
                  while(var9.hasNext()) {
                     String curCat = (String)var9.next();
                     ResultSet schemasRs;
                     if (this.checkNameIsExactName(schemaPattern) && ((List)catalogList).size() == 1) {
                        if (this.checkNameIsExactName(tableNamePattern)) {
                           intermediateRs.add(this.callShowColumns(curCat, schemaPattern, tableNamePattern, columnNamePattern));
                        } else {
                           schemasRs = this.callShowTables(curCat, schemaPattern, tableNamePattern);

                           while(schemasRs.next()) {
                              intermediateRs.add(this.callShowColumns(curCat, schemaPattern, schemasRs.getString("table_name"), columnNamePattern));
                           }
                        }
                     } else {
                        schemasRs = this.callShowSchemas(curCat, schemaPattern);

                        while(true) {
                           while(true) {
                              if (!schemasRs.next()) {
                                 continue label65;
                              }

                              if (this.checkNameIsExactName(tableNamePattern)) {
                                 intermediateRs.add(this.callShowColumns(curCat, schemasRs.getString("schema_name"), tableNamePattern, columnNamePattern));
                              } else {
                                 ResultSet tablesRs = this.callShowTables(curCat, schemasRs.getString("schema_name"), tableNamePattern);

                                 while(tablesRs.next()) {
                                    intermediateRs.add(this.callShowColumns(curCat, schemasRs.getString("schema_name"), tablesRs.getString("table_name"), columnNamePattern));
                                 }
                              }
                           }
                        }
                     }
                  }

                  if (RedshiftLogger.isEnable()) {
                     this.connection.getLogger().logDebug("Successfully executed SHOW COLUMNS for catalog = {0}, schema = {1}, tableName = {2}, columnNamePattern = {3}", catalog, schemaPattern, tableNamePattern, columnNamePattern);
                  }

                  return intermediateRs;
               }
            }
         }
      } else {
         return intermediateRs;
      }
   }

   protected List<String> getCatalogList(String catalog, boolean isSingleDatabaseMetaData) throws SQLException {
      if (RedshiftLogger.isEnable()) {
         this.connection.getLogger().logDebug("Create catalog list for catalog = {0}", catalog);
      }

      String curConnectedCatalog = this.connection.getCatalog();
      List<String> catalogList = new ArrayList();
      ResultSet catalogRs = this.getCatalogsServerAPI(catalog);

      while(catalogRs.next()) {
         if (isSingleDatabaseMetaData) {
            String curCatalog = catalogRs.getString("database_name");
            if (curCatalog.equals(curConnectedCatalog)) {
               catalogList.add(curCatalog);
            }
         } else {
            catalogList.add(catalogRs.getString("database_name"));
         }
      }

      return catalogList;
   }

   protected ResultSet callShowSchemas(String catalog, String schema) throws SQLException {
      String sqlSCHEMA;
      if (this.checkNameIsNotPattern(schema)) {
         sqlSCHEMA = MessageFormat.format("SHOW SCHEMAS FROM DATABASE {0};", catalog);
      } else {
         sqlSCHEMA = MessageFormat.format("SHOW SCHEMAS FROM DATABASE {0} LIKE ''{1}'';", catalog, schema);
      }

      return this.runQuery(sqlSCHEMA);
   }

   protected ResultSet callShowTables(String catalog, String schema, String table) throws SQLException {
      String sqlTABLE;
      if (this.checkNameIsNotPattern(table)) {
         sqlTABLE = MessageFormat.format("SHOW TABLES FROM SCHEMA {0}.{1};", catalog, schema);
      } else {
         sqlTABLE = MessageFormat.format("SHOW TABLES FROM SCHEMA {0}.{1} LIKE ''{2}'';", catalog, schema, table);
      }

      return this.runQuery(sqlTABLE);
   }

   protected ResultSet callShowColumns(String catalog, String schema, String table, String column) throws SQLException {
      String sqlCOLUMN;
      if (this.checkNameIsNotPattern(column)) {
         sqlCOLUMN = MessageFormat.format("SHOW COLUMNS FROM TABLE {0}.{1}.{2};", catalog, schema, table);
      } else {
         sqlCOLUMN = MessageFormat.format("SHOW COLUMNS FROM TABLE {0}.{1}.{2} LIKE ''{3}'';", catalog, schema, table, column);
      }

      return this.runQuery(sqlCOLUMN);
   }
}