@Override public String toString() { return getRoleType() + ":" + getRoleHint(); } }
@Override public boolean matches(Object otherEvent) { boolean result = false; if (otherEvent instanceof AbstractComponentDescriptorEvent) { // If we're watching all roles return a match if (getRole() == null) { result = true; } else { ComponentDescriptorEvent event = (ComponentDescriptorEvent) otherEvent; if (getRoleType().equals(event.getRoleType())) { result = getRoleHint() == null || getRoleHint().equals(event.getRoleHint()); } } } return result; }
@Override public boolean matches(Object otherEvent) { boolean result = false; if (ComponentDescriptorRemovedEvent.class.isAssignableFrom(otherEvent.getClass())) { result = super.matches(otherEvent); } return result; } }
/** * @param event event object containing the new component descriptor * @param descriptor the component descriptor removed from component manager */ private void componentAdded(ComponentDescriptorAddedEvent event, ComponentDescriptor<EventListener> descriptor) { try { EventListener eventListener = this.componentManager.lookup(EventListener.class, event.getRoleHint()); if (getListener(eventListener.getName()) != eventListener) { addListener(eventListener); } } catch (ComponentLookupException e) { this.logger.error("Failed to lookup event listener corresponding to the component registration event", e); } }
/** * A component as been modified. * * @param componentEvent the event * @param data the descriptor of the modified component */ private void onComponentEvent(ComponentDescriptorEvent componentEvent, ComponentDescriptor<EventListener> data) { if (componentEvent.getRole() == EventListener.class) { if (componentEvent instanceof ComponentDescriptorAddedEvent) { componentAdded((ComponentDescriptorAddedEvent) componentEvent, (ComponentDescriptor<EventListener>) data); } else { componentRemoved((ComponentDescriptorRemovedEvent) componentEvent, (ComponentDescriptor<EventListener>) data); } } }
/** * A Component has been modified (added or removed) and we update our cache of Event Listeners if that Component is * an Event Listener. * * @param componentEvent the event about the Component being added or removed * @param componentManager the {@link ComponentManager} where the descriptor is registered * @param descriptor the descriptor of the modified component */ private void onComponentEvent(ComponentDescriptorEvent componentEvent, ComponentManager componentManager, ComponentDescriptor<EventListener> descriptor) { if (componentEvent.getRoleType() == EventListener.class) { if (componentEvent instanceof ComponentDescriptorAddedEvent) { onEventListenerComponentAdded((ComponentDescriptorAddedEvent) componentEvent, componentManager, descriptor); } else if (componentEvent instanceof ComponentDescriptorRemovedEvent) { onEventListenerComponentRemoved((ComponentDescriptorRemovedEvent) componentEvent, componentManager, descriptor); } else { this.logger.warn("Ignoring unknown Component event [{}]", componentEvent.getClass().getName()); } } }
@Override public void notifyComponentRegistered(ComponentDescriptor<?> descriptor) { notifyComponentEvent(new ComponentDescriptorAddedEvent(descriptor.getRoleType(), descriptor.getRoleHint()), descriptor, null); }
@Override public void notifyComponentUnregistered(ComponentDescriptor<?> descriptor) { notifyComponentEvent(new ComponentDescriptorRemovedEvent(descriptor.getRoleType(), descriptor.getRoleHint()), descriptor, null); }
@Override public Class<?> getRole() { return ReflectionUtils.getTypeClass(getRoleType()); }
@Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj != null && obj.getClass() == getClass()) { return Objects.equals(getRoleType(), ((ComponentDescriptorEvent) obj).getRoleType()) && StringUtils.equals(getRoleHint(), ((ComponentDescriptorEvent) obj).getRoleHint()); } return false; }
/** * An Event Listener Component has been dynamically registered in the system, add it to our cache. * * @param event event object containing the new component descriptor * @param componentManager the {@link ComponentManager} where the descriptor is registered * @param descriptor the component descriptor removed from component manager */ private void onEventListenerComponentAdded(ComponentDescriptorAddedEvent event, ComponentManager componentManager, ComponentDescriptor<EventListener> descriptor) { try { EventListener eventListener = componentManager.getInstance(EventListener.class, event.getRoleHint()); if (getListener(eventListener.getName()) != eventListener) { addListener(eventListener); } else { this.logger.warn("An Event Listener named [{}] already exists, ignoring the [{}] component", eventListener.getName(), descriptor.getImplementation().getName()); } } catch (ComponentLookupException e) { this.logger.error("Failed to lookup the Event Listener [{}] corresponding to the Component registration " + "event for [{}]. Ignoring the event", new Object[] { event.getRoleHint(), descriptor.getImplementation().getName(), e }); } }
@Override public int hashCode() { HashCodeBuilder builder = new HashCodeBuilder(); builder.append(getRoleType()); builder.append(getRoleHint()); return builder.toHashCode(); }
/** * A component as been modified. * * @param componentEvent the event * @param data the descriptor of the modified component */ private void onComponentEvent(ComponentDescriptorEvent componentEvent, ComponentDescriptor<EventListener> data) { if (componentEvent.getRole() == EventListener.class) { if (componentEvent instanceof ComponentDescriptorAddedEvent) { componentAdded((ComponentDescriptorAddedEvent) componentEvent, (ComponentDescriptor<EventListener>) data); } else { componentRemoved((ComponentDescriptorRemovedEvent) componentEvent, (ComponentDescriptor<EventListener>) data); } } }
@Override public void notifyComponentRegistered(ComponentDescriptor<?> descriptor, ComponentManager componentManager) { notifyComponentEvent(new ComponentDescriptorAddedEvent(descriptor.getRoleType(), descriptor.getRoleHint()), descriptor, componentManager); }
@Override public void notifyComponentUnregistered(ComponentDescriptor<?> descriptor, ComponentManager componentManager) { notifyComponentEvent(new ComponentDescriptorRemovedEvent(descriptor.getRoleType(), descriptor.getRoleHint()), descriptor, componentManager); }
@Override public boolean matches(Object otherEvent) { boolean result = false; if (ComponentDescriptorAddedEvent.class.isAssignableFrom(otherEvent.getClass())) { result = super.matches(otherEvent); } return result; } }
/** * @param event event object containing the new component descriptor * @param descriptor the component descriptor removed from component manager */ private void componentAdded(ComponentDescriptorAddedEvent event, ComponentDescriptor<EventListener> descriptor) { try { EventListener eventListener = this.componentManager.lookup(EventListener.class, event.getRoleHint()); if (getListener(eventListener.getName()) != eventListener) { addListener(eventListener); } } catch (ComponentLookupException e) { getLogger().error("Failed to lookup event listener corresponding to the component registration event", e); } }