package org.ovirt.engine.core.common.action; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Objects; import java.util.Set; import javax.validation.constraints.Pattern; import javax.validation.constraints.Size; import org.ovirt.engine.core.common.businessentities.BusinessEntitiesDefinitions; import org.ovirt.engine.core.common.businessentities.BusinessEntity; import org.ovirt.engine.core.common.businessentities.Nameable; import org.ovirt.engine.core.common.businessentities.network.Bond; import org.ovirt.engine.core.common.utils.ToStringBuilder; import org.ovirt.engine.core.compat.Guid; public class CreateOrUpdateBond implements BusinessEntity<Guid>, Nameable { private static final long serialVersionUID = 7535719902326461903L; private Guid id; @Size(min = 1, max = BusinessEntitiesDefinitions.NETWORK_NAME_SIZE) @Pattern(regexp = BusinessEntitiesDefinitions.BOND_NAME_PATTERN, message = "NETWORK_BOND_NAME_BAD_FORMAT") private String name; private String bondOptions; private Set<String> slaves = new HashSet<>(); public boolean equalToBond(Bond bond) { return Objects.equals(getId(), bond.getId()) && Objects.equals(getName(), bond.getName()) && Objects.equals(getBondOptions(), bond.getBondOptions()) && bondsHasSameSlaves(bond); } private boolean bondsHasSameSlaves(Bond existingNic) { Collection<String> slavesOfBondFromRequest = replaceNullWithEmptyList(getSlaves()); Collection<String> slavesOfExistingBond = replaceNullWithEmptyList(existingNic.getSlaves()); //bonds can be in any order, and I don't want to change this order during this check. return slavesOfBondFromRequest.size() == slavesOfExistingBond.size() && slavesOfBondFromRequest.containsAll(slavesOfExistingBond); } private Collection<String> replaceNullWithEmptyList(Collection<String> list) { return list == null ? Collections.<String>emptyList() : list; } public Bond toBond() { Bond bond = new Bond(); bond.setId(getId()); bond.setName(getName()); bond.setSlaves(new ArrayList<>(getSlaves())); bond.setBondOptions(getBondOptions()); return bond; } public static CreateOrUpdateBond fromBond(Bond bond) { CreateOrUpdateBond createOrUpdateBond = new CreateOrUpdateBond(); createOrUpdateBond.setId(bond.getId()); createOrUpdateBond.setName(bond.getName()); createOrUpdateBond.setSlaves(new HashSet<>(bond.getSlaves())); createOrUpdateBond.setBondOptions(bond.getBondOptions()); return createOrUpdateBond; } public static List<CreateOrUpdateBond> fromBonds(List<Bond> bonds) { List<CreateOrUpdateBond> result = new ArrayList<>(); for (Bond bond : bonds) { result.add(fromBond(bond)); } return result; } @Override public boolean equals(Object o) { if (this == o) { return true; } if (!(o instanceof CreateOrUpdateBond)) { return false; } CreateOrUpdateBond that = (CreateOrUpdateBond) o; return Objects.equals(getId(), that.getId()) && Objects.equals(getName(), that.getName()) && Objects.equals(getBondOptions(), that.getBondOptions()) && Objects.equals(getSlaves(), that.getSlaves()); } @Override public int hashCode() { return Objects.hash(getId(), getName(), getBondOptions(), getSlaves()); } @Override public Guid getId() { return id; } @Override public void setId(Guid id) { this.id = id; } @Override public String getName() { return name; } public void setName(String name) { this.name = name; } public String getBondOptions() { return bondOptions; } public void setBondOptions(String bondOptions) { this.bondOptions = bondOptions; } public Set<String> getSlaves() { return slaves; } public void setSlaves(Set<String> slaves) { this.slaves = slaves; } protected ToStringBuilder appendAttributes(ToStringBuilder tsb) { return tsb.append("id", getId()) .append("name", getName()) .append("bondingOptions", getBondOptions()) .append("slaves", getSlaves()); } @Override public String toString() { return appendAttributes(ToStringBuilder.forInstance(this)).build(); } }