package jetbrains.mps.vcs.changesmanager; /*Generated by MPS */ import org.apache.log4j.Logger; import org.apache.log4j.LogManager; import java.util.List; import jetbrains.mps.internal.collections.runtime.ListSequence; import java.util.ArrayList; import org.jetbrains.annotations.NotNull; import jetbrains.mps.baseLanguage.closures.runtime._FunctionTypes; import org.apache.log4j.Level; import jetbrains.mps.vcs.diff.changes.ModelChange; /*package*/ class CurrentDifferenceBroadcaster implements CurrentDifferenceListener { private static final Logger LOG = LogManager.getLogger(CurrentDifferenceBroadcaster.class); private List<CurrentDifferenceListener> myListeners = ListSequence.fromList(new ArrayList<CurrentDifferenceListener>()); private SimpleCommandQueue myCommandQueue; public CurrentDifferenceBroadcaster(SimpleCommandQueue commandQueue) { myCommandQueue = commandQueue; } public void addDifferenceListener(@NotNull CurrentDifferenceListener listener) { synchronized (myListeners) { ListSequence.fromList(myListeners).addElement(listener); } } public void removeDifferenceListener(@NotNull CurrentDifferenceListener listener) { synchronized (myListeners) { ListSequence.fromList(myListeners).removeElement(listener); } } @NotNull private List<CurrentDifferenceListener> copyListeners() { synchronized (myListeners) { return ListSequence.fromListWithValues(new ArrayList<CurrentDifferenceListener>(), myListeners); } } private void fireEvent(String name, _FunctionTypes._void_P1_E0<? super CurrentDifferenceListener> task) { myCommandQueue.assertSoftlyIsCommandThread(); for (CurrentDifferenceListener listener : ListSequence.fromList(copyListeners())) { try { task.invoke(listener); } catch (Throwable t) { myCommandQueue.setHadExceptions(true); if (LOG.isEnabledFor(Level.ERROR)) { LOG.error("Exception on firing " + name + " event", t); } } } } @Override public void changeAdded(@NotNull final ModelChange change) { fireEvent("changeAdded", new _FunctionTypes._void_P1_E0<CurrentDifferenceListener>() { public void invoke(CurrentDifferenceListener listener) { listener.changeAdded(change); } }); } @Override public void changeRemoved(@NotNull final ModelChange change) { fireEvent("changeRemoved", new _FunctionTypes._void_P1_E0<CurrentDifferenceListener>() { public void invoke(CurrentDifferenceListener listener) { listener.changeRemoved(change); } }); } @Override public void changeUpdateStarted() { fireEvent("changeUpdateStarted", new _FunctionTypes._void_P1_E0<CurrentDifferenceListener>() { public void invoke(CurrentDifferenceListener listener) { listener.changeUpdateStarted(); } }); } @Override public void changeUpdateFinished() { fireEvent("changeUpdateFinished", new _FunctionTypes._void_P1_E0<CurrentDifferenceListener>() { public void invoke(CurrentDifferenceListener listener) { listener.changeUpdateFinished(); } }); } }