package org.fluentlenium.core.events;
import lombok.AllArgsConstructor;
import org.fluentlenium.core.components.ComponentsAccessor;
import org.fluentlenium.core.components.ComponentsListener;
import org.openqa.selenium.WebElement;
import java.util.IdentityHashMap;
import java.util.Iterator;
import java.util.Map;
/**
* Listen to components registration to register their events annotations couterparts.
*/
public class ComponentsEventsRegistry implements ComponentsListener {
private final EventsRegistry registry;
private final ComponentsAccessor componentsAccessor;
private final Map<RegistryKey, ContainerAnnotationsEventsRegistry> allRegistries = new IdentityHashMap<>();
@AllArgsConstructor
public static class RegistryKey {
WebElement element;
Object component;
}
/**
* Constructor
*
* @param registry events registry
* @param componentsAccessor components accessor
*/
public ComponentsEventsRegistry(EventsRegistry registry, ComponentsAccessor componentsAccessor) {
this.registry = registry;
this.componentsAccessor = componentsAccessor;
this.componentsAccessor.addComponentsListener(this);
}
@Override
public void componentRegistered(WebElement element, Object component) {
ContainerAnnotationsEventsRegistry containerRegistry = new ContainerAnnotationsEventsRegistry(registry, component,
element);
if (containerRegistry.getListenerCount() > 0) {
allRegistries.put(new RegistryKey(element, component), containerRegistry);
}
}
@Override
public void componentReleased(WebElement element, Object component) {
ContainerAnnotationsEventsRegistry remove = allRegistries.remove(new RegistryKey(element, component));
if (remove != null) {
remove.close();
}
}
/**
* Close all registries.
*/
public void close() {
Iterator<Map.Entry<RegistryKey, ContainerAnnotationsEventsRegistry>> entries = allRegistries.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry<RegistryKey, ContainerAnnotationsEventsRegistry> entry = entries.next();
entry.getValue().close();
entries.remove();
}
componentsAccessor.removeComponentsListener(this);
}
}