/* * Copyright (c) 2014, the Dart project authors. * * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.eclipse.org/legal/epl-v10.html * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.dart.server.internal; import com.google.common.collect.Lists; import com.google.dart.server.AnalysisServerListener; import org.dartlang.analysis.server.protocol.AnalysisError; import org.dartlang.analysis.server.protocol.AnalysisStatus; import org.dartlang.analysis.server.protocol.CompletionSuggestion; import org.dartlang.analysis.server.protocol.HighlightRegion; import org.dartlang.analysis.server.protocol.ImplementedClass; import org.dartlang.analysis.server.protocol.ImplementedMember; import org.dartlang.analysis.server.protocol.NavigationRegion; import org.dartlang.analysis.server.protocol.Occurrences; import org.dartlang.analysis.server.protocol.Outline; import org.dartlang.analysis.server.protocol.OverrideMember; import org.dartlang.analysis.server.protocol.PubStatus; import org.dartlang.analysis.server.protocol.RequestError; import org.dartlang.analysis.server.protocol.SearchResult; import java.util.List; /** * The class {@code BroadcastAnalysisServerListener} implements {@link AnalysisServerListener} that * broadcasts events to other listeners. * * @coverage dart.server */ public class BroadcastAnalysisServerListener implements AnalysisServerListener { private final List<AnalysisServerListener> listeners = Lists.newArrayList(); /** * Add the given listener to the list of listeners that will receive notification when new * analysis results become available. * * @param listener the listener to be added */ public void addListener(AnalysisServerListener listener) { synchronized (listeners) { if (listeners.contains(listener)) { return; } listeners.add(listener); } } @Override public void computedAnalyzedFiles(List<String> directories) { for (AnalysisServerListener listener : getListeners()) { listener.computedAnalyzedFiles(directories); } } @Override public void computedCompletion(String completionId, int replacementOffset, int replacementLength, List<CompletionSuggestion> completions, boolean isLast) { for (AnalysisServerListener listener : getListeners()) { listener.computedCompletion( completionId, replacementOffset, replacementLength, completions, isLast); } } @Override public void computedErrors(String file, List<AnalysisError> errors) { for (AnalysisServerListener listener : getListeners()) { listener.computedErrors(file, errors); } } @Override public void computedHighlights(String file, List<HighlightRegion> highlights) { for (AnalysisServerListener listener : getListeners()) { listener.computedHighlights(file, highlights); } } @Override public void computedImplemented(String file, List<ImplementedClass> implementedClasses, List<ImplementedMember> implementedMembers) { for (AnalysisServerListener listener : getListeners()) { listener.computedImplemented(file, implementedClasses, implementedMembers); } } @Override public void computedLaunchData(String file, String kind, String[] referencedFiles) { for (AnalysisServerListener listener : getListeners()) { listener.computedLaunchData(file, kind, referencedFiles); } } @Override public void computedNavigation(String file, List<NavigationRegion> targets) { for (AnalysisServerListener listener : getListeners()) { listener.computedNavigation(file, targets); } } @Override public void computedOccurrences(String file, List<Occurrences> occurrencesArray) { for (AnalysisServerListener listener : getListeners()) { listener.computedOccurrences(file, occurrencesArray); } } @Override public void computedOutline(String file, Outline outline) { for (AnalysisServerListener listener : getListeners()) { listener.computedOutline(file, outline); } } @Override public void computedOverrides(String file, List<OverrideMember> overrides) { for (AnalysisServerListener listener : getListeners()) { listener.computedOverrides(file, overrides); } } @Override public void computedSearchResults(String searchId, List<SearchResult> results, boolean last) { for (AnalysisServerListener listener : getListeners()) { listener.computedSearchResults(searchId, results, last); } } @Override public void flushedResults(List<String> files) { for (AnalysisServerListener listener : getListeners()) { listener.flushedResults(files); } } /** * Remove the given listener from the list of listeners that will receive notification when new * analysis results become available. * * @param listener the listener to be removed */ public void removeListener(AnalysisServerListener listener) { synchronized (listeners) { listeners.remove(listener); } } @Override public void requestError(RequestError requestError) { for (AnalysisServerListener listener : getListeners()) { listener.requestError(requestError); } } @Override public void serverConnected(String version) { for (AnalysisServerListener listener : getListeners()) { listener.serverConnected(version); } } @Override public void serverError(boolean isFatal, String message, String stackTrace) { for (AnalysisServerListener listener : getListeners()) { listener.serverError(isFatal, message, stackTrace); } } @Override public void serverIncompatibleVersion(String version) { for (AnalysisServerListener listener : getListeners()) { listener.serverIncompatibleVersion(version); } } @Override public void serverStatus(AnalysisStatus analysisStatus, PubStatus pubStatus) { for (AnalysisServerListener listener : getListeners()) { listener.serverStatus(analysisStatus, pubStatus); } } /** * Returns an immutable copy of {@link #listeners}. */ private List<AnalysisServerListener> getListeners() { synchronized (listeners) { return Lists.newArrayList(listeners); } } }