@Override public void fire(String path, Object data) { assert path != null; CanonicalEvent evt = new CanonicalEvent(); evt.setPath(path); evt.setManagementNodeId(Platform.getManagementServerId()); if (data != null) { /* if (!TypeUtils.isPrimitiveOrWrapper(data.getClass()) && !data.getClass().isAnnotationPresent(NeedJsonSchema.class)) { throw new CloudRuntimeException(String.format("data[%s] passed to canonical event is not annotated by @NeedJsonSchema", data.getClass().getName())); } */ evt.setContent(data); } fireLocal(evt); callWebhooks(evt); bus.publish(evt); }
private void fireLocal(CanonicalEvent cevt) { Map<String, CallbackWrapper> wrappers = new HashMap<>(); wrappers.putAll(local); for (CallbackWrapper w : wrappers.values()) { if (cevt.getPath().matches(w.getGlob())) { w.call(cevt); } } }
@AsyncThread void call(CanonicalEvent e) { if (callback instanceof EventRunnable) { ((EventRunnable) callback).run(); } else { Map<String, String> tokens = tokenize(e.getPath(), path); tokens.put(EventFacade.META_DATA_MANAGEMENT_NODE_ID, e.getManagementNodeId()); tokens.put(EventFacade.META_DATA_PATH, e.getPath()); Object data = null; if (e.getContent() != null) { data = e.getContent(); } if (callback instanceof EventCallback) { ((EventCallback)callback).run(tokens, data); } else if (callback instanceof AutoOffEventCallback) { if (!hasRun.compareAndSet(false, true)) { // the callback is being called return; } if (((AutoOffEventCallback)callback).run(tokens, data)) { off(callback); } else { hasRun.set(false); } } } } }
@Override public boolean start() { unsubscriber = bus.subscribeEvent(this, new CanonicalEvent()); return true; }
@Override public boolean handleEvent(Event evt) { if (!(evt instanceof CanonicalEvent)) { return false; } CanonicalEvent cevt = (CanonicalEvent)evt; Map<String, CallbackWrapper> wrappers = new HashMap<>(); wrappers.putAll(global); for (CallbackWrapper w : wrappers.values()) { if (cevt.getPath().matches(w.getGlob())) { w.call(cevt); } } return false; }
@Override public void call() { List<WebhookVO> vos = Q.New(WebhookVO.class).eq(WebhookVO_.type, EventFacade.WEBHOOK_TYPE).list(); vos = vos.stream().filter( vo -> event.getPath().matches( createRegexFromGlob(vo.getOpaque().replaceAll("\\{.*\\}", ".*")) )).collect(Collectors.toList()); if (!vos.isEmpty()) { postToWebhooks(WebhookInventory.valueOf(vos), JSONObjectUtil.toJsonString(event)); } } }.call();