EntityRelationMappingEditor/src/main/java/nl/andrewlalis/erme/model/Relation.java

101 lines
2.5 KiB
Java

package nl.andrewlalis.erme.model;
import lombok.Getter;
import nl.andrewlalis.erme.view.view_models.RelationViewModel;
import nl.andrewlalis.erme.view.view_models.ViewModel;
import java.awt.*;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* Represents a single "relation" or table in the diagram.
*/
@Getter
public class Relation implements Serializable, Viewable {
private final MappingModel model;
private Point position;
private String name;
private final List<Attribute> attributes;
private transient boolean selected;
private transient RelationViewModel viewModel;
public Relation(MappingModel model, Point position, String name) {
this.model = model;
this.position = position;
this.name = name;
this.attributes = new ArrayList<>();
}
public void setPosition(Point position) {
this.position = position;
}
public void setName(String name) {
this.name = name;
}
public void setSelected(boolean selected) {
this.selected = selected;
}
public void addAttribute(Attribute attribute) {
this.attributes.add(attribute);
this.model.fireChangedEvent();
}
public void addAttribute(Attribute attribute, int index) {
this.attributes.add(index, attribute);
this.model.fireChangedEvent();
}
public void removeAttribute(Attribute attribute) {
if (this.attributes.remove(attribute)) {
this.model.removeAllReferencingAttributes(attribute);
this.model.fireChangedEvent();
}
}
@Override
public ViewModel getViewModel() {
if (this.viewModel == null) {
this.viewModel = new RelationViewModel(this);
}
return this.viewModel;
}
public List<Attribute> getReferencableAttributes() {
return this.attributes.stream()
.filter(a -> a.getType() == AttributeType.ID_KEY || a.getType() == AttributeType.PARTIAL_ID_KEY)
.collect(Collectors.toList());
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Relation relation = (Relation) o;
return Objects.equals(this.getName(), relation.getName());
}
@Override
public int hashCode() {
return this.getName().hashCode();
}
@Override
public String toString() {
return this.getName();
}
public Relation copy(MappingModel newModel) {
Relation c = new Relation(newModel, new Point(this.getPosition()), this.getName());
this.getAttributes().forEach(a -> c.addAttribute(a.copy(c)));
return c;
}
}