abhrshのSeasarにっき

 | 

2004-07-19

[]不具合もう一つ

BeanReaderはひがさんの指摘通りに「pt.getColumnName() + "_" + rpt.getRelationNo()」に直しました。

ただ、これだと1つ問題があります。現状では、DataSetを比較するために「A.equals(B)」としたとき、Aが持つテーブルのカラム名に"_"が入っている分には構わないのですが、Bの方に"_"が入っていると必ずfalseが返ってきます。

原因はDataRowImpl#equals(Object)の実装にあるようです。これを以下のように修正します。

修正前

public boolean equals(Object o) {
  if (o == this) {
    return true;
  }
  if (!(o instanceof DataRow)) {
    return false;
  }
  DataRow other = (DataRow) o;
  for (int i = 0; i < table_.getColumnSize(); ++i) {
    String columnName = StringUtil.replace(table_.getColumnName(i), "_", "");
    Object value = values_.get(i);
    Object otherValue = other.getValue(columnName);
    ColumnType ct = table_.getColumnType(i);
    if (ct.equals(ColumnTypes.OBJECT)) {
      ct = other.getTable().getColumnType(columnName);
    }
    if (ct.equals(value, otherValue)) {
      continue;
    } else {
      return false;
    }
  }
  return true;
}

修正後

public boolean equals(Object o) {
  if (o == this) {
    return true;
  }
  if (!(o instanceof DataRow)) {
    return false;
  }
  DataRow other = (DataRow) o;
  for (int i = 0; i < table_.getColumnSize(); ++i) {
    String columnName = table_.getColumnName(i);
    Object value = values_.get(i);
    Object otherValue = other.getValue(columnName);
    ColumnType ct = table_.getColumnType(i);
    if (ct.equals(ColumnTypes.OBJECT)) {
      ct = other.getTable().getColumnType(columnName);
    }
    if (ct.equals(value, otherValue)) {
      continue;
    } else {
      return false;
    }
  }
  return true;
}

これでとりあえず解決ですが、カラム名が引数になっている他のメソッドも調べないといけなそうですね。

DataTableやDataRowが持つカラム名に"_"があるときとないとき、メソッドの引数のカラム名に"_"があるときとないとき、どの組み合わせでも動くようにする方が安全な気がします。

トラックバック - http://seasarproject.g.hatena.ne.jp/abhrsh/20040719
 |