MPXJ で追加したはずの Task が ProjectFile#getTaskByUniqueId で取得できない問題とその暫定対処策
MPXJ を使っていた時のこと。
for (Task t : projectFile.getAllTasks()) { if (t.getUniqueID() == 101) System.out.println("ある!"); } System.out.println(projectFile.getTaskByUniqueId(101);
ある!
null
という謎の現象が生じた。
どうやら明示的に Unique ID を設定していたところで問題が生じていたらしい。
Task task1 = projectFile.addTask(); // Unique ID: 1 task1.setUniqueID(3); // Unique ID: 3 Task task2 = projectFile.addTask(); // Unique ID: 2 task1.setUniqueID(4); // Unique ID: 4 Task task3 = projectFile.addTask(); // Unique ID: 3 task1.setUniqueID(5); // Unique ID: 5 ←ここで ProjectFile#getTaskByUniqueId で参照する Map から Unique ID: 3 が消去されてしまう。
- Unique ID は Task を作成した時点で 1 からの連番が自動的に付与される。
- 既に同じ Unique ID を持つタスクが存在したとしても重複したものが作成される。
- その状態で Task#setUniqueID すると、自動的に付与された連番の Unique ID が ProjectFile#getTaskByUniqueId で参照する Map から削除されてしまう。
(これバグなんじゃないかなあ……)
暫定対処策
// でかい数字をぶち込む Task task1 = projectFile.addTask(); // Unique ID: 1 task1.setUniqueID(1000 + 3); // Unique ID: 1003 Task task2 = projectFile.addTask(); // Unique ID: 2 task1.setUniqueID(1000 + 4); // Unique ID: 1004 Task task3 = projectFile.addTask(); // Unique ID: 3 task1.setUniqueID(1000 + 5); // Unique ID: 1005