/*
* Copyright 2003-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
*
* 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 jetbrains.mps.project.structure.modules.mappingpriorities;
import jetbrains.mps.generator.runtime.TemplateMappingPriorityRule;
import jetbrains.mps.project.structure.modules.Copyable;
import jetbrains.mps.util.io.ModelInputStream;
import jetbrains.mps.util.io.ModelOutputStream;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.mps.openapi.module.SRepository;
import java.io.IOException;
public class MappingPriorityRule implements TemplateMappingPriorityRule, Copyable<MappingPriorityRule> {
public static final String LEFT = "left";
public static final String TYPE = "type";
public static final String RIGHT = "right";
private RuleType myType;
private MappingConfig_AbstractRef myLeft, myRight;
public MappingPriorityRule() {
myType = RuleType.STRICTLY_TOGETHER;
myLeft = new MappingConfig_AbstractRef();
myRight = new MappingConfig_AbstractRef();
}
public RuleType getType() {
return myType;
}
public void setType(RuleType type) {
myType = type;
}
public MappingConfig_AbstractRef getLeft() {
return myLeft;
}
public void setLeft(MappingConfig_AbstractRef left) {
myLeft = left;
}
public MappingConfig_AbstractRef getRight() {
return myRight;
}
public void setRight(MappingConfig_AbstractRef right) {
myRight = right;
}
/**
* IMPORTANT: Use this method for MPRs coming from module descriptor of a project module (i.e. design time).
* @param repository FIXME in fact, MPR is two-fold and addresses both RT API and design time API for priority rules.
* As RT API, it doesn't need SRepository (SRepository is vital for design time, while deployed modules should
* have this information generated).
*/
public String asString(SRepository repository) {
String left = myLeft == null ? "???" : myLeft.asString(repository);
String right = myRight == null ? "???" : myRight.asString(repository);
return left + ' ' + getType().getName() + ' ' + right;
}
/**
* Deployment-time {@code toString()}
*/
public String asString() {
String left = myLeft == null ? "???" : myLeft.asString();
String right = myRight == null ? "???" : myRight.asString();
return left + ' ' + getType().getName() + ' ' + right;
}
@Override
public String toString() {
return asString();
}
public boolean updateReferences(SRepository repository) {
return myRight.updateReferences(repository) | myLeft.updateReferences(repository);
}
public void save(ModelOutputStream stream) throws IOException {
stream.writeString(myType.name());
MappingConfig_AbstractRef.save(myLeft, stream);
MappingConfig_AbstractRef.save(myRight, stream);
}
public void load(ModelInputStream stream) throws IOException {
myType = RuleType.valueOf(stream.readString());
myLeft = MappingConfig_AbstractRef.load(stream);
myRight = MappingConfig_AbstractRef.load(stream);
}
@NotNull
@Override
public MappingPriorityRule copy() {
MappingPriorityRule copy = new MappingPriorityRule();
copy.setType(myType);
if (myLeft != null) {
copy.setLeft(myLeft.copy());
}
if (myRight != null) {
copy.setRight(myRight.copy());
}
return copy;
}
}