読者です 読者をやめる 読者になる 読者になる

なにか作る

なにかを作るブログです。

MPXJ で追加したはずの Task が ProjectFile#getTaskByUniqueId で取得できない問題とその暫定対処策

MPXJ Java

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