package org.batfish.datamodel.routing_policy.expr; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.stream.Collectors; import org.batfish.datamodel.collections.CommunitySet; import org.batfish.datamodel.routing_policy.Environment; import com.fasterxml.jackson.annotation.JsonCreator; public class InlineCommunitySet extends CommunitySetExpr { /** * */ private static final long serialVersionUID = 1L; private transient CommunitySet _cachedCommunities; private List<CommunitySetElem> _communities; @JsonCreator private InlineCommunitySet() { } public InlineCommunitySet(Collection<Long> communities) { _communities = communities.stream().map(l -> new CommunitySetElem(l)) .collect(Collectors.toList()); } public InlineCommunitySet(List<CommunitySetElem> communities) { _communities = new ArrayList<>(); _communities.addAll(communities); } @Override public CommunitySet communities(Environment environment) { if (_cachedCommunities == null) { _cachedCommunities = initCommunities(environment); } return _cachedCommunities; } @Override public CommunitySet communities(Environment environment, CommunitySet communityCandidates) { if (_cachedCommunities == null) { _cachedCommunities = initCommunities(environment); } CommunitySet matchingCommunities = new CommunitySet(_cachedCommunities); matchingCommunities.retainAll(communityCandidates); return matchingCommunities; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } InlineCommunitySet other = (InlineCommunitySet) obj; if (_communities == null) { if (other._communities != null) { return false; } } else if (!_communities.equals(other._communities)) { return false; } return true; } public List<CommunitySetElem> getCommunities() { return _communities; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((_communities == null) ? 0 : _communities.hashCode()); return result; } private synchronized CommunitySet initCommunities(Environment environment) { CommunitySet out = new CommunitySet(); for (CommunitySetElem elem : _communities) { long c = elem.community(environment); out.add(c); } return out; } @Override public boolean matchSingleCommunity(Environment environment, CommunitySet communities) { for (Long community : communities) { if (_communities.contains(community)) { return true; } } return false; } public void setCommunities(List<CommunitySetElem> communities) { _communities = communities; } }