content: package com.alibaba.datax.plugin.writer.adswriter.insert;
  
  import com.alibaba.datax.common.exception.DataXException;
  import com.alibaba.datax.common.util.Configuration;
  import com.alibaba.datax.common.util.ListUtil;
  import com.alibaba.datax.plugin.rdbms.util.DBUtilErrorCode;
  import com.alibaba.datax.plugin.writer.adswriter.AdsException;
  import com.alibaba.datax.plugin.writer.adswriter.AdsWriterErrorCode;
  import com.alibaba.datax.plugin.writer.adswriter.ads.ColumnInfo;
  import com.alibaba.datax.plugin.writer.adswriter.ads.TableInfo;
  import com.alibaba.datax.plugin.writer.adswriter.load.AdsHelper;
  import com.alibaba.datax.plugin.writer.adswriter.util.AdsUtil;
  import com.alibaba.datax.plugin.writer.adswriter.util.Constant;
  import com.alibaba.datax.plugin.writer.adswriter.util.Key;
  
  import org.apache.commons.lang3.StringUtils;
  import org.apache.commons.lang3.tuple.ImmutablePair;
  import org.apache.commons.lang3.tuple.Pair;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
  import java.util.ArrayList;
  import java.util.HashMap;
  import java.util.List;
  import java.util.Map;
  
  
  public class AdsInsertUtil {
  
      private static final Logger LOG = LoggerFactory
              .getLogger(AdsInsertUtil.class);
  
      public static TableInfo getAdsTableInfo(Configuration conf) {
          AdsHelper adsHelper = AdsUtil.createAdsHelper(conf);
          TableInfo tableInfo= null;
          try {
              tableInfo = adsHelper.getTableInfo(conf.getString(Key.ADS_TABLE));
          } catch (AdsException e) {
              throw DataXException.asDataXException(AdsWriterErrorCode.GET_ADS_TABLE_MEATA_FAILED, e);
          }
          return tableInfo;
      }
  
      /*
       * 返回列顺序为ads建表列顺序
       * */
      public static List<String> getAdsTableColumnNames(Configuration conf) {
          List<String> tableColumns = new ArrayList<String>();
          AdsHelper adsHelper = AdsUtil.createAdsHelper(conf);
          TableInfo tableInfo= null;
          String adsTable = conf.getString(Key.ADS_TABLE);
          try {
              tableInfo = adsHelper.getTableInfo(adsTable);
          } catch (AdsException e) {
              throw DataXException.asDataXException(AdsWriterErrorCode.GET_ADS_TABLE_MEATA_FAILED, e);
          }
  
          List<ColumnInfo> columnInfos = tableInfo.getColumns();
          for(ColumnInfo columnInfo: columnInfos) {
              tableColumns.add(columnInfo.getName());
          }
  
          LOG.info("table:[{}] all columns:[\n{}\n].", adsTable, StringUtils.join(tableColumns, ","));
          return tableColumns;
      }
  
      public static Map<String, Pair<Integer,String>> getColumnMetaData
              (Configuration configuration, List<String> userColumns) {
          Map<String, Pair<Integer,String>> columnMetaData = new HashMap<String, Pair<Integer,String>>();
          List<ColumnInfo> columnInfoList = getAdsTableColumns(configuration);
          for(String column : userColumns) {
              if (column.startsWith(Constant.ADS_QUOTE_CHARACTER) && column.endsWith(Constant.ADS_QUOTE_CHARACTER)) {
                  column = column.substring(1, column.length() - 1);
              }
              for (ColumnInfo columnInfo : columnInfoList) {
                  if(column.equalsIgnoreCase(columnInfo.getName())) {
                      Pair<Integer,String> eachPair = new ImmutablePair<Integer, String>(columnInfo.getDataType().sqlType, columnInfo.getDataType().name);
                      columnMetaData.put(columnInfo.getName(), eachPair);
                  }
              }
          }
          return columnMetaData;
      }
      
      public static Map<String, Pair<Integer,String>> getColumnMetaData(TableInfo tableInfo, List<String> userColumns){
          Map<String, Pair<Integer,String>> columnMetaData = new HashMap<String, Pair<Integer,String>>();
          List<ColumnInfo> columnInfoList = tableInfo.getColumns();
          for(String column : userColumns) {
              if (column.startsWith(Constant.ADS_QUOTE_CHARACTER) && column.endsWith(Constant.ADS_QUOTE_CHARACTER)) {
                  column = column.substring(1, column.length() - 1);
              }
              for (ColumnInfo columnInfo : columnInfoList) {
                  if(column.equalsIgnoreCase(columnInfo.getName())) {
                      Pair<Integer,String> eachPair = new ImmutablePair<Integer, String>(columnInfo.getDataType().sqlType, columnInfo.getDataType().name);
                      columnMetaData.put(columnInfo.getName(), eachPair);
                  }
              }
          }
          return columnMetaData;
      }
  
      /*
       * 返回列顺序为ads建表列顺序
       * */
      public static List<ColumnInfo> getAdsTableColumns(Configuration conf) {
          AdsHelper adsHelper = AdsUtil.createAdsHelper(conf);
          TableInfo tableInfo= null;
          String adsTable = conf.getString(Key.ADS_TABLE);
          try {
              tableInfo = adsHelper.getTableInfo(adsTable);
          } catch (AdsException e) {
              throw DataXException.asDataXException(AdsWriterErrorCode.GET_ADS_TABLE_MEATA_FAILED, e);
          }
  
          List<ColumnInfo> columnInfos = tableInfo.getColumns();
  
          return columnInfos;
      }
  
      public static void dealColumnConf(Configuration originalConfig, List<String> tableColumns) {
          List<String> userConfiguredColumns = originalConfig.getList(Key.COLUMN, String.class);
          if (null == userConfiguredColumns || userConfiguredColumns.isEmpty()) {
              throw DataXException.asDataXException(DBUtilErrorCode.ILLEGAL_VALUE,
                      "您的配置文件中的列配置信息有误. 因为您未配置写入数据库表的列名称，DataX获取不到列信息. 请检查您的配置并作出修改.");
          } else {
              if (1 == userConfiguredColumns.size() && "*".equals(userConfiguredColumns.get(0))) {
                  LOG.warn("您的配置文件中的列配置信息存在风险. 因为您配置的写入数据库表的列为*，当您的表字段个数、类型有变动时，可能影响任务正确性甚至会运行出错。请检查您的配置并作出修改.");
  
                  // 回填其值，需要以 String 的方式转交后续处理
                  originalConfig.set(Key.COLUMN, tableColumns);
              } else if (userConfiguredColumns.size() > tableColumns.size()) {
                  throw DataXException.asDataXException(DBUtilErrorCode.ILLEGAL_VALUE,
                          String.format("您的配置文件中的列配置信息有误. 因为您所配置的写入数据库表的字段个数:%s 大于目的表的总字段总个数:%s. 请检查您的配置并作出修改.",
                                  userConfiguredColumns.size(), tableColumns.size()));
              } else {
                  // 确保用户配置的 column 不重复
                  ListUtil.makeSureNoValueDuplicate(userConfiguredColumns, false);
                  // 检查列是否都为数据库表中正确的列（通过执行一次 select column from table 进行判断）
                  // ListUtil.makeSureBInA(tableColumns, userConfiguredColumns, true);
                  // 支持关键字和保留字, ads列是不区分大小写的
                  List<String> removeQuotedColumns = new ArrayList<String>();
                  for (String each : userConfiguredColumns) {
                      if (each.startsWith(Constant.ADS_QUOTE_CHARACTER) && each.endsWith(Constant.ADS_QUOTE_CHARACTER)) {
                          removeQuotedColumns.add(each.substring(1, each.length() - 1));
                      } else {
                          removeQuotedColumns.add(each);
                      }
                  }
                  ListUtil.makeSureBInA(tableColumns, removeQuotedColumns, false);
              }
          }
      }
  }
  