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