![JAR search and dependency download from the Maven repository](/logo.png)
com.dell.cpsd.hdp.capability.registry.client.binder.CapabilityBinder Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of hdp-capability-registry-client Show documentation
Show all versions of hdp-capability-registry-client Show documentation
This repository contains the source code for the capability registry API.
This API exposes the interface through which a consumer or provider interacts with the capability registry.
/**
* Copyright © 2017 Dell Inc. or its subsidiaries. All Rights Reserved.
*/
package com.dell.cpsd.hdp.capability.registry.client.binder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import com.dell.cpsd.common.logging.ILogger;
import com.dell.cpsd.hdp.capability.registry.api.CapabilityProvider;
import com.dell.cpsd.hdp.capability.registry.client.CapabilityRegistryException;
import com.dell.cpsd.hdp.capability.registry.client.ICapabilityProviderRegistrationListener;
import com.dell.cpsd.hdp.capability.registry.client.ICapabilityRegistryLookupManager;
import com.dell.cpsd.hdp.capability.registry.client.log.HDCRLoggingManager;
import com.dell.cpsd.hdp.capability.registry.client.log.HDCRMessageCode;
import com.dell.cpsd.service.common.client.exception.ServiceTimeoutException;
/**
*
* Copyright © 2017 Dell Inc. or its subsidiaries. All Rights Reserved.
* Dell EMC Confidential/Proprietary Information
*
*
* @since 1.0
*/
public class CapabilityBinder
{
/**
* The logger for this class.
*/
private static final ILogger LOGGER = HDCRLoggingManager.getLogger(CapabilityBinder.class);
private final Map existingBindings = Collections.synchronizedMap(new HashMap<>());
private final CapabilityBindingService capabilityBindingService;
private final List capabilityMatchers = new ArrayList<>();
public CapabilityBinder(CapabilityBindingService capabilityBindingService, CapabilityMatcher... capabilityMatchers)
{
this.capabilityBindingService = capabilityBindingService;
if (capabilityMatchers != null)
{
this.capabilityMatchers.addAll(Arrays.asList(capabilityMatchers));
}
}
/**
* Registers capability manager for bind and unbind events
*
* @param capabilityRegistryLookupManager
* The capability register service client
*/
public void register(ICapabilityRegistryLookupManager capabilityRegistryLookupManager)
{
ICapabilityProviderRegistrationListener capabilityProviderRegistrationListener = new ICapabilityProviderRegistrationListener()
{
@Override
public void registered(CapabilityProvider capabilityProvider, String s)
{
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(() -> tryBind());
executor.shutdown();
}
@Override
public void unregistered(CapabilityProvider capabilityProvider, String s)
{
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(() -> tryUnbind(capabilityProvider));
executor.shutdown();
}
};
capabilityRegistryLookupManager.addCapabilityProviderRegistrationListener(capabilityProviderRegistrationListener);
}
private void tryBind()
{
try
{
bind();
}
catch (ServiceTimeoutException | CapabilityRegistryException e)
{
LOGGER.warn(HDCRMessageCode.NO_CAPABILITY_PROVIDER_W.getMessageCode());
}
}
private void tryUnbind(CapabilityProvider capabilityProvider)
{
try
{
unbind(capabilityProvider);
}
catch (ServiceTimeoutException | CapabilityRegistryException e)
{
LOGGER.warn(HDCRMessageCode.NO_CAPABILITY_PROVIDER_W.getMessageCode());
}
}
/**
* Binds capabilities
*
* @throws ServiceTimeoutException
* Thrown if the request times out.
* @throws CapabilityRegistryException
* Thrown if the request fails.
*/
public synchronized void bind() throws ServiceTimeoutException, CapabilityRegistryException
{
final Map latestBindings = new HashMap<>();
List capabilities = capabilityBindingService.lookupCapabilities(capabilityMatchers
.toArray(new CapabilityMatcher[] {}));
for (CapabilityData capabilityData : capabilities)
{
CapabilityBindingKey bindingKey = createCapabilityBindingKey(capabilityData);
latestBindings.put(bindingKey, capabilityData);
if (!existingBindings.containsKey(bindingKey))
{
existingBindings.put(bindingKey, capabilityData);
capabilityBindingService.add(capabilityData);
}
}
for (Map.Entry entry : existingBindings.entrySet())
{
if (!latestBindings.containsKey(entry.getKey()))
{
existingBindings.remove(entry.getKey());
capabilityBindingService.remove(entry.getValue());
}
}
}
/**
* Unbinds a capability
*
* @param provider
* The capability provider
* @throws ServiceTimeoutException
* Thrown if the request times out.
* @throws CapabilityRegistryException
* Thrown if the request fails.
*/
public synchronized void unbind(CapabilityProvider provider) throws ServiceTimeoutException, CapabilityRegistryException
{
boolean rebindNeeded = false;
for (CapabilityMatcher capabilityMatcher : capabilityMatchers)
{
List capabilities = capabilityMatcher.match(Arrays.asList(provider));
for (CapabilityData capabilityData : capabilities)
{
CapabilityBindingKey bindingKey = createCapabilityBindingKey(capabilityData);
if (existingBindings.containsKey(bindingKey))
{
existingBindings.remove(bindingKey);
capabilityBindingService.remove(capabilityData);
rebindNeeded = true;
}
}
}
if (rebindNeeded)
{
bind();
}
}
public Collection getCurrentCapabilities()
{
return new ArrayList<>(existingBindings.values());
}
private CapabilityBindingKey createCapabilityBindingKey(CapabilityData capabilityData)
{
return new CapabilityBindingKey(capabilityData.getCapability().getProfile(), capabilityData.getProvider().getIdentity()
.getInstanceId());
}
private static final class CapabilityBindingKey
{
private String capabilityName;
private String providerId;
public CapabilityBindingKey(String capabilityName, String providerId)
{
this.capabilityName = capabilityName;
this.providerId = providerId;
}
@Override
public boolean equals(Object o)
{
if (this == o)
{
return true;
}
if (o == null || getClass() != o.getClass())
{
return false;
}
CapabilityBindingKey that = (CapabilityBindingKey) o;
if (capabilityName != null ? !capabilityName.equals(that.capabilityName) : that.capabilityName != null)
{
return false;
}
return providerId != null ? providerId.equals(that.providerId) : that.providerId == null;
}
@Override
public int hashCode()
{
int result = capabilityName != null ? capabilityName.hashCode() : 0;
result = 31 * result + (providerId != null ? providerId.hashCode() : 0);
return result;
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy