/**
   * Process
   *
   * @return info
   * @throws Exception
   */
  protected String doIt() throws Exception {
    if (p_target_AD_Table_ID == 0)
      throw new AdempiereSystemError("@NotFound@ @AD_Table_ID@ " + p_target_AD_Table_ID);
    if (p_source_AD_Table_ID == 0)
      throw new AdempiereSystemError("@NotFound@ @AD_Table_ID@ " + p_source_AD_Table_ID);
    if (log.isLoggable(Level.INFO))
      log.info(
          "Source AD_Table_ID="
              + p_source_AD_Table_ID
              + ", Target AD_Table_ID="
              + p_target_AD_Table_ID);

    MTable targetTable = new MTable(getCtx(), p_target_AD_Table_ID, get_TrxName());
    MColumn[] targetColumns = targetTable.getColumns(true);
    if (targetColumns.length > 0)
      // TODO: dictionary message
      throw new AdempiereSystemError("Target table must not have columns");

    MTable sourceTable = new MTable(getCtx(), p_source_AD_Table_ID, get_TrxName());
    MColumn[] sourceColumns = sourceTable.getColumns(true);

    for (int i = 0; i < sourceColumns.length; i++) {
      MColumn colTarget = new MColumn(targetTable);
      PO.copyValues(sourceColumns[i], colTarget);
      colTarget.setAD_Table_ID(targetTable.getAD_Table_ID());
      colTarget.setEntityType(targetTable.getEntityType());
      // special case the key -> sourceTable_ID
      if (sourceColumns[i].getColumnName().equals(sourceTable.getTableName() + "_ID")) {
        String targetColumnName = new String(targetTable.getTableName() + "_ID");
        colTarget.setColumnName(targetColumnName);
        // if the element doesn't exist, create it
        M_Element element = M_Element.get(getCtx(), targetColumnName);
        if (element == null) {
          element =
              new M_Element(getCtx(), targetColumnName, targetTable.getEntityType(), get_TrxName());
          if (targetColumnName.equalsIgnoreCase(targetTable.getTableName() + "_ID")) {
            element.setColumnName(targetTable.getTableName() + "_ID");
            element.setName(targetTable.getName());
            element.setPrintName(targetTable.getName());
          }
          element.saveEx(get_TrxName());
        }
        colTarget.setAD_Element_ID(element.getAD_Element_ID());
        colTarget.setName(targetTable.getName());
        colTarget.setDescription(targetTable.getDescription());
        colTarget.setHelp(targetTable.getHelp());
      }
      // special case the UUID column -> sourceTable_UU
      if (sourceColumns[i].getColumnName().equals(sourceTable.getTableName() + "_UU")) {
        String targetColumnName = new String(targetTable.getTableName() + "_UU");
        colTarget.setColumnName(targetColumnName);
        // if the element doesn't exist, create it
        M_Element element = M_Element.get(getCtx(), targetColumnName);
        if (element == null) {
          element =
              new M_Element(getCtx(), targetColumnName, targetTable.getEntityType(), get_TrxName());
          if (targetColumnName.equalsIgnoreCase(targetTable.getTableName() + "_UU")) {
            element.setColumnName(targetTable.getTableName() + "_UU");
            element.setName(targetTable.getTableName() + "_UU");
            element.setPrintName(targetTable.getTableName() + "_UU");
          }
          element.saveEx(get_TrxName());
        }
        colTarget.setAD_Element_ID(element.getAD_Element_ID());
        colTarget.setName(targetTable.getName());
        colTarget.setDescription(targetTable.getDescription());
        colTarget.setHelp(targetTable.getHelp());
      }
      colTarget.setIsActive(sourceColumns[i].isActive());
      colTarget.saveEx(get_TrxName());
      // TODO: Copy translations
      m_count++;
    }

    //
    return "#" + m_count;
  } //	doIt