Skip to content

Commit

Permalink
WFLY-16130 Refactor clustering API service name generation to elimina…
Browse files Browse the repository at this point in the history
…te ServiceNameRegistry
  • Loading branch information
pferraro committed Mar 21, 2022
1 parent 9f9d607 commit 9681abe
Show file tree
Hide file tree
Showing 55 changed files with 759 additions and 617 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
/*
* JBoss, Home of Professional Open Source.
* Copyright 2022, Red Hat, Inc., and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.jboss.as.clustering.controller;

import java.util.function.BiConsumer;
import java.util.function.Consumer;

import org.jboss.as.controller.OperationContext;
import org.jboss.as.controller.capability.CapabilityServiceSupport;
import org.wildfly.clustering.service.ServiceConfigurator;

/**
* A {@link CapabilityServiceConfigurator} facade for collecting, configuring, and building; or removing; a set of {@link ServiceConfigurator} instances.
* @author Paul Ferraro
*/
public class CompositeCapabilityServiceConfigurator extends CompositeServiceConfigurator implements CapabilityServiceConfigurator {
private final BiConsumer<CapabilityServiceSupport, Consumer<ServiceConfigurator>> consumer;

public CompositeCapabilityServiceConfigurator(BiConsumer<CapabilityServiceSupport, Consumer<ServiceConfigurator>> consumer) {
this.consumer = consumer;
}

@Override
public CompositeServiceConfigurator configure(CapabilityServiceSupport support) {
this.consumer.accept(support, this);
return this;
}

public void remove(OperationContext context) {
this.consumer.accept(context.getCapabilityServiceSupport(), configurator -> context.removeService(configurator.getServiceName()));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
/*
* JBoss, Home of Professional Open Source.
* Copyright 2022, Red Hat, Inc., and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.jboss.as.clustering.controller;

import java.util.function.Consumer;
import java.util.function.Supplier;

import org.jboss.msc.Service;
import org.jboss.msc.service.DelegatingServiceBuilder;
import org.jboss.msc.service.LifecycleListener;
import org.jboss.msc.service.ServiceBuilder;
import org.jboss.msc.service.ServiceController;
import org.jboss.msc.service.ServiceName;

/**
* A {@link ServiceBuilder} facade for installing a set of {@link ServiceBuilder} instances.
* @author Paul Ferraro
*/
public class CompositeServiceBuilder<T> extends DelegatingServiceBuilder<T> {

private final Iterable<ServiceBuilder<?>> builders;

public CompositeServiceBuilder(Iterable<ServiceBuilder<?>> builders) {
super(null);
this.builders = builders;
}

@Override
public ServiceBuilder<T> setInitialMode(ServiceController.Mode mode) {
for (ServiceBuilder<?> builder : this.builders) {
builder.setInitialMode(mode);
}
return this;
}

@Override
public ServiceBuilder<T> addListener(LifecycleListener listener) {
for (ServiceBuilder<?> builder : this.builders) {
builder.addListener(listener);
}
return this;
}

@Override
public ServiceController<T> install() {
for (ServiceBuilder<?> builder : this.builders) {
builder.install();
}
return null;
}

@Override
public <V> Supplier<V> requires(ServiceName name) {
throw new UnsupportedOperationException();
}

@Override
public <V> Consumer<V> provides(ServiceName... names) {
throw new UnsupportedOperationException();
}

@Override
public ServiceBuilder<T> setInstance(Service service) {
throw new UnsupportedOperationException();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
/*
* JBoss, Home of Professional Open Source.
* Copyright 2022, Red Hat, Inc., and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.jboss.as.clustering.controller;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.function.Consumer;

import org.jboss.msc.service.ServiceBuilder;
import org.jboss.msc.service.ServiceName;
import org.jboss.msc.service.ServiceTarget;
import org.wildfly.clustering.service.ServiceConfigurator;

/**
* A {@link ServiceConfigurator} facade for collecting and building a set of {@link ServiceConfigurator} instances.
* @author Paul Ferraro
*/
public class CompositeServiceConfigurator implements ServiceConfigurator, Consumer<ServiceConfigurator> {

private final List<ServiceConfigurator> configurators = new LinkedList<>();

@Override
public ServiceName getServiceName() {
return null;
}

@Override
public ServiceBuilder<?> build(ServiceTarget target) {
List<ServiceBuilder<?>> builders = new ArrayList<>(this.configurators.size());
for (ServiceConfigurator configurator : this.configurators) {
builders.add(configurator.build(target));
}
return new CompositeServiceBuilder<>(builders);
}

@Override
public void accept(ServiceConfigurator configurator) {
this.configurators.add(configurator);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,24 +23,15 @@
package org.wildfly.extension.clustering.ejb;

import org.jboss.as.clustering.controller.CapabilityServiceConfigurator;
import org.jboss.as.controller.ServiceNameFactory;
import org.jboss.as.network.ClientMapping;
import org.jboss.msc.service.ServiceName;
import org.wildfly.clustering.ee.CompositeIterable;
import org.wildfly.clustering.ejb.ClientMappingsRegistryProvider;
import org.wildfly.clustering.ejb.infinispan.ClientMappingsRegistryEntryServiceConfigurator;
import org.wildfly.clustering.service.ServiceNameRegistry;
import org.wildfly.clustering.service.SupplierDependency;
import org.wildfly.clustering.spi.CacheServiceConfiguratorProvider;
import org.wildfly.clustering.spi.ClusteringCacheRequirement;
import org.wildfly.clustering.spi.LocalCacheServiceConfiguratorProvider;
import org.wildfly.clustering.spi.ProvidedCacheServiceConfigurator;
import org.wildfly.clustering.spi.group.LocalCacheGroupServiceConfiguratorProvider;
import org.wildfly.clustering.spi.registry.LocalRegistryServiceConfiguratorProvider;

import java.util.Arrays;
import java.util.EnumSet;
import java.util.LinkedList;
import java.util.List;
import java.util.ServiceLoader;
import java.util.Set;

/**
* A local client mappings registry provider implementation.
Expand All @@ -49,24 +40,13 @@
* @author Richard Achmatowicz
*/
public class LocalClientMappingsRegistryProvider implements ClientMappingsRegistryProvider {
static final Set<ClusteringCacheRequirement> REGISTRY_REQUIREMENTS = EnumSet.of(ClusteringCacheRequirement.REGISTRY, ClusteringCacheRequirement.REGISTRY_FACTORY, ClusteringCacheRequirement.GROUP);
static final String NAME = "ejb";

@Override
public Iterable<CapabilityServiceConfigurator> getServiceConfigurators(String connectorName, SupplierDependency<List<ClientMapping>> clientMappings) {
CapabilityServiceConfigurator registryEntryConfigurator = new ClientMappingsRegistryEntryServiceConfigurator(NAME, connectorName, clientMappings);
List<Iterable<CapabilityServiceConfigurator>> configurators = new LinkedList<>();
configurators.add(Arrays.asList(registryEntryConfigurator));
ServiceNameRegistry<ClusteringCacheRequirement> routingRegistry = new ServiceNameRegistry<ClusteringCacheRequirement>() {
@Override
public ServiceName getServiceName(ClusteringCacheRequirement requirement) {
return REGISTRY_REQUIREMENTS.contains(requirement) ? ServiceNameFactory.parseServiceName(requirement.getName()).append(NAME, connectorName) : null;
}
};
// install the underlying cache service abstractions using the configured provider
for (CacheServiceConfiguratorProvider provider : ServiceLoader.load(LocalCacheServiceConfiguratorProvider.class, LocalCacheServiceConfiguratorProvider.class.getClassLoader())) {
configurators.add(provider.getServiceConfigurators(routingRegistry, NAME, connectorName));
}
return new CompositeIterable<>(configurators);
CapabilityServiceConfigurator registryConfigurator = new ProvidedCacheServiceConfigurator<>(LocalRegistryServiceConfiguratorProvider.class, NAME, connectorName);
CapabilityServiceConfigurator groupConfigurator = new ProvidedCacheServiceConfigurator<>(LocalCacheGroupServiceConfiguratorProvider.class, NAME, connectorName);
return List.of(registryEntryConfigurator, registryConfigurator, groupConfigurator);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,7 @@
package org.wildfly.clustering.ejb.infinispan;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.ServiceLoader;
import java.util.function.Consumer;

import org.infinispan.configuration.cache.ConfigurationBuilder;
Expand All @@ -36,21 +33,18 @@
import org.jboss.as.controller.ServiceNameFactory;
import org.jboss.as.server.deployment.Services;
import org.jboss.msc.service.ServiceName;
import org.wildfly.clustering.ee.CompositeIterable;
import org.wildfly.clustering.ejb.StatefulBeanConfiguration;
import org.wildfly.clustering.ejb.BeanManagerFactory;
import org.wildfly.clustering.ejb.BeanManagerFactoryServiceConfiguratorConfiguration;
import org.wildfly.clustering.ejb.BeanManagementProvider;
import org.wildfly.clustering.ejb.StatefulBeanConfiguration;
import org.wildfly.clustering.ejb.infinispan.logging.InfinispanEjbLogger;
import org.wildfly.clustering.infinispan.container.DataContainerConfigurationBuilder;
import org.wildfly.clustering.infinispan.service.CacheServiceConfigurator;
import org.wildfly.clustering.infinispan.service.InfinispanCacheRequirement;
import org.wildfly.clustering.infinispan.service.TemplateConfigurationServiceConfigurator;
import org.wildfly.clustering.service.ServiceDependency;
import org.wildfly.clustering.service.ServiceNameRegistry;
import org.wildfly.clustering.spi.CacheServiceConfiguratorProvider;
import org.wildfly.clustering.spi.ClusteringCacheRequirement;
import org.wildfly.clustering.spi.DistributedCacheServiceConfiguratorProvider;
import org.wildfly.clustering.spi.ProvidedCacheServiceConfigurator;
import org.wildfly.clustering.spi.group.DistributedCacheGroupServiceConfiguratorProvider;

/**
* Builds an infinispan-based {@link BeanManagerFactory}.
Expand Down Expand Up @@ -107,20 +101,8 @@ public Iterable<CapabilityServiceConfigurator> getDeploymentServiceConfigurators

CapabilityServiceConfigurator configurationConfigurator = new TemplateConfigurationServiceConfigurator(ServiceNameFactory.parseServiceName(InfinispanCacheRequirement.CONFIGURATION.getName()).append(containerName, cacheName), containerName, cacheName, templateCacheName, configurator);
CapabilityServiceConfigurator cacheConfigurator = new CacheServiceConfigurator<>(ServiceNameFactory.parseServiceName(InfinispanCacheRequirement.CACHE.getName()).append(containerName, cacheName), containerName, cacheName).require(new ServiceDependency(name.append("marshalling")));

List<Iterable<CapabilityServiceConfigurator>> configurators = new LinkedList<>();
configurators.add(Arrays.asList(configurationConfigurator, cacheConfigurator));

ServiceNameRegistry<ClusteringCacheRequirement> registry = new ServiceNameRegistry<ClusteringCacheRequirement>() {
@Override
public ServiceName getServiceName(ClusteringCacheRequirement requirement) {
return (requirement == ClusteringCacheRequirement.GROUP) ? ServiceNameFactory.parseServiceName(requirement.getName()).append(containerName, cacheName) : null;
}
};
for (CacheServiceConfiguratorProvider provider : ServiceLoader.load(DistributedCacheServiceConfiguratorProvider.class, DistributedCacheServiceConfiguratorProvider.class.getClassLoader())) {
configurators.add(provider.getServiceConfigurators(registry, containerName, cacheName));
}
return new CompositeIterable<>(configurators);
CapabilityServiceConfigurator groupConfigurator = new ProvidedCacheServiceConfigurator<>(DistributedCacheGroupServiceConfiguratorProvider.class, containerName, cacheName);
return List.of(configurationConfigurator, cacheConfigurator, groupConfigurator);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,24 +25,16 @@
import org.jboss.as.clustering.controller.CapabilityServiceConfigurator;
import org.jboss.as.controller.ServiceNameFactory;
import org.jboss.as.network.ClientMapping;
import org.jboss.msc.service.ServiceName;
import org.wildfly.clustering.ee.CompositeIterable;
import org.wildfly.clustering.ejb.ClientMappingsRegistryProvider;
import org.wildfly.clustering.infinispan.service.CacheServiceConfigurator;
import org.wildfly.clustering.infinispan.service.InfinispanCacheRequirement;
import org.wildfly.clustering.infinispan.service.TemplateConfigurationServiceConfigurator;
import org.wildfly.clustering.service.ServiceNameRegistry;
import org.wildfly.clustering.service.SupplierDependency;
import org.wildfly.clustering.spi.CacheServiceConfiguratorProvider;
import org.wildfly.clustering.spi.ClusteringCacheRequirement;
import org.wildfly.clustering.spi.DistributedCacheServiceConfiguratorProvider;
import org.wildfly.clustering.spi.ProvidedCacheServiceConfigurator;
import org.wildfly.clustering.spi.group.DistributedCacheGroupServiceConfiguratorProvider;
import org.wildfly.clustering.spi.registry.DistributedRegistryServiceConfiguratorProvider;

import java.util.Arrays;
import java.util.EnumSet;
import java.util.LinkedList;
import java.util.List;
import java.util.ServiceLoader;
import java.util.Set;

/**
* The non-legacy version of the client mappings registry provider, used when the distributable-ejb subsystem is present.
Expand All @@ -51,7 +43,6 @@
* @author Richard Achmatowicz
*/
public class InfinispanClientMappingsRegistryProvider implements ClientMappingsRegistryProvider {
static final Set<ClusteringCacheRequirement> REGISTRY_REQUIREMENTS = EnumSet.of(ClusteringCacheRequirement.REGISTRY, ClusteringCacheRequirement.REGISTRY_FACTORY, ClusteringCacheRequirement.GROUP);

private final String containerName ;
private final String cacheName;
Expand All @@ -72,19 +63,8 @@ public Iterable<CapabilityServiceConfigurator> getServiceConfigurators(String co
CapabilityServiceConfigurator configurationConfigurator = new TemplateConfigurationServiceConfigurator(ServiceNameFactory.parseServiceName(InfinispanCacheRequirement.CONFIGURATION.getName()).append(this.containerName, connectorName), this.containerName, connectorName, this.cacheName);
CapabilityServiceConfigurator cacheConfigurator = new CacheServiceConfigurator<>(ServiceNameFactory.parseServiceName(InfinispanCacheRequirement.CACHE.getName()).append(this.containerName, connectorName), this.containerName, connectorName);
CapabilityServiceConfigurator registryEntryConfigurator = new ClientMappingsRegistryEntryServiceConfigurator(this.containerName, connectorName, clientMappings);
List<Iterable<CapabilityServiceConfigurator>> configurators = new LinkedList<>();
configurators.add(Arrays.asList(configurationConfigurator, cacheConfigurator, registryEntryConfigurator));
String containerName = this.containerName;
ServiceNameRegistry<ClusteringCacheRequirement> routingRegistry = new ServiceNameRegistry<ClusteringCacheRequirement>() {
@Override
public ServiceName getServiceName(ClusteringCacheRequirement requirement) {
return REGISTRY_REQUIREMENTS.contains(requirement) ? ServiceNameFactory.parseServiceName(requirement.getName()).append(containerName, connectorName) : null;
}
};
// install the underlying cache service abstractions using the configured provider
for (CacheServiceConfiguratorProvider provider : ServiceLoader.load(DistributedCacheServiceConfiguratorProvider.class, DistributedCacheServiceConfiguratorProvider.class.getClassLoader())) {
configurators.add(provider.getServiceConfigurators(routingRegistry, this.containerName, connectorName));
}
return new CompositeIterable<>(configurators);
CapabilityServiceConfigurator groupConfigurator = new ProvidedCacheServiceConfigurator<>(DistributedCacheGroupServiceConfiguratorProvider.class, this.containerName, connectorName);
CapabilityServiceConfigurator registryConfigurator = new ProvidedCacheServiceConfigurator<>(DistributedRegistryServiceConfiguratorProvider.class, this.containerName, connectorName);
return List.of(configurationConfigurator, cacheConfigurator, registryEntryConfigurator, registryConfigurator, groupConfigurator);
}
}

0 comments on commit 9681abe

Please sign in to comment.