package jetbrains.mps.vcs.diff;
/*Generated by MPS */
import org.jetbrains.mps.openapi.model.SModel;
import org.jetbrains.mps.openapi.model.SNodeId;
import java.util.List;
import jetbrains.mps.vcs.diff.changes.ModelChange;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.Map;
import jetbrains.mps.internal.collections.runtime.MapSequence;
import java.util.HashMap;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.mps.openapi.model.SNode;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations;
import java.util.Collections;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import jetbrains.mps.internal.collections.runtime.IWhereFilter;
import jetbrains.mps.internal.collections.runtime.ISelector;
import jetbrains.mps.internal.collections.runtime.Sequence;
import jetbrains.mps.internal.collections.runtime.IMapping;
import org.jetbrains.annotations.Nullable;
public class StructChangeSetImpl implements StructChangeSet {
private final SModel myOldModel;
private final SNodeId myOldNodeId;
private final SModel myNewModel;
private final SNodeId myNewNodeId;
private final List<ModelChange> myModelChanges = new CopyOnWriteArrayList<ModelChange>();
private final Map<SNodeId, SNodeId> myOldToNewMap = MapSequence.fromMap(new HashMap<SNodeId, SNodeId>());
private final Map<SNodeId, SNodeId> myNewToOldMap = MapSequence.fromMap(new HashMap<SNodeId, SNodeId>());
private StructChangeSetImpl myOppositeChangeSet = null;
public StructChangeSetImpl(@NotNull SNode oldNode, @NotNull SNode newNode) {
this(SNodeOperations.getModel(oldNode), oldNode.getNodeId(), SNodeOperations.getModel(newNode), newNode.getNodeId());
}
public StructChangeSetImpl(@NotNull SModel oldModel, @NotNull SNodeId oldNodeId, @NotNull SModel newModel, @NotNull SNodeId newNodeId) {
myOldModel = oldModel;
myOldNodeId = oldNodeId;
myNewModel = newModel;
myNewNodeId = newNodeId;
}
@NotNull
@Override
public List<ModelChange> getModelChanges() {
return Collections.unmodifiableList(myModelChanges);
}
public void clear() {
ListSequence.fromList(myModelChanges).clear();
}
@NotNull
@Override
public <C extends ModelChange> Iterable<C> getModelChanges(final Class<C> changeClass) {
return ListSequence.fromList(myModelChanges).where(new IWhereFilter<ModelChange>() {
public boolean accept(ModelChange ch) {
return changeClass.isInstance(ch);
}
}).select(new ISelector<ModelChange, C>() {
public C select(ModelChange ch) {
return (C) ch;
}
});
}
@NotNull
@Override
public SModel getOldModel() {
return myOldModel;
}
@NotNull
@Override
public SModel getNewModel() {
return myNewModel;
}
@NotNull
public SNodeId getOldNodeId() {
return myOldNodeId;
}
@NotNull
public SNodeId getNewNodeId() {
return myNewNodeId;
}
@NotNull
@Override
public ChangeSet getOppositeChangeSet() {
if (myOppositeChangeSet == null) {
throw new IllegalStateException("opposite chage set is not built");
}
return myOppositeChangeSet;
}
public void clearOppositeChangeSet() {
myOppositeChangeSet = null;
}
public void buildOppositeChangeSet() {
if (myOppositeChangeSet == null) {
myOppositeChangeSet = new StructChangeSetImpl(myNewModel, myNewNodeId, myOldModel, myOldNodeId);
myOppositeChangeSet.myOppositeChangeSet = this;
MapSequence.fromMap(myOppositeChangeSet.myOldToNewMap).putAll(myNewToOldMap);
MapSequence.fromMap(myOppositeChangeSet.myNewToOldMap).putAll(myOldToNewMap);
ListSequence.fromList(myOppositeChangeSet.myModelChanges).addSequence(ListSequence.fromList(myModelChanges).select(new ISelector<ModelChange, ModelChange>() {
public ModelChange select(ModelChange c) {
return c.getOppositeChange();
}
}));
}
}
public void add(@NotNull ModelChange change) {
ListSequence.fromList(myModelChanges).addElement(change);
if (myOppositeChangeSet != null) {
ListSequence.fromList(myOppositeChangeSet.myModelChanges).addElement(change.getOppositeChange());
}
}
public void remove(@NotNull ModelChange change) {
ListSequence.fromList(myModelChanges).removeElement(change);
if (myOppositeChangeSet != null) {
ListSequence.fromList(myOppositeChangeSet.myModelChanges).removeElement(change.getOppositeChange());
}
}
public void addAll(Iterable<? extends ModelChange> changes) {
ListSequence.fromList(myModelChanges).addSequence(Sequence.fromIterable(changes));
if (myOppositeChangeSet != null) {
ListSequence.fromList(myOppositeChangeSet.myModelChanges).addSequence(Sequence.fromIterable(changes).select(new ISelector<ModelChange, ModelChange>() {
public ModelChange select(ModelChange c) {
return c.getOppositeChange();
}
}));
}
}
public void buildNodeMaps(Map<SNodeId, SNodeId> oldToNewMap) {
for (IMapping<SNodeId, SNodeId> mapping : MapSequence.fromMap(oldToNewMap)) {
MapSequence.fromMap(myOldToNewMap).put(mapping.key(), mapping.value());
MapSequence.fromMap(myNewToOldMap).put(mapping.value(), mapping.key());
}
}
@Nullable
public SNodeId mapToNewId(SNodeId idOld) {
return MapSequence.fromMap(myOldToNewMap).get(idOld);
}
@Nullable
public SNodeId mapToOldId(SNodeId idNew) {
return MapSequence.fromMap(myNewToOldMap).get(idNew);
}
}