/** * Executes the command. Subclasses are <b>not</b> expected to overwrite * this method, and implement their changes on {@link #doExecute()}. */ public void execute() { ChangeRecorder changeRecorder = getChangeRecorder(); if (changeRecorder == null) { changeRecorder = createChangeRecorder(); } changeRecorder.beginRecording(notifier != null ? Collections.singleton(notifier) : notifiers); try { doExecute(); } finally { setChangeDescription(changeRecorder.endRecording()); disposeChangeRecorder(changeRecorder); } }