またPOIではまった……。

id:Horiuchi_H:20041006#1097045408 で書いてましたが、POIを使ってシートをコピーする処理をしていたんです。しかし、急にエラーが発生。何が問題かとぐぐったところ http://www.jajakarta.org/kvasir/bbs/technical/1060?msg=3#msg3636 なんて記事を発見。オートシェイプを含んだシートがコピーできないと言う既知のバグでしたか……。しかたなく、ソースをDownLoadしてきて上記の編集を行いました。
しかし、修正したファイルをビルドして実行したところ今度は org.apache.poi.hssf.record.ObjRecord#clone() で ConcurrentModificationException が発生!何なんだ?とソースを見たところ以下の様になっていました……。

    public Object clone()
    {
        ObjRecord rec = new ObjRecord();
        rec.subrecords = new ArrayList();

        for ( Iterator iterator = subrecords.iterator(); iterator.hasNext(); )
            subrecords.add(( (Record) iterator.next() ).clone());

        return rec;
    }

ぉぃぉぃ、初歩的な記述ミスですかorz 一回このコードを通れば確実に起きる例外でした……。修正コードは以下に書いておきます。それと、ここを直して無事コピーができたことを付記しておきます。明日の朝一で帰ろうっと……。

    public Object clone()
    {
        ObjRecord rec = new ObjRecord();
        rec.subrecords = new ArrayList();

        for ( Iterator iterator = subrecords.iterator(); iterator.hasNext(); )
//OLD            subrecords.add(( (Record) iterator.next() ).clone());
            rec.subrecords.add(( (Record) iterator.next() ).clone());

        return rec;
    }