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);
}
});
}
}