private void createColumns() {
    // Create columns if necessary
    final GeneAssociationTag[] tags = GeneAssociationTag.values();
    int index = 0;
    for (GeneAssociationTag tag : tags) {
      index++;
      // Special cases: handled in the last part
      if (tag == GeneAssociationTag.GO_ID
          || tag == GeneAssociationTag.EVIDENCE
          || tag == GeneAssociationTag.DB_REFERENCE
          || tag == GeneAssociationTag.ASPECT) continue;

      final String tagString = tag.toString();
      if (table.getColumn(tagString) == null) {
        if (LIST_INDEX.contains(index)) {
          table.createListColumn(tagString, String.class, false);
        } else {
          table.createColumn(tagString, String.class, false);
        }
      }
    }

    // Create one column per namespace
    for (String name : NAMESPACE_MAP.keySet()) {
      table.createListColumn(NAMESPACE_MAP.get(name), String.class, false);
      table.createListColumn(NAMESPACE_MAP.get(name) + EVIDENCE_SUFFIX, String.class, false);
      table.createListColumn(NAMESPACE_MAP.get(name) + REFERENCE_SUFFIX, String.class, false);
    }

    // Consolidated entry name list
    table.createListColumn(SYNONYM_COL_NAME, String.class, true);
  }
  private void mapEntry(final String[] entries) {
    // Set primary key for the table, which is DB Object ID
    final String primaryKeyValue = entries[DB_OBJ_ID];

    final CyRow row = table.getRow(primaryKeyValue);
    row.set(CyNetwork.NAME, primaryKeyValue);

    // Check namespace
    final String namespace = NAMESPACE_MAP.get(entries[ASPECT]);

    for (int i = 0; i < EXPECTED_COL_COUNT; i++) {
      final GeneAssociationTag tag = GeneAssociationTag.values()[i];

      switch (tag) {

          // Evidence code and GO ID should be organized by namespace.
        case GO_ID:
          String goidString = entries[i];
          if (this.termIDList != null) goidString = convertToName(goidString);

          List<String> currentList = row.getList(namespace, String.class);
          if (currentList == null) currentList = new ArrayList<String>();

          if (currentList.contains(goidString) == false) currentList.add(goidString);
          row.set(namespace, currentList);
          break;

        case EVIDENCE:
        case DB_REFERENCE:
          final String value = entries[i];
          String columnName = namespace;
          if (tag == GeneAssociationTag.EVIDENCE) columnName = columnName + EVIDENCE_SUFFIX;
          else columnName = columnName + REFERENCE_SUFFIX;

          List<String> valueList = row.getList(columnName, String.class);
          if (valueList == null) valueList = new ArrayList<String>();
          if (valueList.contains(value) == false) valueList.add(value);
          row.set(columnName, valueList);

          break;
        case TAXON:
          final String taxID = entries[i].split(":")[1];
          final String taxName = speciesMap.get(taxID);
          if (taxName != null) row.set(tag.toString(), taxName);
          else if (taxID != null) row.set(tag.toString(), taxID);
          break;

        case ASPECT:
          // Ignore these lines
          break;

        case DB_OBJECT_ID:
        case DB_OBJECT_SYMBOL:
        case DB_OBJECT_SYNONYM:
          // Create consolidated id list attribute.
          List<String> synList = row.getList(SYNONYM_COL_NAME, String.class);
          if (synList == null) synList = new ArrayList<String>();

          if (tag == GeneAssociationTag.DB_OBJECT_SYNONYM) {
            final String[] vals = entries[i].split(LIST_DELIMITER);
            for (String val : vals) {
              if (synList.contains(val) == false) synList.add(val);
            }
          } else {
            if (synList.contains(entries[i]) == false) synList.add(entries[i]);
          }
          row.set(SYNONYM_COL_NAME, synList);
          break;
        default:
          if (LIST_INDEX.contains(i + 1)) {
            final String[] vals = entries[i].split(LIST_DELIMITER);

            List<String> listVals = row.getList(tag.toString(), String.class);
            if (listVals == null) listVals = new ArrayList<String>();
            for (String val : vals) {
              if (listVals.contains(val) == false) listVals.add(val);
            }
            row.set(tag.toString(), listVals);
          } else row.set(tag.toString(), entries[i]);
          break;
      }
    }
  }