use of org.openremote.model.asset.Asset in project openremote by openremote.
the class RulesService method start.
@Override
public void start(Container container) throws Exception {
if (!geofenceAssetAdapters.isEmpty()) {
LOG.info("GeoefenceAssetAdapters found: " + geofenceAssetAdapters.size());
locationPredicateRulesConsumer = this::onEngineLocationRulesChanged;
for (GeofenceAssetAdapter geofenceAssetAdapter : geofenceAssetAdapters) {
geofenceAssetAdapter.start(container);
}
}
LOG.info("Deploying global rulesets");
rulesetStorageService.findAll(GlobalRuleset.class, new RulesetQuery().setEnabledOnly(true).setFullyPopulate(true)).forEach(this::deployGlobalRuleset);
LOG.info("Deploying tenant rulesets");
tenants = Arrays.stream(identityService.getIdentityProvider().getTenants()).filter(Tenant::getEnabled).toArray(Tenant[]::new);
rulesetStorageService.findAll(TenantRuleset.class, new RulesetQuery().setEnabledOnly(true).setFullyPopulate(true)).stream().filter(rd -> Arrays.stream(tenants).anyMatch(tenant -> rd.getRealm().equals(tenant.getRealm()))).forEach(this::deployTenantRuleset);
LOG.info("Deploying asset rulesets");
// Group by asset ID then tenant and check tenant is enabled
// noinspection ResultOfMethodCallIgnored
deployAssetRulesets(rulesetStorageService.findAll(AssetRuleset.class, new RulesetQuery().setEnabledOnly(true).setFullyPopulate(true))).count();
LOG.info("Loading all assets with fact attributes to initialize state of rules engines");
Stream<Pair<Asset<?>, Stream<Attribute<?>>>> stateAttributes = findRuleStateAttributes();
// Push each attribute as an asset update through the rule engine chain
// that will ensure the insert only happens to the engines in scope
stateAttributes.forEach(pair -> {
Asset<?> asset = pair.key;
pair.value.forEach(ruleAttribute -> {
AssetState<?> assetState = new AssetState<>(asset, ruleAttribute, Source.INTERNAL);
updateAssetState(assetState);
});
});
// Start the engines
if (globalEngine != null) {
globalEngine.start();
}
tenantEngines.values().forEach(RulesEngine::start);
assetEngines.values().forEach(RulesEngine::start);
startDone = true;
preInitassetStates.forEach(this::doProcessAssetUpdate);
preInitassetStates.clear();
}
use of org.openremote.model.asset.Asset in project openremote by openremote.
the class RulesService method processModifiedGeofences.
protected void processModifiedGeofences() {
withLock(getClass().getSimpleName() + "::processModifiedGeofences", () -> {
LOG.finest("Processing geofence modifications: modified asset geofence count=" + assetsWithModifiedLocationPredicates.size());
try {
// Find all location predicates associated with modified assets and pass through to the geofence adapters
List<RulesEngine.AssetStateLocationPredicates> assetLocationPredicates = new ArrayList<>(assetsWithModifiedLocationPredicates.size());
assetsWithModifiedLocationPredicates.forEach(assetId -> {
RulesEngine.AssetStateLocationPredicates locationPredicates = new RulesEngine.AssetStateLocationPredicates(assetId, new HashSet<>());
engineAssetLocationPredicateMap.forEach((rulesEngine, engineAssetStateLocationPredicates) -> engineAssetStateLocationPredicates.stream().filter(assetStateLocationPredicates -> assetStateLocationPredicates.getAssetId().equals(assetId)).findFirst().ifPresent(assetStateLocationPredicate -> {
locationPredicates.getLocationPredicates().addAll(assetStateLocationPredicate.getLocationPredicates());
}));
assetLocationPredicates.add(locationPredicates);
});
for (GeofenceAssetAdapter geofenceAssetAdapter : geofenceAssetAdapters) {
LOG.finest("Passing modified geofences to adapter: " + geofenceAssetAdapter.getName());
geofenceAssetAdapter.processLocationPredicates(assetLocationPredicates);
if (assetLocationPredicates.isEmpty()) {
LOG.finest("All modified geofences handled");
break;
}
}
} catch (Exception e) {
LOG.log(SEVERE, "Exception thrown by geofence adapter whilst processing location predicates", e);
} finally {
// Clear modified assets ready for next batch
assetsWithModifiedLocationPredicates.clear();
}
});
}
use of org.openremote.model.asset.Asset in project openremote by openremote.
the class RulesService method configure.
@SuppressWarnings("unchecked")
@Override
public void configure() throws Exception {
// If any ruleset was modified in the database then check its' status and undeploy, deploy, or update it
from(PERSISTENCE_TOPIC).routeId("RulesetPersistenceChanges").filter(isPersistenceEventForEntityType(Ruleset.class)).filter(isNotForGateway(gatewayService)).process(exchange -> {
PersistenceEvent<?> persistenceEvent = exchange.getIn().getBody(PersistenceEvent.class);
processRulesetChange((Ruleset) persistenceEvent.getEntity(), persistenceEvent.getCause());
});
// If any tenant was modified in the database then check its' status and undeploy, deploy or update any
// associated rulesets
from(PERSISTENCE_TOPIC).routeId("RuleEngineTenantChanges").filter(isPersistenceEventForEntityType(Tenant.class)).filter(isNotForGateway(gatewayService)).process(exchange -> {
PersistenceEvent<?> persistenceEvent = exchange.getIn().getBody(PersistenceEvent.class);
Tenant tenant = (Tenant) persistenceEvent.getEntity();
processTenantChange(tenant, persistenceEvent.getCause());
});
// If any asset was modified in the database, detect changed attributes
from(PERSISTENCE_TOPIC).routeId("RuleEngineAssetChanges").filter(isPersistenceEventForEntityType(Asset.class)).process(exchange -> {
PersistenceEvent<Asset<?>> persistenceEvent = (PersistenceEvent<Asset<?>>) exchange.getIn().getBody(PersistenceEvent.class);
final Asset<?> eventAsset = persistenceEvent.getEntity();
processAssetChange(eventAsset, persistenceEvent);
});
}
use of org.openremote.model.asset.Asset in project openremote by openremote.
the class EmailNotificationHandler method getTargets.
@Override
public List<Notification.Target> getTargets(Notification.Source source, String sourceId, List<Notification.Target> targets, AbstractNotificationMessage message) {
List<Notification.Target> mappedTargets = new ArrayList<>();
if (targets != null) {
targets.forEach(target -> {
Notification.TargetType targetType = target.getType();
String targetId = target.getId();
switch(targetType) {
case TENANT:
case USER:
// Find all users in this tenant or by id
User[] users = targetType == Notification.TargetType.TENANT ? managerIdentityService.getIdentityProvider().queryUsers(new UserQuery().tenant(new TenantPredicate(targetId))) : managerIdentityService.getIdentityProvider().queryUsers(new UserQuery().ids(targetId));
if (users.length == 0) {
if (targetType == Notification.TargetType.USER) {
LOG.info("User not found: " + targetId);
} else {
LOG.info("No users found in target realm: " + targetId);
}
return;
}
mappedTargets.addAll(Arrays.stream(users).filter(user -> !Boolean.parseBoolean(user.getAttributes().getOrDefault(KEYCLOAK_USER_ATTRIBUTE_EMAIL_NOTIFICATIONS_DISABLED, Collections.singletonList("false")).get(0))).map(user -> {
Notification.Target userAssetTarget = new Notification.Target(Notification.TargetType.USER, user.getId());
userAssetTarget.setData(new EmailNotificationMessage.Recipient(user.getFullName(), user.getEmail()));
return userAssetTarget;
}).collect(Collectors.toList()));
break;
case CUSTOM:
// Nothing to do here
mappedTargets.add(new Notification.Target(targetType, targetId));
break;
case ASSET:
// Find descendant assets with email attribute
List<Asset<?>> assets = assetStorageService.findAll(new AssetQuery().select(new AssetQuery.Select().attributes(Asset.EMAIL.getName())).paths(new PathPredicate(targetId)).attributes(new AttributePredicate(new StringPredicate(Asset.EMAIL.getName()), new ValueEmptyPredicate().negate(true))));
if (assets.isEmpty()) {
LOG.fine("No assets with email attribute descendants of target asset");
return;
}
mappedTargets.addAll(assets.stream().map(asset -> {
Notification.Target assetTarget = new Notification.Target(Notification.TargetType.ASSET, asset.getId());
assetTarget.setData(new EmailNotificationMessage.Recipient(asset.getName(), asset.getEmail().orElse(null)));
return assetTarget;
}).collect(Collectors.toList()));
break;
}
});
}
EmailNotificationMessage email = (EmailNotificationMessage) message;
// Map to/cc/bcc into a custom target for traceability in sent notifications
List<String> addresses = new ArrayList<>();
if (email.getTo() != null) {
addresses.addAll(email.getTo().stream().map(EmailNotificationMessage.Recipient::getAddress).map(address -> "to:" + address).collect(Collectors.toList()));
email.setTo((List<EmailNotificationMessage.Recipient>) null);
}
if (email.getCc() != null) {
addresses.addAll(email.getCc().stream().map(EmailNotificationMessage.Recipient::getAddress).map(address -> "cc:" + address).collect(Collectors.toList()));
email.setCc((List<EmailNotificationMessage.Recipient>) null);
}
if (email.getBcc() != null) {
addresses.addAll(email.getBcc().stream().map(EmailNotificationMessage.Recipient::getAddress).map(address -> "bcc:" + address).collect(Collectors.toList()));
email.setBcc((List<EmailNotificationMessage.Recipient>) null);
}
if (!addresses.isEmpty()) {
mappedTargets.add(new Notification.Target(Notification.TargetType.CUSTOM, String.join(";", addresses)));
}
return mappedTargets;
}
use of org.openremote.model.asset.Asset in project openremote by openremote.
the class GatewayService method start.
@Override
public void start(Container container) throws Exception {
if (!active) {
return;
}
List<GatewayAsset> gateways = assetStorageService.findAll(new AssetQuery().types(GatewayAsset.class)).stream().map(asset -> (GatewayAsset) asset).collect(Collectors.toList());
List<String> gatewayIds = gateways.stream().map(Asset::getId).collect(Collectors.toList());
gateways = gateways.stream().filter(gateway -> Arrays.stream(gateway.getPath()).noneMatch(p -> !p.equals(gateway.getId()) && gatewayIds.contains(p))).collect(Collectors.toList());
if (!gateways.isEmpty()) {
LOG.info("Directly registered gateways found = " + gateways.size());
gateways.forEach(gateway -> {
// Check if client has been created
boolean hasClientId = gateway.getClientId().isPresent();
boolean hasClientSecret = gateway.getClientSecret().isPresent();
if (!hasClientId || !hasClientSecret) {
createUpdateGatewayServiceUser(gateway);
}
// Create connector
GatewayConnector connector = new GatewayConnector(assetStorageService, assetProcessingService, executorService, gateway);
gatewayConnectorMap.put(gateway.getId().toLowerCase(Locale.ROOT), connector);
// Get IDs of all assets under this gateway
List<Asset<?>> gatewayAssets = assetStorageService.findAll(new AssetQuery().parents(gateway.getId()).select(new AssetQuery.Select().excludeAttributes()).recursive(true));
gatewayAssets.forEach(asset -> assetIdGatewayIdMap.put(asset.getId(), gateway.getId()));
});
}
}
Aggregations