Добрый день
Я думаю универсального решения здесь не может быть в принципе.
Потому что: ваши требования подразумевают что коммит нужно прервать, создать и показать пользователю новое окно для ввода данных.
Дальше поток исполнения прерывается, чтобы вернуть управление пользователю
После того как пользователь ввёл необходимые данные, коммит родительского экрана нужно перезапустить заново (но уже не запрашивать доп поля). Тут-то и нужно знать контекст, из какого места был запущен коммит окна.
Поэтому тут вариант только писать утилитный класс с подобным API и использовать его во всех экранах где ваша сущность редактируется.
Что-то в этом духе, для наследника AbstractEditor:
private boolean inCommit = false;
@Override
public void commitAndClose() {
if (!inCommit && MyEntityChangeTracking.myEntityIsChanged(getDsContext()) {
MyEntityChangeTracking.showAdditionalDataInputWindow(getItem(), () -> {
// коллбек после ввода необходимых данных
inCommit = true;
try {
commitAndClose();
} finally {
inCommit = false;
}
});
// просто ничего не делать, или выбросить это исключение
throw new SilentException();
} else {
super.commitAndClose();
}
}
Если сущность редактируется не в AbstractEditor, то нужно будет переопределять какой-то другой метод.