あるプログラマの日記

プログラマのメモ、出来事、考えたこと、勉強とかの雑記

XMLのスキーマ変換中に発生した ConcurrentModificationException

昨日 trang を使った時に発生した ConcurrentModificationException は
いっしょに ダウンロードしたソースファイル(src.zip)を見てみると
com/thaiopensource/relaxng/input/xml/Inferrer.java 内にある
下の拡張 for 文(for (Name elementName : outputQueue) {..)のブロック内から
outputQueue に要素が追加されていた。
(createElementPatternメソッドからまわりまわって outputQueue.add(name); が呼ばれていた。)

package com.thaiopensource.relaxng.input.xml;
..
class Inferrer {
..
  private final List<Name> outputQueue = new Vector<Name>();
..
  private Inferrer(Schema schema) {
    this.schema = schema;
    this.grammar = new GrammarPattern();
    findMultiplyReferencedElements();
    choosePrefixSeparator();
    grammar.getComponents().add(new DefineComponent(DefineComponent.START,
                                                    particleConverter.convert(schema.getStart())));
    for (Name elementName : outputQueue) {
      grammar.getComponents().add(new DefineComponent(getDefineName(elementName),
                                                      createElementPattern(elementName)));
    }
  }
..

まぁ、イテレーション中にコレクション自身へ要素を追加しているので
これはやめる必要がありそう。
といって、具体的な解決策はまだよくわかっていない。