public CapabilityServiceNameProvider(Capability capability, PathAddress address) { this.name = capability.getServiceName(address); }
@Override public void register(ManagementResourceRegistration registration) { for (Capability capability : this.capabilities) { registration.registerCapability(capability.getDefinition()); } } }
@Override public String getBaseDependentName() { return this.capability.getName(); }
@Override default ServiceName getServiceName(PathAddress address) { return this.resolve(address).getCapabilityServiceName(); } }
@Override default RuntimeCapability<?> resolve(PathAddress address) { return this.getCapability().resolve(address); }
@Override public ServiceName getServiceName(R requirement) { return this.capabilities.get(requirement).getServiceName(this.address); } }
protected String getDependentName(OperationContext context) { return this.capability.resolve(context.getCurrentAddress()).getName(); }
@Override default RuntimeCapability<?> getDefinition() { return this.getCapability().getDefinition(); }
@Override default ServiceName getServiceName(PathAddress address) { return this.getCapability().getServiceName(address); } }
@Override protected void recordCapabilitiesAndRequirements(OperationContext context, AttributeDefinition attribute, ModelNode newValue, ModelNode oldValue) { Map<Capability, Predicate<ModelNode>> capabilities = this.descriptor.getCapabilities(); if (!capabilities.isEmpty()) { PathAddress address = context.getCurrentAddress(); // newValue is already applied to the model ModelNode newModel = context.readResource(PathAddress.EMPTY_ADDRESS).getModel(); ModelNode oldModel = newModel.clone(); oldModel.get(attribute.getName()).set(oldValue); for (Map.Entry<Capability, Predicate<ModelNode>> entry : capabilities.entrySet()) { Capability capability = entry.getKey(); Predicate<ModelNode> predicate = entry.getValue(); boolean registered = predicate.test(oldModel); boolean shouldRegister = predicate.test(newModel); if (!registered && shouldRegister) { // Attribute change enables capability registration context.registerCapability(capability.resolve(address)); } else if (registered && !shouldRegister) { // Attribute change disables capability registration context.deregisterCapability(capability.resolve(address).getName()); } } } super.recordCapabilitiesAndRequirements(context, attribute, newValue, oldValue); }
@Override default Class<?> getType() { return this.getDefinition().getCapabilityServiceValueType(); }
@Override public int hashCode() { return this.capability.getName().hashCode(); }
@Override public void removeServices(OperationContext context, ModelNode model) throws OperationFailedException { PathAddress address = context.getCurrentAddress(); String name = context.getCurrentAddressValue(); String defaultCache = DEFAULT_CACHE.resolveModelAttribute(context, model).asString(null); if (defaultCache != null) { ServiceNameRegistry<ClusteringCacheRequirement> registry = new CapabilityServiceNameRegistry<>(DEFAULT_CLUSTERING_CAPABILITIES, address); for (IdentityCacheServiceConfiguratorProvider provider : ServiceLoader.load(IdentityCacheServiceConfiguratorProvider.class, IdentityCacheServiceConfiguratorProvider.class.getClassLoader())) { for (ServiceNameProvider configurator : provider.getServiceConfigurators(registry, name, null, defaultCache)) { context.removeService(configurator.getServiceName()); } } if (!defaultCache.equals(JndiNameFactory.DEFAULT_LOCAL_NAME)) { context.removeService(InfinispanBindingFactory.createCacheBinding(name, JndiNameFactory.DEFAULT_LOCAL_NAME).getBinderServiceName()); context.removeService(InfinispanBindingFactory.createCacheConfigurationBinding(name, JndiNameFactory.DEFAULT_LOCAL_NAME).getBinderServiceName()); } for (Capability capability : DEFAULT_CAPABILITIES.values()) { context.removeService(capability.getServiceName(address)); } } context.removeService(InfinispanBindingFactory.createCacheContainerBinding(name).getBinderServiceName()); context.removeService(CacheContainerComponent.MODULE.getServiceName(address)); for (Capability capability : EnumSet.allOf(CacheContainerResourceDefinition.Capability.class)) { context.removeService(capability.getServiceName(address)); } }
@Override protected void recordCapabilitiesAndRequirements(OperationContext context, ModelNode operation, Resource resource) throws OperationFailedException { PathAddress address = context.getCurrentAddress(); ModelNode model = resource.getModel(); // The super implementation assumes that the capability name is a simple extension of the base name - we do not. // Only register capabilities when allowed by the associated predicate for (Map.Entry<Capability, Predicate<ModelNode>> entry : this.descriptor.getCapabilities().entrySet()) { if (entry.getValue().test(model)) { context.registerCapability(entry.getKey().resolve(address)); } } ImmutableManagementResourceRegistration registration = context.getResourceRegistration(); for (String attributeName : registration.getAttributeNames(PathAddress.EMPTY_ADDRESS)) { AttributeDefinition attribute = registration.getAttributeAccess(PathAddress.EMPTY_ADDRESS, attributeName).getAttributeDefinition(); if (attribute.hasCapabilityRequirements()) { attribute.addCapabilityRequirements(context, resource, model.get(attributeName)); } } for (CapabilityReferenceRecorder recorder : context.getResourceRegistration().getRequirements()) { recorder.addCapabilityRequirements(context, resource, null); } }
@Override default String getName() { return this.getDefinition().getName(); }
@Override public String getBaseDependentName() { return this.capability.getName(); }
if (defaultCache != null) { for (Map.Entry<InfinispanCacheRequirement, Capability> entry : DEFAULT_CAPABILITIES.entrySet()) { new IdentityServiceConfigurator<>(entry.getValue().getServiceName(address), entry.getKey().getServiceName(context, name, defaultCache)).build(target).install(); new BinderServiceConfigurator(InfinispanBindingFactory.createCacheBinding(name, JndiNameFactory.DEFAULT_LOCAL_NAME), DEFAULT_CAPABILITIES.get(InfinispanCacheRequirement.CACHE).getServiceName(address)).build(target).install(); new BinderServiceConfigurator(InfinispanBindingFactory.createCacheConfigurationBinding(name, JndiNameFactory.DEFAULT_LOCAL_NAME), DEFAULT_CAPABILITIES.get(InfinispanCacheRequirement.CONFIGURATION).getServiceName(address)).build(target).install();
@Override protected void performRemove(OperationContext context, ModelNode operation, ModelNode model) throws OperationFailedException { Resource resource = context.readResource(PathAddress.EMPTY_ADDRESS); if (removeInCurrentStep(resource)) { // We need to remove capabilities *before* removing the resource, since the capability reference resolution might involve reading the resource PathAddress address = context.getCurrentAddress(); for (Map.Entry<Capability, Predicate<ModelNode>> entry : this.descriptor.getCapabilities().entrySet()) { if (entry.getValue().test(model)) { context.deregisterCapability(entry.getKey().resolve(address).getName()); } } ImmutableManagementResourceRegistration registration = context.getResourceRegistration(); for (String attributeName : registration.getAttributeNames(PathAddress.EMPTY_ADDRESS)) { AttributeDefinition attribute = registration.getAttributeAccess(PathAddress.EMPTY_ADDRESS, attributeName).getAttributeDefinition(); if (attribute.hasCapabilityRequirements()) { attribute.removeCapabilityRequirements(context, resource, model.get(attributeName)); } } for (CapabilityReferenceRecorder recorder : registration.getRequirements()) { recorder.removeCapabilityRequirements(context, resource, null); } if (this.requiresRuntime(context)) { for (RuntimeResourceRegistration runtimeRegistration : this.descriptor.getRuntimeResourceRegistrations()) { runtimeRegistration.unregister(context); } } } super.performRemove(context, operation, model); }
/** * Resolves this capability against the specified path address * @param address a path address * @return a resolved runtime capability */ default RuntimeCapability<?> resolve(PathAddress address) { RuntimeCapability<?> definition = this.getDefinition(); return definition.isDynamicallyNamed() ? definition.fromBaseCapability(address) : definition; }