All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.wildfly.clustering.server.infinispan.EmbeddedCacheManagerGroup Maven / Gradle / Ivy

/*
 * Copyright The WildFly Authors
 * SPDX-License-Identifier: Apache-2.0
 */

package org.wildfly.clustering.server.infinispan;

import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

import org.wildfly.clustering.server.GroupMembership;
import org.wildfly.clustering.server.GroupMembershipEvent;
import org.wildfly.clustering.server.GroupMembershipListener;
import org.wildfly.clustering.server.GroupMembershipMergeEvent;
import org.wildfly.clustering.server.Registration;
import org.wildfly.clustering.server.group.Group;
import org.wildfly.clustering.server.group.GroupMember;

/**
 * A group composed of embedded cache manager members.
 * @param  the group member address type
 * @param  the group member type
 * @author Paul Ferraro
 */
public class EmbeddedCacheManagerGroup, M extends GroupMember> implements CacheContainerGroup {

	private final Group group;
	private final Function wrapper;
	private final CacheContainerGroupMemberFactory factory;
	private final CacheContainerGroupMember localMember;

	public EmbeddedCacheManagerGroup(EmbeddedCacheManagerGroupConfiguration configuration) {
		this.group = configuration.getGroup();
		this.factory = new EmbeddedCacheManagerGroupMemberFactory(configuration);
		this.wrapper = configuration.getAddressWrapper().compose(GroupMember::getAddress).andThen(this.factory::createGroupMember);
		this.localMember = this.wrapper.apply(this.group.getLocalMember());
	}

	@Override
	public String getName() {
		return this.group.getName();
	}

	@Override
	public CacheContainerGroupMember getLocalMember() {
		return this.localMember;
	}

	@Override
	public GroupMembership getMembership() {
		return this.wrap(this.group.getMembership());
	}

	@Override
	public boolean isSingleton() {
		return this.group.isSingleton();
	}

	@Override
	public Registration register(GroupMembershipListener listener) {
		return this.group.register(new GroupMembershipListener<>() {

			@Override
			public void updated(GroupMembershipEvent event) {
				listener.updated(new CacheContainerGroupMembershipEvent(event));
			}

			@Override
			public void split(GroupMembershipEvent event) {
				listener.split(new CacheContainerGroupMembershipEvent(event));
			}

			@Override
			public void merged(GroupMembershipMergeEvent event) {
				listener.merged(new CacheContainerGroupMembershipMergeEvent(event));
			}
		});
	}

	@Override
	public CacheContainerGroupMemberFactory getGroupMemberFactory() {
		return this.factory;
	}

	GroupMembership wrap(GroupMembership membership) {
		return new CacheGroupMembership<>(membership, this.wrapper);
	}

	static class CacheGroupMembership, M extends GroupMember> implements GroupMembership {
		private final GroupMembership membership;
		private final List members;
		private final CacheContainerGroupMember coordinator;

		CacheGroupMembership(GroupMembership membership, Function wrapper) {
			this.membership = membership;
			this.members = membership.getMembers().stream().map(wrapper).collect(Collectors.toUnmodifiableList());
			this.coordinator = wrapper.apply(membership.getCoordinator());
		}

		@Override
		public CacheContainerGroupMember getCoordinator() {
			return this.coordinator;
		}

		@Override
		public List getMembers() {
			return this.members;
		}

		@Override
		public int hashCode() {
			return this.membership.hashCode();
		}

		@Override
		public boolean equals(Object object) {
			if (!(object instanceof CacheGroupMembership)) return false;
			@SuppressWarnings("unchecked")
			CacheGroupMembership membership = (CacheGroupMembership) object;
			return this.membership.equals(membership.membership);
		}

		@Override
		public String toString() {
			return this.membership.toString();
		}
	}

	class CacheContainerGroupMembershipEvent implements GroupMembershipEvent {
		private final GroupMembership previousMembership;
		private final GroupMembership currentMembership;

		CacheContainerGroupMembershipEvent(GroupMembershipEvent event) {
			this.previousMembership = EmbeddedCacheManagerGroup.this.wrap(event.getPreviousMembership());
			this.currentMembership = EmbeddedCacheManagerGroup.this.wrap(event.getCurrentMembership());
		}

		@Override
		public GroupMembership getPreviousMembership() {
			return this.previousMembership;
		}

		@Override
		public GroupMembership getCurrentMembership() {
			return this.currentMembership;
		}
	}

	class CacheContainerGroupMembershipMergeEvent extends CacheContainerGroupMembershipEvent implements GroupMembershipMergeEvent {
		private final List> partitions;

		CacheContainerGroupMembershipMergeEvent(GroupMembershipMergeEvent event) {
			super(event);
			this.partitions = event.getPartitions().stream().map(EmbeddedCacheManagerGroup.this::wrap).collect(Collectors.toUnmodifiableList());
		}

		@Override
		public List> getPartitions() {
			return this.partitions;
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy