package models.dataConstraintModel; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import models.algebra.Expression; import models.algebra.Variable; public class Channel { protected String channelName; protected Channel parent = null; protected List<Channel> children = null; protected List<Selector> selectors = null; protected Set<ChannelMember> channelMembers = null; protected String sourceText = null; protected boolean isNative = false; public Channel(String channelName) { this.channelName = channelName; this.parent = null; this.children = new ArrayList<>(); selectors = new ArrayList<>(); channelMembers = new HashSet<>(); } public Channel(String channelName, Variable variable) { this.channelName = channelName; this.parent = null; this.children = new ArrayList<>(); selectors = new ArrayList<>(); selectors.add(new Selector(variable)); channelMembers = new HashSet<>(); } public Channel(String channelName, List<Variable> variables) { this.channelName = channelName; this.parent = null; this.children = new ArrayList<>(); selectors = new ArrayList<>(); for (Variable var: variables) { selectors.add(new Selector(var)); } channelMembers = new HashSet<>(); } public String getChannelName() { return channelName; } public Channel getParent() { return parent; } public List<Channel> getChildren() { return children; } public void addChild(Channel child) { children.add(child); child.parent = this; child.refleshOutside(); } public List<Selector> getSelectors() { return selectors; } public List<Selector> getAllSelectors() { List<Selector> allSelectors = new ArrayList<>(); if (parent != null) allSelectors.addAll(parent.getAllSelectors()); allSelectors.addAll(selectors); return allSelectors; } public void setSelectors(List<Selector> selectors) { this.selectors = selectors; } public void addSelector(Variable var) { selectors.add(new Selector(var)); } public void addSelector(Selector selector) { selectors.add(selector); } public List<Expression> getAllSelectorVariables() { List<Expression> allSelectorVariables = new ArrayList<>(); if (parent != null) allSelectorVariables.addAll(parent.getAllSelectorVariables()); for (Selector sel: selectors) { allSelectorVariables.add(sel.getExpression()); } return allSelectorVariables; } public Set<ChannelMember> getChannelMembers() { return channelMembers; } public void setChannelMembers(Set<ChannelMember> channelMembers) { this.channelMembers = channelMembers; } public void addChannelMember(ChannelMember channelMember) { channelMembers.add(channelMember); if (getAllSelectors().size() > 0) { Set<Expression> params = new HashSet<>(); for (Selector s: getAllSelectors()) { params.add(s.getExpression()); } if (!params.containsAll(channelMember.getResource().getPathParams())) { channelMember.setOutside(true); } } else { if (channelMember.getResource().getPathParams().size() == 0) { channelMember.setOutside(false); } else { channelMember.setOutside(true); } } if (isNative) { channelMember.getResource().getResourceHierarchy().setNative(true); } } public void refleshOutside() { for (ChannelMember channelMember: channelMembers) { if (getAllSelectors().size() > 0) { Set<Expression> params = new HashSet<>(); for (Selector s: getAllSelectors()) { params.add(s.getExpression()); } if (!params.containsAll(channelMember.getResource().getPathParams())) { channelMember.setOutside(true); } else { channelMember.setOutside(false); } } else { if (channelMember.getResource().getPathParams().size() == 0) { channelMember.setOutside(false); } else { channelMember.setOutside(true); } } } } public void removeChannelMember(ResourcePath res) { for (ChannelMember cm: channelMembers) { if (cm.getResource() == res) { channelMembers.remove(cm); break; } } } public Set<ResourcePath> getResources() { Set<ResourcePath> resources = new HashSet<>(); for (ChannelMember member: channelMembers) { resources.add(member.getResource()); } return resources; } public boolean isNative() { return isNative; } public void setNative(boolean isNative) { this.isNative = isNative; for (ChannelMember member: channelMembers) { member.getResource().getResourceHierarchy().setNative(isNative); } } public String toString() { return channelName; } public void setSourceText(String sourceText) { this.sourceText = sourceText; } public String getSourceText() { if (sourceText == null) { return toString(); } return sourceText; } }