private void constructAndSendEvents(Item item, State newState) { Set<SitemapEvent> events = constructSitemapEvents(item, newState, widgets); for (SitemapEvent event : events) { for (SitemapSubscriptionCallback callback : distinctCallbacks) { callback.onEvent(event); } } }
private void removeCallbackFromListener(String sitemapPage, SitemapSubscriptionCallback callback) { PageChangeListener oldListener = pageChangeListeners.get(sitemapPage); if (oldListener != null) { oldListener.removeCallback(callback); if (!pageOfSubscription.values().contains(sitemapPage)) { // no other callbacks are left here, so we can safely dispose the listener oldListener.dispose(); pageChangeListeners.remove(sitemapPage); } } }
/** * Creates a new instance. * * @param sitemapName the sitemap name of the page * @param pageId the id of the page for which events are created * @param itemUIRegistry the ItemUIRegistry which is needed for the functionality * @param widgets the list of widgets that are part of the page. */ public PageChangeListener(String sitemapName, String pageId, ItemUIRegistry itemUIRegistry, EList<Widget> widgets) { this.sitemapName = sitemapName; this.pageId = pageId; this.itemUIRegistry = itemUIRegistry; updateItemsAndWidgets(widgets); }
private void addCallbackToListener(String sitemapName, String pageId, SitemapSubscriptionCallback callback) { PageChangeListener listener = pageChangeListeners.get(getValue(sitemapName, pageId)); if (listener == null) { // there is no listener for this page yet, so let's try to create one listener = new PageChangeListener(sitemapName, pageId, itemUIRegistry, collectWidgets(sitemapName, pageId)); pageChangeListeners.put(getValue(sitemapName, pageId), listener); } if (listener != null) { listener.addCallback(callback); } }
/** * Collects all items that are represented by a given list of widgets * * @param widgets * the widget list to get the items for added to all bundles containing REST resources * @return all items that are represented by the list of widgets */ private Set<Item> getAllItems(EList<Widget> widgets) { Set<Item> items = new HashSet<Item>(); if (itemUIRegistry != null) { for (Widget widget : widgets) { addItemWithName(items, widget.getItem()); if (widget instanceof Frame) { items.addAll(getAllItems(((Frame) widget).getChildren())); } // now scan visibility rules for (VisibilityRule vr : widget.getVisibility()) { addItemWithName(items, vr.getItem()); } } } return items; }
protected void deactivate() { pageOfSubscription.clear(); callbacks.clear(); for (PageChangeListener listener : pageChangeListeners.values()) { listener.dispose(); } pageChangeListeners.clear(); }
private Set<SitemapEvent> constructSitemapEvents(Item item, List<Widget> widgets) { Set<SitemapEvent> events = new HashSet<>(); for (Widget w : widgets) { if (w instanceof Frame) { events.addAll(constructSitemapEvents(item, itemUIRegistry.getChildren((Frame) w))); } if ((w.getItem() != null && w.getItem().equals(item.getName())) || definesVisibility(w, item.getName())) { SitemapWidgetEvent event = new SitemapWidgetEvent(); event.sitemapName = sitemapName; event.pageId = pageId; event.label = itemUIRegistry.getLabel(w); event.labelcolor = itemUIRegistry.getLabelColor(w); event.valuecolor = itemUIRegistry.getValueColor(w); event.widgetId = itemUIRegistry.getWidgetId(w); event.visibility = itemUIRegistry.getVisiblity(w); event.item = EnrichedItemDTOMapper.map(item, false, null, null); // adjust the state according to the widget type event.item.state = itemUIRegistry.getState(w).toFullString(); events.add(event); } } return events; }
for (Widget w : widgets) { if (w instanceof Frame) { events.addAll(constructSitemapEvents(item, state, itemUIRegistry.getChildren((Frame) w))); skipWidget = chartWidget.getRefresh() > 0; if (!skipWidget || definesVisibilityOrColor(w, item.getName())) { SitemapWidgetEvent event = new SitemapWidgetEvent(); event.sitemapName = sitemapName;
@Override public void modelChanged(String modelName, EventType type) { if (type != EventType.MODIFIED || !modelName.endsWith(SITEMAP_SUFFIX)) { return; // we process only sitemap modifications here } String changedSitemapName = StringUtils.removeEnd(modelName, SITEMAP_SUFFIX); for (Entry<String, PageChangeListener> listenerEntry : pageChangeListeners.entrySet()) { String sitemapWithPage = listenerEntry.getKey(); String sitemapName = extractSitemapName(sitemapWithPage); if (sitemapName.equals(changedSitemapName)) { listenerEntry.getValue().sitemapContentChanged(); } } } }
private void updateItemsAndWidgets(EList<Widget> widgets) { if (this.widgets != null) { // cleanup statechange listeners in case widgets were removed items = getAllItems(this.widgets); for (Item item : items) { if (item instanceof GenericItem) { ((GenericItem) item).removeStateChangeListener(this); } } } this.widgets = widgets; items = getAllItems(widgets); for (Item item : items) { if (item instanceof GenericItem) { ((GenericItem) item).addStateChangeListener(this); } } }
@Override public void receive(Event event) { if (event instanceof ItemStatePredictedEvent) { ItemStatePredictedEvent prediction = (ItemStatePredictedEvent) event; Item item = itemUIRegistry.get(prediction.getItemName()); if (item instanceof GroupItem) { // don't send out auto-update events for group items as those will calculate their state based on their // members and predictions aren't really possible in that case (or at least would be highly complex). return; } for (PageChangeListener pageChangeListener : pageChangeListeners.values()) { if (prediction.isConfirmation()) { pageChangeListener.keepCurrentState(item); } else { pageChangeListener.changeStateTo(item, prediction.getPredictedState()); } } } } }
private void addCallbackToListener(String sitemapName, String pageId, SitemapSubscriptionCallback callback) { PageChangeListener listener = pageChangeListeners.get(getValue(sitemapName, pageId)); if (listener == null) { // there is no listener for this page yet, so let's try to create one listener = new PageChangeListener(sitemapName, pageId, itemUIRegistry, collectWidgets(sitemapName, pageId)); pageChangeListeners.put(getValue(sitemapName, pageId), listener); } if (listener != null) { listener.addCallback(callback); } }
if (itemUIRegistry != null) { for (Widget widget : widgets) { addItemWithName(items, widget.getItem()); if (widget instanceof Frame) { items.addAll(getAllItems(((Frame) widget).getChildren())); addItemWithName(items, rule.getItem()); addItemWithName(items, rule.getItem()); addItemWithName(items, rule.getItem());
@Deactivate protected void deactivate() { pageOfSubscription.clear(); callbacks.clear(); for (PageChangeListener listener : pageChangeListeners.values()) { listener.dispose(); } pageChangeListeners.clear(); }
@Override public void modelChanged(String modelName, EventType type) { if (type != EventType.MODIFIED || !modelName.endsWith(SITEMAP_SUFFIX)) { return; // we process only sitemap modifications here } String changedSitemapName = StringUtils.removeEnd(modelName, SITEMAP_SUFFIX); for (Entry<String, PageChangeListener> listenerEntry : pageChangeListeners.entrySet()) { String sitemapWithPage = listenerEntry.getKey(); String sitemapName = extractSitemapName(sitemapWithPage); String pageId = extractPageId(sitemapWithPage); if (sitemapName.equals(changedSitemapName)) { EList<Widget> widgets = collectWidgets(sitemapName, pageId); listenerEntry.getValue().sitemapContentChanged(widgets); } } }
private void updateItemsAndWidgets(EList<Widget> widgets) { if (this.widgets != null) { // cleanup statechange listeners in case widgets were removed items = getAllItems(this.widgets); for (Item item : items) { if (item instanceof GenericItem) { ((GenericItem) item).removeStateChangeListener(this); } } } this.widgets = widgets; items = getAllItems(widgets); for (Item item : items) { if (item instanceof GenericItem) { ((GenericItem) item).addStateChangeListener(this); } } }
private void removeCallbackFromListener(String sitemapPage, SitemapSubscriptionCallback callback) { PageChangeListener oldListener = pageChangeListeners.get(sitemapPage); if (oldListener != null) { oldListener.removeCallback(callback); if (!pageOfSubscription.values().contains(sitemapPage)) { // no other callbacks are left here, so we can safely dispose the listener oldListener.dispose(); pageChangeListeners.remove(sitemapPage); } } }
/** * Removes an existing subscription * * @param subscriptionId the id of the subscription to remove */ public void removeSubscription(String subscriptionId) { callbacks.remove(subscriptionId); String sitemapPage = pageOfSubscription.remove(subscriptionId); if (sitemapPage != null && !pageOfSubscription.values().contains(sitemapPage)) { // this was the only subscription listening on this page, so we can dispose the listener PageChangeListener listener = pageChangeListeners.remove(sitemapPage); if (listener != null) { listener.dispose(); } } logger.debug("Removed subscription with id {}", subscriptionId); }
/** * Creates a new instance. * * @param sitemapName the sitemap name of the page * @param pageId the id of the page for which events are created * @param itemUIRegistry the ItemUIRegistry which is needed for the functionality * @param widgets the list of widgets that are part of the page. */ public PageChangeListener(String sitemapName, String pageId, ItemUIRegistry itemUIRegistry, EList<Widget> widgets) { this.sitemapName = sitemapName; this.pageId = pageId; this.itemUIRegistry = itemUIRegistry; updateItemsAndWidgets(widgets); }
@Override public void stateChanged(Item item, State oldState, State newState) { // For all items except group, send an event only when the event state is changed. if (item instanceof GroupItem) { return; } Set<SitemapEvent> events = constructSitemapEvents(item, widgets); for (SitemapEvent event : events) { for (SitemapSubscriptionCallback callback : distinctCallbacks) { callback.onEvent(event); } } }