/*******************************************************************************
* MontiCore Language Workbench
* Copyright (c) 2015, 2016, MontiCore, All rights reserved.
*
* This project is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3.0 of the License, or (at your option) any later version.
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this project. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/
package de.se_rwth.langeditor.modelstates;
import java.util.HashSet;
import java.util.Optional;
import java.util.Set;
import java.util.function.Consumer;
import org.eclipse.core.resources.IStorage;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
import com.google.inject.Singleton;
@Singleton
public class ObservableModelStates {
private final Set<ModelState> modelStates = new HashSet<>();
private final Set<Consumer<ModelState>> globalObservers = new HashSet<>();
private final Multimap<IStorage, Consumer<ModelState>> storageObservers = HashMultimap.create();
public void acceptModelState(ModelState modelState) {
removePreviousState(modelState);
modelStates.add(modelState);
globalObservers.forEach(observer -> observer.accept(modelState));
storageObservers.get(modelState.getStorage()).forEach(observer -> observer.accept(modelState));
}
public Set<ModelState> getModelStates() {
return modelStates;
}
public void addGlobalObserver(Consumer<ModelState> observer) {
globalObservers.add(observer);
}
public void addStorageObserver(IStorage storage, Consumer<ModelState> observer) {
storageObservers.put(storage, observer);
}
public Optional<ModelState> findModelState(IStorage storage) {
return modelStates.stream()
.filter(modelState -> modelState.getStorage().equals(storage))
.findFirst();
}
public void removeStorageObservers(IStorage storage) {
storageObservers.removeAll(storage);
}
private void removePreviousState(ModelState modelState) {
modelStates.stream()
.filter(previousModelState -> {
boolean sameStorage = previousModelState.getStorage().equals(modelState.getStorage());
boolean sameProject = previousModelState.getProject().equals(modelState.getProject());
return sameStorage && sameProject;
})
.findFirst()
.ifPresent(modelStates::remove);
}
}