/*
 * Copyright IBM Corporation, 2013.  All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 */
package org.opendaylight.controller.samples.loadbalancer.entities;

import java.util.ArrayList;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

/**
 * This class represents the pool of hosts among which incoming traffic
 * will be load balanced. Each pool will load balance the traffic among its pool members
 * based on the loadbalancing policy set for the pool.
 * Currently, the pool supports two load balancing policies:
 * 1. Round Robin Policy{@link org.opendaylight.controller.samples.loadbalancer.policies.RoundRobinLBPolicy}
 * 2. Random Policy {@link org.opendaylight.controller.samples.loadbalancer.policies.RandomLBPolicy}
 *
 * NOTE: After creation of the pool, user can't update (change) its load balancing policy.
 * NOTE: Each Pool should have a unique name.
 */

@XmlRootElement(name="pool")
@XmlAccessorType(XmlAccessType.NONE)
public class Pool {

    /*
     * Unique name of the pool
     */
    @XmlElement
    private String name;

    /*
     * Associated load balancing policy
     */
    @XmlElement(name="lbmethod")
    private String lbMethod;

    /*
     * Status of the pool (active/inactive)
     */
    @XmlElement
    private String status;

    /*
     * List of all the VIPs using this pool for load balancing their traffic - more than
     * one VIP can be mapped to each pool.
     */
    @XmlElement
    private ArrayList<VIP> vips = new ArrayList<VIP>();

    /*
     * List of all the pool members used for load balancing the traffic
     */
    @XmlElement
    private ArrayList<PoolMember> members = new ArrayList<PoolMember>();

    /*
     * Private constructor used for JAXB mapping
     */
    @SuppressWarnings("unused")
    private Pool() {}

    /**
     * Getter/ Setter methods
     */

    public Pool(String name,
                    String lbMethod) {
        this.name = name;
        this.lbMethod = lbMethod;
    }

    /**
     * @return the name
     */
    public String getName() {
        return name;
    }

    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * @return the lbMethod
     */
    public String getLbMethod() {
        return lbMethod;
    }

    /**
     * @param lbMethod the lbMethod to set
     */
    public void setLbMethod(String lbMethod) {
        this.lbMethod = lbMethod;
    }

    /**
     * @return the status
     */
    public String getStatus() {
        return status;
    }

    /**
     * @param status the status to set
     */
    public void setStatus(String status) {
        this.status = status;
    }

    /**
     * @return the vip
     */
    public ArrayList<VIP> getAllVip() {
        return vips;
    }

    /**
     * @param vip the vip to set
     */
    public void setVips(ArrayList<VIP> vips) {
        this.vips = vips;
    }

    /**
     * @return the members
     */
    public ArrayList<PoolMember> getAllMembers() {
        return members;
    }

    /**
     * @param members the members to set
     */
    public void setMembers(ArrayList<PoolMember> members) {
        this.members = members;
    }

    /**
     * Add new VIP to the VIP list
     * @param vip       new VIP to add
     */
    public void addVIP(VIP vip){
        this.vips.add(vip);
    }

    /**
     * Remove VIP with given name from the VIP list of the pool
     * @param name      Name of the VIP
     * @return  true     If VIP was using this pool and removed
     *          false   IF VIP is not using this pool
     */
    public boolean removeVIP(String name){
        for(VIP vip: this.vips){
            if(vip.getName().equals(name)){
                this.members.remove(vip);
                return true;
            }
        }
        return false;
    }

    /**
     * Check if the given pool member is part of this pool
     * @param pm        Search for this pool member
     * @return  true     If pool member is attached to this pool
     *          false   else
     */
    public boolean poolMemberExists(PoolMember pm){
        return this.members.contains(pm);
    }

    /**
     * Returns the pool member with the given name
     * @param name      Search for this pool member
     * @return  PoolMember       If pool member is attached to this pool
     *          null            else
     */
    public PoolMember getMember(String name){

        for(PoolMember pm: this.members){
            if(pm.getName().equals(name)){
                return pm;
            }
        }
        return null;
    }

    /**
     * Add new pool member to the pool
     * @param pm        Add this new pool
     */
    public void addMember(PoolMember pm){
        this.members.add(pm);
    }

    /**
     * Remove pool member from the pool list
     * @param name Remove this pool member
     * @return  true    If pool member was attached to this pool and successfully removed
     *          false   If pool member is not attached to this pool
     */
    public boolean removeMember(String name){
        for(PoolMember pm: this.members){
            if(pm.getName().equals(name)){
                this.members.remove(pm);
                return true;
            }
        }
        return false;
    }

    /* (non-Javadoc)
     * @see java.lang.Object#hashCode()
     */
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result+ ((lbMethod == null) ? 0 : lbMethod.hashCode());
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }

    /* (non-Javadoc)
     * @see java.lang.Object#equals(java.lang.Object)
     */
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (!(obj instanceof Pool)) {
            return false;
        }
        Pool other = (Pool) obj;
        if (lbMethod == null) {
            if (other.lbMethod != null) {
                return false;
            }
        }else if (!lbMethod.equals(other.lbMethod)) {
            return false;
        }
        if (name == null) {
            if (other.name != null) {
                return false;
            }
        }else if (!name.equals(other.name)) {
            return false;
        }
        return true;
    }

    /* (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return "Pool [name=" + name + ", lbMethod=" + lbMethod + ", status="
                            + status + ", vips=" + vips + ", members=" + members + "]";
    }
}
@@ -4066,38 +4066,35 @@
            this.
-member
+vip
 s.remove(vip);%0A 

Remove vip from the vips collections instead of members.