/* * Copyright (c) 2008-2017, Hazelcast, Inc. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.hazelcast.internal.cluster.impl; import com.hazelcast.instance.MemberImpl; import com.hazelcast.internal.cluster.MemberInfo; import com.hazelcast.nio.Address; import com.hazelcast.nio.ObjectDataInput; import com.hazelcast.nio.ObjectDataOutput; import com.hazelcast.nio.serialization.IdentifiedDataSerializable; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; import static java.util.Collections.unmodifiableList; /** * MembersView is a container object to carry member list and version together. */ public final class MembersView implements IdentifiedDataSerializable { private int version; private List<MemberInfo> members; public MembersView() { } public MembersView(int version, List<MemberInfo> members) { this.version = version; this.members = members; } /** * Creates clone of source {@link MembersView} additionally including new members. * * @param source source map * @param newMembers new members to add * @return clone map */ static MembersView cloneAdding(MembersView source, Collection<MemberInfo> newMembers) { List<MemberInfo> list = new ArrayList<MemberInfo>(source.size() + newMembers.size()); list.addAll(source.getMembers()); list.addAll(newMembers); return new MembersView(source.version + 1, unmodifiableList(list)); } /** * Creates a new {@code MemberMap} including given members. * * @param version version * @param members members * @return a new {@code MemberMap} */ public static MembersView createNew(int version, Collection<MemberImpl> members) { List<MemberInfo> list = new ArrayList<MemberInfo>(members.size()); for (MemberImpl member : members) { list.add(new MemberInfo(member)); } return new MembersView(version, unmodifiableList(list)); } public List<MemberInfo> getMembers() { return members; } public int size() { return members.size(); } public int getVersion() { return version; } MemberMap toMemberMap() { MemberImpl[] m = new MemberImpl[size()]; int ix = 0; for (MemberInfo memberInfo : members) { m[ix++] = memberInfo.toMember(); } return MemberMap.createNew(version, m); } public boolean containsAddress(Address address) { for (MemberInfo member : members) { if (member.getAddress().equals(address)) { return true; } } return false; } public boolean containsMember(Address address, String uuid) { for (MemberInfo member : members) { if (member.getAddress().equals(address)) { return member.getUuid().equals(uuid); } } return false; } public Set<Address> getAddresses() { Set<Address> addresses = new HashSet<Address>(members.size()); for (MemberInfo member : members) { addresses.add(member.getAddress()); } return addresses; } public boolean isLaterThan(MembersView other) { return version > other.version; } @Override public int getFactoryId() { return ClusterDataSerializerHook.F_ID; } @Override public int getId() { return ClusterDataSerializerHook.MEMBERS_VIEW; } @Override public void writeData(ObjectDataOutput out) throws IOException { out.writeInt(version); out.writeInt(members.size()); for (MemberInfo member : members) { member.writeData(out); } } @Override public void readData(ObjectDataInput in) throws IOException { version = in.readInt(); int size = in.readInt(); List<MemberInfo> members = new ArrayList<MemberInfo>(size); for (int i = 0; i < size; i++) { MemberInfo member = new MemberInfo(); member.readData(in); members.add(member); } this.members = unmodifiableList(members); } @Override public String toString() { return "MembersView{" + "version=" + version + ", members=" + members + '}'; } }