MalIS-CEP initial import
commit
b3a7aeeb97
@ -0,0 +1,15 @@
|
|||||||
|
cep:
|
||||||
|
bindings:
|
||||||
|
http-eebus-alarm:
|
||||||
|
enabled: true
|
||||||
|
in:
|
||||||
|
type: HTTP
|
||||||
|
match:
|
||||||
|
pathRegex: "^/rest/alarms/(?<site>[^/]+)/(?<department>[^/]+)/(?<deviceId>[^/]+)$"
|
||||||
|
extract:
|
||||||
|
tenant: "default"
|
||||||
|
parserRef: "eebusAlarmDatagramXml" # ensure this parser is registered to EebusAlarmDatagramXmlParser
|
||||||
|
detectorRef: "passthroughEebusAlarm" # PassthroughAlarmDetector
|
||||||
|
lifecyclePolicyRef: "passthrough"
|
||||||
|
outputRefs:
|
||||||
|
- "outboxMalisEebusDatagramXml" # Output with format EEBUS_ALARM_DATAGRAM_XML
|
||||||
@ -0,0 +1,30 @@
|
|||||||
|
cep:
|
||||||
|
bindings:
|
||||||
|
http-eebus-measurement-datagram-to-external-detector:
|
||||||
|
enabled: true
|
||||||
|
in:
|
||||||
|
type: HTTP
|
||||||
|
match:
|
||||||
|
# Example topic scheme; adjust to your real gateway convention.
|
||||||
|
pathRegex: "^measurements/(?<site>[^/]+)/(?<department>[^/]+)/(?<deviceId>[^/]+)$"
|
||||||
|
extract:
|
||||||
|
tenant: "default"
|
||||||
|
# Expect a full EEBUS SPINE-like <Datagram> XML payload.
|
||||||
|
parserRef: "eebusMeasurementDatagramXml"
|
||||||
|
# External detector receives the full <Datagram> XML (recommended requestFormat=DATAGRAM_XML).
|
||||||
|
detectorRef: "externalEebusDatagramRest"
|
||||||
|
lifecyclePolicyRef: "default"
|
||||||
|
outputRefs: ["outboxMalisEebusDatagramXml"]
|
||||||
|
http-eebus-measurement-datagrams-to-internal-detector:
|
||||||
|
enabled: true
|
||||||
|
in:
|
||||||
|
type: HTTP
|
||||||
|
match:
|
||||||
|
pathRegex: "^eebus/measurement-datagrams/(?<site>[^/]+)/(?<department>[^/]+)/(?<deviceId>[^/]+)$"
|
||||||
|
extract:
|
||||||
|
tenant: "default"
|
||||||
|
parserRef: "eebusMeasurementDatagramXml"
|
||||||
|
detectorRef: "internalEebusExpression"
|
||||||
|
lifecyclePolicyRef: "default"
|
||||||
|
# For local testing without MQTT/Rabbit, outbox is fine; /api/test/ingress will also show detector/lifecycle results.
|
||||||
|
outputRefs: ["outboxMalisEebusDatagramXml", "mqttMalisEebusDatagramXml"]
|
||||||
@ -0,0 +1,16 @@
|
|||||||
|
cep:
|
||||||
|
bindings:
|
||||||
|
mqtt-eebus-alarm-generic:
|
||||||
|
enabled: true
|
||||||
|
in:
|
||||||
|
type: MQTT
|
||||||
|
match:
|
||||||
|
topicRegex: "^alarms/(?<site>[^/]+)/(?<department>[^/]+)/(?<deviceId>[^/]+)$"
|
||||||
|
extract:
|
||||||
|
tenant: "default"
|
||||||
|
# Accept both JSON and full <Datagram> XML payloads
|
||||||
|
parserRef: "eebusAlarm"
|
||||||
|
detectorRef: "passthroughEebusAlarm"
|
||||||
|
lifecyclePolicyRef: "default"
|
||||||
|
# Publish both a JSON alarm message and a full <Datagram> XML (useful for testing)
|
||||||
|
outputRefs: ["mqttMalisEebus", "mqttMalisEebusDatagramXml"]
|
||||||
@ -0,0 +1,17 @@
|
|||||||
|
cep:
|
||||||
|
bindings:
|
||||||
|
mqtt-eebus-measurement-datagram-to-external-detector:
|
||||||
|
enabled: true
|
||||||
|
in:
|
||||||
|
type: MQTT
|
||||||
|
match:
|
||||||
|
# Example topic scheme; adjust to your real gateway convention.
|
||||||
|
topicRegex: "^measurements/(?<site>[^/]+)/(?<department>[^/]+)/(?<deviceId>[^/]+)$"
|
||||||
|
extract:
|
||||||
|
tenant: "default"
|
||||||
|
# Expect a full EEBUS SPINE-like <Datagram> XML payload.
|
||||||
|
parserRef: "eebusMeasurementDatagramXml"
|
||||||
|
# External detector receives the full <Datagram> XML (recommended requestFormat=DATAGRAM_XML).
|
||||||
|
detectorRef: "externalEebusDatagramRest"
|
||||||
|
lifecyclePolicyRef: "default"
|
||||||
|
outputRefs: ["mqttMalisEebusDatagramXml"]
|
||||||
@ -0,0 +1,30 @@
|
|||||||
|
cep:
|
||||||
|
bindings:
|
||||||
|
# MQTT ingress topics: <port>/<app>/<tenant>/<pin>
|
||||||
|
# Example: 40200/m2m/tenantA/1
|
||||||
|
mqttM2mPinErpnextComposite:
|
||||||
|
enabled: true
|
||||||
|
in:
|
||||||
|
type: MQTT
|
||||||
|
match:
|
||||||
|
topicRegex: "^(?<deviceId>[^/]+)/(?<app>[^/]+)/(?<tenant>[^/]+)/(?<pin>[^/]+)$"
|
||||||
|
# Extracted group vars: port, app, tenant, pin
|
||||||
|
parserRef: m2mPinUpdateErpnext
|
||||||
|
detectorRef: pinBadState
|
||||||
|
|
||||||
|
lifecyclePolicyRef: compositeDefault
|
||||||
|
|
||||||
|
composite:
|
||||||
|
groupKeyTemplate: "${site}|${department}|Pumpensumpf" # function should be specified in configuration "${site}|${department}|${function}"
|
||||||
|
sourceKeyTemplate: "${path}" # or "${port}/${app}/${tenant}/${pin}"
|
||||||
|
|
||||||
|
outputRefs:
|
||||||
|
# Publishes EEBUS-like <Datagram> XML to MQTT using the templates in config/cep/common.yml
|
||||||
|
- restMalisFault
|
||||||
|
- outboxMalisFaultJson
|
||||||
|
|
||||||
|
heartbeat:
|
||||||
|
enabled: true
|
||||||
|
periodMs: 600000
|
||||||
|
includeInactive: true
|
||||||
|
|
||||||
@ -0,0 +1,24 @@
|
|||||||
|
cep:
|
||||||
|
bindings:
|
||||||
|
# MQTT ingress topics: <port>/<app>/<tenant>/<pin>
|
||||||
|
# Example: 40200/m2m/tenantA/1
|
||||||
|
#
|
||||||
|
# This binding uses a JS processor (parser+detector in one step).
|
||||||
|
mqttM2mPinErpnextJs:
|
||||||
|
enabled: false # set true to use this binding
|
||||||
|
in:
|
||||||
|
type: MQTT
|
||||||
|
match:
|
||||||
|
topicRegex: "^(?<deviceId>[^/]+)/(?<app>[^/]+)/(?<tenant>[^/]+)/(?<pin>[^/]+)$"
|
||||||
|
|
||||||
|
processorRef: m2mPinErpnextJs
|
||||||
|
|
||||||
|
# You can choose SIMPLE or COMPOSITE lifecycle.
|
||||||
|
lifecyclePolicyRef: default
|
||||||
|
# Example COMPOSITE usage (uncomment and set lifecyclePolicyRef: compositeDefault)
|
||||||
|
# composite:
|
||||||
|
# groupKeyTemplate: "${site}|${department}|${function}"
|
||||||
|
# sourceKeyTemplate: "${path}"
|
||||||
|
|
||||||
|
outputRefs:
|
||||||
|
- restMalisFault # if you configured a REST output with MALIS_FAULT_JSON
|
||||||
@ -0,0 +1,17 @@
|
|||||||
|
cep:
|
||||||
|
bindings:
|
||||||
|
# MQTT ingress topics: <port>/<app>/<tenant>/<pin>
|
||||||
|
# Example: 40200/m2m/tenantA/1
|
||||||
|
mqttM2mPinErpnext:
|
||||||
|
enabled: false
|
||||||
|
in:
|
||||||
|
type: MQTT
|
||||||
|
match:
|
||||||
|
topicRegex: "^(?<deviceId>[^/]+)/(?<app>[^/]+)/(?<tenant>[^/]+)/(?<pin>[^/]+)$"
|
||||||
|
# Extracted group vars: port, app, tenant, pin
|
||||||
|
parserRef: m2mPinUpdateErpnext
|
||||||
|
detectorRef: pinBadState
|
||||||
|
lifecyclePolicyRef: default
|
||||||
|
outputRefs:
|
||||||
|
# Publishes EEBUS-like <Datagram> XML to MQTT using the templates in config/cep/common.yml
|
||||||
|
- restMalisFault
|
||||||
@ -0,0 +1,18 @@
|
|||||||
|
cep:
|
||||||
|
bindings:
|
||||||
|
mqtt-ports8-raw-json-to-external-detector:
|
||||||
|
enabled: true
|
||||||
|
in:
|
||||||
|
type: MQTT
|
||||||
|
match:
|
||||||
|
topicRegex: "^/sadfjsadf/(?<site>[^/]+)/(?<department>[^/]+)$"
|
||||||
|
extract:
|
||||||
|
tenant: "default"
|
||||||
|
deviceIdStrategy:
|
||||||
|
type: "HASH_OF_TOPIC"
|
||||||
|
config:
|
||||||
|
salt: "ports8"
|
||||||
|
parserRef: "jsonPorts8"
|
||||||
|
detectorRef: "externalM2MRest"
|
||||||
|
lifecyclePolicyRef: "portsFlappy"
|
||||||
|
outputRefs: ["mqttMalisEebus", "mqttMalisEebusDatagramXml"]
|
||||||
@ -0,0 +1,16 @@
|
|||||||
|
cep:
|
||||||
|
bindings:
|
||||||
|
rabbit-eebus-alarm-routingkey:
|
||||||
|
enabled: false
|
||||||
|
in:
|
||||||
|
type: RABBIT
|
||||||
|
match:
|
||||||
|
# IMPORTANT: for Rabbit ingress we match on the *received routing key* if present,
|
||||||
|
# otherwise we match on the consumer queue name.
|
||||||
|
queueRegex: "^alarms\\.(?<site>[^.]+)\\.(?<department>[^.]+)\\.(?<deviceId>[^.]+)$"
|
||||||
|
extract:
|
||||||
|
tenant: "default"
|
||||||
|
parserRef: "eebusAlarm"
|
||||||
|
detectorRef: "passthroughEebusAlarm"
|
||||||
|
lifecyclePolicyRef: "default"
|
||||||
|
outputRefs: ["rabbitMalisEebus"]
|
||||||
@ -0,0 +1,43 @@
|
|||||||
|
cep:
|
||||||
|
# ------------------------------------------------------------
|
||||||
|
# Brokers (transport connection info)
|
||||||
|
# ------------------------------------------------------------
|
||||||
|
brokers:
|
||||||
|
primary:
|
||||||
|
#type: MQTT
|
||||||
|
#url: "tcp://localhost:1883"
|
||||||
|
#clientId: "malis-cep-dev"
|
||||||
|
#username: guest
|
||||||
|
#password: xD%kZM3
|
||||||
|
|
||||||
|
type: MQTT
|
||||||
|
url: "ssl://emqx.oecloud.eu:17587"
|
||||||
|
clientId: "malis-cep-dev"
|
||||||
|
username: mosquitto
|
||||||
|
password: 2BCiaHW4
|
||||||
|
tls:
|
||||||
|
trustAll: true
|
||||||
|
|
||||||
|
rabbit:
|
||||||
|
type: RABBIT
|
||||||
|
# For Rabbit we use an AMQP URI. vhost can be encoded, e.g. /%2F for default.
|
||||||
|
url: "amqp://guest:guest@localhost:5672/%2F"
|
||||||
|
host: localhost
|
||||||
|
port: 5672
|
||||||
|
username: guest
|
||||||
|
password: guest
|
||||||
|
|
||||||
|
# Profile overrides for detector endpoints
|
||||||
|
detectors:
|
||||||
|
externalM2MRest:
|
||||||
|
config:
|
||||||
|
baseUrl: "http://localhost:8000"
|
||||||
|
|
||||||
|
externalEebusDatagramRest:
|
||||||
|
config:
|
||||||
|
baseUrl: "http://localhost:8000"
|
||||||
|
|
||||||
|
eebusXsdValidation:
|
||||||
|
enabled: true
|
||||||
|
failFast: true
|
||||||
|
schemaRoot: "EEBus_SPINE_TS_Datagram.xsd"
|
||||||
@ -0,0 +1,22 @@
|
|||||||
|
cep:
|
||||||
|
brokers:
|
||||||
|
primary:
|
||||||
|
type: MQTT
|
||||||
|
url: "ssl://mqtt.example.com:8883"
|
||||||
|
clientId: "malis-cep-prod"
|
||||||
|
# username/password optional
|
||||||
|
# username: "..."
|
||||||
|
# password: "..."
|
||||||
|
|
||||||
|
rabbit:
|
||||||
|
type: RABBIT
|
||||||
|
url: "amqps://user:pass@rabbit.example.com:5671/%2F"
|
||||||
|
|
||||||
|
detectors:
|
||||||
|
externalM2MRest:
|
||||||
|
config:
|
||||||
|
baseUrl: "http://..."
|
||||||
|
|
||||||
|
externalEebusDatagramRest:
|
||||||
|
config:
|
||||||
|
baseUrl: "http://..."
|
||||||
@ -0,0 +1,203 @@
|
|||||||
|
/**
|
||||||
|
* JS Processor: M2M pin update + ERPNext lookup + bad-state alarm detection.
|
||||||
|
*
|
||||||
|
* Combines the behavior of:
|
||||||
|
* - M2mPinUpdateJsonErpnextParser.java (JSON parse + ERPNext enrich vars)
|
||||||
|
* - PinBadStateDetector.java (value == bad -> ALARM else CANCEL)
|
||||||
|
*
|
||||||
|
* Host objects provided by Java:
|
||||||
|
* - erp.lookup(port, pin, isoTimestamp) -> { siteId, department, pinName, description, remark, bad, iotDevice, ... }
|
||||||
|
* - tpl.expand(template, vars) -> expands ${var} placeholders
|
||||||
|
*
|
||||||
|
* Entry function must be named 'process' (or configured via entryFunction).
|
||||||
|
*/
|
||||||
|
function process(input, cfg) {
|
||||||
|
// input: { inType, path, headers, payloadText, payloadBase64, vars }
|
||||||
|
// cfg: processor config map
|
||||||
|
|
||||||
|
const varsIn = input && input.vars ? input.vars : {};
|
||||||
|
const varsOut = {}; // delta only
|
||||||
|
|
||||||
|
let msg;
|
||||||
|
try {
|
||||||
|
msg = JSON.parse(input.payloadText || "{}");
|
||||||
|
} catch (e) {
|
||||||
|
// invalid JSON -> drop to DLQ by throwing
|
||||||
|
throw new Error("Invalid JSON payload: " + e);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fields (match Java parser)
|
||||||
|
const gpio = str(msg.gpio);
|
||||||
|
const channel = str(msg.channel);
|
||||||
|
const value = (msg.value === undefined || msg.value === null) ? null : Number(msg.value);
|
||||||
|
const reason = str(msg.reason);
|
||||||
|
const m2mport = str(msg.m2mport);
|
||||||
|
|
||||||
|
// Timestamp: payload.timestamp -> mqtt.sentAt -> now
|
||||||
|
const ts = normalizeTs(str(msg.timestamp) || (msg.mqtt && str(msg.mqtt.sentAt)) || new Date().toISOString());
|
||||||
|
|
||||||
|
// Resolve port/pin from topic vars
|
||||||
|
|
||||||
|
// in topic we have deviceId in place of port, so add it to variables explicitly
|
||||||
|
const port = str(varsIn.deviceId);
|
||||||
|
put(varsOut, 'port', port);
|
||||||
|
|
||||||
|
const pin = (varsIn.pin === undefined || varsIn.pin === null) ? null : Number(varsIn.pin);
|
||||||
|
|
||||||
|
// ERPNext enrich
|
||||||
|
let erpCtx = null;
|
||||||
|
if (port && pin !== null && pin !== undefined && !Number.isNaN(pin) && typeof erp !== 'undefined' && erp) {
|
||||||
|
erpCtx = erp.lookup(port, pin, ts);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (erpCtx) {
|
||||||
|
// Align var names with Java parser
|
||||||
|
put(varsOut, 'iotDevice', erpCtx.iotDevice);
|
||||||
|
put(varsOut, 'deviceId', erpCtx.deviceId || erpCtx.iotDevice);
|
||||||
|
put(varsOut, 'site', erpCtx.siteId);
|
||||||
|
put(varsOut, 'remark', erpCtx.remark);
|
||||||
|
put(varsOut, 'department', erpCtx.department);
|
||||||
|
put(varsOut, 'pinName', erpCtx.pinName);
|
||||||
|
put(varsOut, 'pinDescription', erpCtx.description);
|
||||||
|
put(varsOut, 'remark', erpCtx.remark);
|
||||||
|
if (erpCtx.bad !== undefined && erpCtx.bad !== null) {
|
||||||
|
put(varsOut, 'pinBad', erpCtx.bad);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optional convenience vars for grouping
|
||||||
|
put(varsOut, 'function', erpCtx.pinName);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Always expose payload hint vars (match Java parser)
|
||||||
|
if (value !== null && value !== undefined && !Number.isNaN(value)) put(varsOut, 'pinValue', String(value));
|
||||||
|
if (reason) put(varsOut, 'pinReason', reason);
|
||||||
|
if (gpio) put(varsOut, 'gpio', gpio);
|
||||||
|
if (channel) put(varsOut, 'channel', channel);
|
||||||
|
if (m2mport) put(varsOut, 'm2mport', m2mport);
|
||||||
|
put(varsOut, 'timestamp', ts);
|
||||||
|
|
||||||
|
// faultDay for composite grouping (YYYY-MM-DD)
|
||||||
|
if (ts && ts.length >= 10) put(varsOut, 'faultDay', ts.substring(0, 10));
|
||||||
|
|
||||||
|
// Need pinBad to decide alarm; if missing, throw (consistent with Java detector)
|
||||||
|
const pinBadStr = str(first(varsOut.pinBad, varsIn.pinBad));
|
||||||
|
if (!pinBadStr) {
|
||||||
|
throw new Error("Missing vars.pinBad - ERPNext enrichment did not provide bad state for port=" + port + " pin=" + pin);
|
||||||
|
}
|
||||||
|
const pinBad = Number(pinBadStr);
|
||||||
|
if (Number.isNaN(pinBad)) {
|
||||||
|
throw new Error("Invalid vars.pinBad: " + pinBadStr);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Decide event type
|
||||||
|
let action = 'CANCEL';
|
||||||
|
if (value !== null && value !== undefined && !Number.isNaN(value)) {
|
||||||
|
action = (Number(value) === Number(pinBad)) ? 'ALARM' : 'CANCEL';
|
||||||
|
} else {
|
||||||
|
// no value -> no event
|
||||||
|
return { drop: true };
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build a merged vars map for templates
|
||||||
|
const mergedVars = Object.assign({}, varsIn, varsOut);
|
||||||
|
|
||||||
|
// faultKey from template
|
||||||
|
const faultKeyTemplate = (cfg && cfg.faultKeyTemplate) ? String(cfg.faultKeyTemplate) : "${tenant}:${site}:${iotDevice}:PIN:${pin}";
|
||||||
|
let faultKey;
|
||||||
|
if (typeof tpl !== 'undefined' && tpl && tpl.expand) {
|
||||||
|
faultKey = tpl.expand(faultKeyTemplate, mergedVars);
|
||||||
|
} else {
|
||||||
|
faultKey = fallbackExpand(faultKeyTemplate, mergedVars);
|
||||||
|
}
|
||||||
|
if (!faultKey || !faultKey.trim()) {
|
||||||
|
faultKey = "PIN:" + (mergedVars.pin || 'unknown');
|
||||||
|
}
|
||||||
|
|
||||||
|
const severity = (cfg && cfg.severity) ? String(cfg.severity) : 'MAJOR';
|
||||||
|
|
||||||
|
// Build details (match Java detector)
|
||||||
|
const details = {
|
||||||
|
gpio: gpio,
|
||||||
|
channel: channel,
|
||||||
|
value: value,
|
||||||
|
bad: pinBad,
|
||||||
|
reason: reason,
|
||||||
|
m2mport: m2mport,
|
||||||
|
mqtt: (msg.mqtt && typeof msg.mqtt === 'object') ? msg.mqtt : undefined,
|
||||||
|
pinName: mergedVars.pinName,
|
||||||
|
pinDescription: mergedVars.pinDescription,
|
||||||
|
remark: mergedVars.remark
|
||||||
|
};
|
||||||
|
|
||||||
|
// Remove undefined properties
|
||||||
|
Object.keys(details).forEach(k => { if (details[k] === undefined || details[k] === null || details[k] === "") delete details[k]; });
|
||||||
|
|
||||||
|
return {
|
||||||
|
vars: varsOut,
|
||||||
|
events: [
|
||||||
|
{
|
||||||
|
action: action,
|
||||||
|
faultKey: faultKey,
|
||||||
|
severity: severity,
|
||||||
|
occurredAt: ts,
|
||||||
|
details: details
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function str(v) {
|
||||||
|
if (v === undefined || v === null) return null;
|
||||||
|
const s = String(v).trim();
|
||||||
|
return s.length ? s : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function put(obj, k, v) {
|
||||||
|
const s = str(v);
|
||||||
|
if (s) obj[k] = s;
|
||||||
|
}
|
||||||
|
|
||||||
|
function first(a, b) {
|
||||||
|
return (a !== undefined && a !== null && String(a).trim() !== '') ? a : b;
|
||||||
|
}
|
||||||
|
|
||||||
|
function normalizeTs(s) {
|
||||||
|
// best-effort normalization to ISO-8601 instant string
|
||||||
|
const t = str(s);
|
||||||
|
if (!t) return new Date().toISOString();
|
||||||
|
// if already ISO-ish, keep
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
function fallbackExpand(tplStr, vars) {
|
||||||
|
// minimal ${k} replacement
|
||||||
|
return String(tplStr).replace(/\$\{([^}]+)\}/g, (_, k) => {
|
||||||
|
const v = vars[k];
|
||||||
|
return (v === undefined || v === null) ? '' : String(v);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function dump(obj) {
|
||||||
|
if (obj == null) return "null";
|
||||||
|
|
||||||
|
// If it's a JS object / ProxyObject
|
||||||
|
try {
|
||||||
|
return JSON.stringify(obj);
|
||||||
|
} catch (e) { /* ignore */ }
|
||||||
|
|
||||||
|
// If it's a Java Map-like (has entrySet)
|
||||||
|
try {
|
||||||
|
if (typeof obj.entrySet === "function") {
|
||||||
|
const it = obj.entrySet().iterator();
|
||||||
|
const out = {};
|
||||||
|
while (it.hasNext()) {
|
||||||
|
const e = it.next();
|
||||||
|
out[String(e.getKey())] = e.getValue();
|
||||||
|
}
|
||||||
|
return JSON.stringify(out);
|
||||||
|
}
|
||||||
|
} catch (e) { /* ignore */ }
|
||||||
|
|
||||||
|
// Fallback: best-effort string
|
||||||
|
try { return String(obj); } catch (e) { return "[unprintable]"; }
|
||||||
|
}
|
||||||
@ -0,0 +1,139 @@
|
|||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<groupId>at.co.procon</groupId>
|
||||||
|
<artifactId>malis-cep</artifactId>
|
||||||
|
<version>0.1.0-SNAPSHOT</version>
|
||||||
|
<name>malis-cep</name>
|
||||||
|
<description>Malis CEP prototype (bindings + parsers + detectors + lifecycle + outputs)</description>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<java.version>17</java.version>
|
||||||
|
<spring-boot.version>3.3.6</spring-boot.version>
|
||||||
|
<graalvm.version>25.0.2</graalvm.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencyManagement>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-dependencies</artifactId>
|
||||||
|
<version>${spring-boot.version}</version>
|
||||||
|
<type>pom</type>
|
||||||
|
<scope>import</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</dependencyManagement>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-web</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Spring Integration core + MQTT (Paho) for real MQTT ingress/egress -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-integration</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.integration</groupId>
|
||||||
|
<artifactId>spring-integration-mqtt</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Spring AMQP for real RabbitMQ publishing + optional ingress -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-amqp</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.fasterxml.jackson.dataformat</groupId>
|
||||||
|
<artifactId>jackson-dataformat-yaml</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- GraalJS (Polyglot) for JavaScript processors/detectors -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.graalvm.polyglot</groupId>
|
||||||
|
<artifactId>polyglot</artifactId>
|
||||||
|
<version>${graalvm.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.graalvm.polyglot</groupId>
|
||||||
|
<artifactId>js</artifactId>
|
||||||
|
<version>${graalvm.version}</version>
|
||||||
|
<type>pom</type>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-configuration-processor</artifactId>
|
||||||
|
<optional>true</optional>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
<optional>true</optional>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.openmuc.jeebus</groupId>
|
||||||
|
<artifactId>spine</artifactId>
|
||||||
|
<version>3.1.0</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jvnet.jaxb</groupId>
|
||||||
|
<artifactId>jaxb-plugins-runtime</artifactId>
|
||||||
|
<version>4.0.12</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>jakarta.xml.bind</groupId>
|
||||||
|
<artifactId>jakarta.xml.bind-api</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.glassfish.jaxb</groupId>
|
||||||
|
<artifactId>jaxb-runtime</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-test</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.fasterxml.jackson.datatype</groupId>
|
||||||
|
<artifactId>jackson-datatype-jsr310</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<source>${java.version}</source>
|
||||||
|
<target>${java.version}</target>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</project>
|
||||||
Loading…
Reference in New Issue