package jetbrains.mps.ide.platform.watching; /*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 java.util.Map; import jetbrains.mps.internal.collections.runtime.MapSequence; import java.util.HashMap; import java.util.concurrent.atomic.AtomicInteger; import jetbrains.mps.internal.collections.runtime.Sequence; import jetbrains.mps.internal.collections.runtime.IWhereFilter; import org.jetbrains.mps.openapi.util.ProgressMonitor; import jetbrains.mps.smodel.ModelAccess; import org.jetbrains.mps.openapi.util.SubProgressKind; public class ReloadSession { private static final Logger LOG = LogManager.getLogger(ReloadSession.class); private List<ReloadListener> myListeners = ListSequence.fromList(new ArrayList<ReloadListener>()); private boolean myReloaded = false; private Map<Class, ReloadParticipant> myParticipants = MapSequence.fromMap(new HashMap<Class, ReloadParticipant>()); private boolean myEmpty = true; private AtomicInteger myEmployCount = new AtomicInteger(0); public ReloadSession(Iterable<ReloadListener> listeners) { ListSequence.fromList(myListeners).addSequence(Sequence.fromIterable(listeners)); } /*package*/ boolean isBeingEmployed() { return myEmployCount.get() > 0; } /*package*/ void incEmployCount() { int count = myEmployCount.incrementAndGet(); assert count >= 0; } /*package*/ void decEmployCount() { int count = myEmployCount.decrementAndGet(); assert count >= 0; } /*package*/ boolean isEmpty() { return myEmpty; } /*package*/ boolean wantsToShowProgress() { // if at least one participant wants to show, we say that all reload session wants return Sequence.fromIterable(getParticipants()).any(new IWhereFilter<ReloadParticipant>() { public boolean accept(ReloadParticipant it) { return it.wantsToShowProgress(); } }); } /*package*/ void updateStatus() { myEmpty = Sequence.fromIterable(getParticipants()).all(new IWhereFilter<ReloadParticipant>() { public boolean accept(ReloadParticipant it) { return it.isEmpty(); } }); } /*package*/ void doReload(final ProgressMonitor monitor) { assert !(myReloaded) : "Contract: do not call doReload twice on one reload session"; myReloaded = true; final Iterable<ReloadParticipant> participants = getParticipants(); monitor.start("Reloading Files", Sequence.fromIterable(participants).count()); long beginTime = System.nanoTime(); try { if (LOG.isDebugEnabled()) { LOG.debug("File system reload started"); } fireReloadStarted(); ModelAccess.instance().runWriteAction(new Runnable() { public void run() { for (ReloadParticipant rp : participants) { rp.update(monitor.subTask(1, SubProgressKind.REPLACING)); } } }); } finally { if (LOG.isInfoEnabled()) { LOG.info(String.format("File system reload finished in %.3f s", (System.nanoTime() - beginTime) / 1000000000.)); } monitor.done(); fireReloadFinished(); } } /*package*/ void clear() { ListSequence.fromList(myListeners).clear(); MapSequence.fromMap(myParticipants).clear(); } /*package*/ <T extends ReloadParticipant> T getParticipant(Class<T> participantClass) { ReloadParticipant p = MapSequence.fromMap(myParticipants).get(participantClass); if (p == null) { try { p = participantClass.newInstance(); MapSequence.fromMap(myParticipants).put(participantClass, p); } catch (IllegalAccessException ignored) { } catch (InstantiationException ignored) { } } return (T) p; } private Iterable<ReloadParticipant> getParticipants() { return MapSequence.fromMap(myParticipants).values(); } private void fireReloadStarted() { for (ReloadListener rl : myListeners) { rl.reloadStarted(); } } private void fireReloadFinished() { for (ReloadListener rl : myListeners) { rl.reloadFinished(); } } }