package jetbrains.mps.idea.java.psiStubs; /*Generated by MPS */ import jetbrains.mps.extapi.persistence.DataSourceBase; import java.util.List; import org.jetbrains.mps.openapi.persistence.DataSourceListener; import jetbrains.mps.internal.collections.runtime.ListSequence; import java.util.ArrayList; import com.intellij.openapi.module.Module; import com.intellij.psi.PsiDirectory; import jetbrains.mps.internal.collections.runtime.Sequence; import jetbrains.mps.internal.collections.runtime.ISelector; import com.intellij.psi.PsiJavaFile; import jetbrains.mps.internal.collections.runtime.ITranslator2; import org.jetbrains.mps.openapi.persistence.DataSource; import jetbrains.mps.internal.collections.runtime.IVisitor; /** * Data source for a number of psi directories. * It accumulates events from many psi java stub data sources. */ public class MultiplePsiJavaStubDataSource extends DataSourceBase implements JavaFilesHolder, PsiJavaStubListener { private final Object LOCK = new Object(); private List<PsiJavaStubDataSource> myDataSources; private List<DataSourceListener> myListeners = ListSequence.fromList(new ArrayList<DataSourceListener>()); public MultiplePsiJavaStubDataSource(final Module module, Iterable<PsiDirectory> dirs) { myDataSources = Sequence.fromIterable(dirs).select(new ISelector<PsiDirectory, PsiJavaStubDataSource>() { public PsiJavaStubDataSource select(PsiDirectory it) { return new PsiJavaStubDataSource(module, it); } }).toListSequence(); } public Iterable<PsiJavaFile> getJavaFiles() { return ListSequence.fromList(myDataSources).translate(new ITranslator2<PsiJavaStubDataSource, PsiJavaFile>() { public Iterable<PsiJavaFile> translate(PsiJavaStubDataSource it) { return it.getJavaFiles(); } }); } public void changed(final DataSource source, final PsiJavaStubEvent event) { synchronized (LOCK) { ListSequence.fromList(myListeners).visitAll(new IVisitor<DataSourceListener>() { public void visit(DataSourceListener it) { if (it instanceof PsiJavaStubListener) { ((PsiJavaStubListener) it).changed(source, event); } else { it.changed(source); } } }); } } public void changed(final DataSource source) { synchronized (LOCK) { // Q: pass this dataSource 'this' or original 'source' ? ListSequence.fromList(myListeners).visitAll(new IVisitor<DataSourceListener>() { public void visit(DataSourceListener it) { it.changed(source); } }); } } @Override public void addListener(DataSourceListener listener) { super.addListener(listener); synchronized (LOCK) { if (ListSequence.fromList(myListeners).isEmpty()) { startListening(); } ListSequence.fromList(myListeners).addElement(listener); } } @Override public void removeListener(DataSourceListener listener) { synchronized (LOCK) { ListSequence.fromList(myListeners).removeElement(listener); if (ListSequence.fromList(myListeners).isEmpty()) { stopListening(); } } } private void startListening() { ListSequence.fromList(myDataSources).visitAll(new IVisitor<PsiJavaStubDataSource>() { public void visit(PsiJavaStubDataSource it) { it.addListener(MultiplePsiJavaStubDataSource.this); } }); } private void stopListening() { ListSequence.fromList(myDataSources).visitAll(new IVisitor<PsiJavaStubDataSource>() { public void visit(PsiJavaStubDataSource it) { it.removeListener(MultiplePsiJavaStubDataSource.this); } }); } }