Search in sources :

Example 26 with Asset

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();
}
Also used : ClientRole(org.openremote.model.security.ClientRole) BiFunction(java.util.function.BiFunction) AssetProcessingException(org.openremote.manager.asset.AssetProcessingException) AssetProcessingService(org.openremote.manager.asset.AssetProcessingService) ValueUtil(org.openremote.model.util.ValueUtil) MapAccess.getString(org.openremote.container.util.MapAccess.getString) GeofenceAssetAdapter(org.openremote.manager.rules.geofence.GeofenceAssetAdapter) Attribute.getAddedOrModifiedAttributes(org.openremote.model.attribute.Attribute.getAddedOrModifiedAttributes) org.openremote.model.rules(org.openremote.model.rules) AssetPredictedDatapointService(org.openremote.manager.datapoint.AssetPredictedDatapointService) GeofenceDefinition(org.openremote.model.rules.geofence.GeofenceDefinition) ContainerService(org.openremote.model.ContainerService) Logger(java.util.logging.Logger) Collectors(java.util.stream.Collectors) Container(org.openremote.model.Container) Stream(java.util.stream.Stream) RouteBuilder(org.apache.camel.builder.RouteBuilder) PERSISTENCE_TOPIC(org.openremote.container.persistence.PersistenceService.PERSISTENCE_TOPIC) RulesetQuery(org.openremote.model.query.RulesetQuery) GatewayService(org.openremote.manager.gateway.GatewayService) GlobalLock.withLock(org.openremote.container.concurrent.GlobalLock.withLock) AssetStorageService(org.openremote.manager.asset.AssetStorageService) Tenant(org.openremote.model.security.Tenant) AttributeMap(org.openremote.model.attribute.AttributeMap) GatewayService.isNotForGateway(org.openremote.manager.gateway.GatewayService.isNotForGateway) java.util(java.util) AssetDatapointService(org.openremote.manager.datapoint.AssetDatapointService) NotificationService(org.openremote.manager.notification.NotificationService) SEVERE(java.util.logging.Level.SEVERE) GlobalLock.withLockReturning(org.openremote.container.concurrent.GlobalLock.withLockReturning) LocationAttributePredicate(org.openremote.model.query.filter.LocationAttributePredicate) Attribute(org.openremote.model.attribute.Attribute) PersistenceService(org.openremote.container.persistence.PersistenceService) ScheduledExecutorService(java.util.concurrent.ScheduledExecutorService) ManagerWebService(org.openremote.manager.web.ManagerWebService) PersistenceEvent(org.openremote.model.PersistenceEvent) MessageBrokerService(org.openremote.container.message.MessageBrokerService) FlowResourceImpl(org.openremote.manager.rules.flow.FlowResourceImpl) ManagerIdentityService(org.openremote.manager.security.ManagerIdentityService) Asset(org.openremote.model.asset.Asset) MetaItemType(org.openremote.model.value.MetaItemType) AssetQuery(org.openremote.model.query.AssetQuery) Pair(org.openremote.model.util.Pair) EntityManager(javax.persistence.EntityManager) ClientEventService(org.openremote.manager.event.ClientEventService) Collectors.toList(java.util.stream.Collectors.toList) TimerService(org.openremote.container.timer.TimerService) AssetUpdateProcessor(org.openremote.manager.asset.AssetUpdateProcessor) PersistenceService.isPersistenceEventForEntityType(org.openremote.container.persistence.PersistenceService.isPersistenceEventForEntityType) Source(org.openremote.model.attribute.AttributeEvent.Source) FINEST(java.util.logging.Level.FINEST) RulesetQuery(org.openremote.model.query.RulesetQuery) Attribute(org.openremote.model.attribute.Attribute) GeofenceAssetAdapter(org.openremote.manager.rules.geofence.GeofenceAssetAdapter) Tenant(org.openremote.model.security.Tenant) Pair(org.openremote.model.util.Pair)

Example 27 with Asset

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();
        }
    });
}
Also used : ClientRole(org.openremote.model.security.ClientRole) BiFunction(java.util.function.BiFunction) AssetProcessingException(org.openremote.manager.asset.AssetProcessingException) AssetProcessingService(org.openremote.manager.asset.AssetProcessingService) ValueUtil(org.openremote.model.util.ValueUtil) MapAccess.getString(org.openremote.container.util.MapAccess.getString) GeofenceAssetAdapter(org.openremote.manager.rules.geofence.GeofenceAssetAdapter) Attribute.getAddedOrModifiedAttributes(org.openremote.model.attribute.Attribute.getAddedOrModifiedAttributes) org.openremote.model.rules(org.openremote.model.rules) AssetPredictedDatapointService(org.openremote.manager.datapoint.AssetPredictedDatapointService) GeofenceDefinition(org.openremote.model.rules.geofence.GeofenceDefinition) ContainerService(org.openremote.model.ContainerService) Logger(java.util.logging.Logger) Collectors(java.util.stream.Collectors) Container(org.openremote.model.Container) Stream(java.util.stream.Stream) RouteBuilder(org.apache.camel.builder.RouteBuilder) PERSISTENCE_TOPIC(org.openremote.container.persistence.PersistenceService.PERSISTENCE_TOPIC) RulesetQuery(org.openremote.model.query.RulesetQuery) GatewayService(org.openremote.manager.gateway.GatewayService) GlobalLock.withLock(org.openremote.container.concurrent.GlobalLock.withLock) AssetStorageService(org.openremote.manager.asset.AssetStorageService) Tenant(org.openremote.model.security.Tenant) AttributeMap(org.openremote.model.attribute.AttributeMap) GatewayService.isNotForGateway(org.openremote.manager.gateway.GatewayService.isNotForGateway) java.util(java.util) AssetDatapointService(org.openremote.manager.datapoint.AssetDatapointService) NotificationService(org.openremote.manager.notification.NotificationService) SEVERE(java.util.logging.Level.SEVERE) GlobalLock.withLockReturning(org.openremote.container.concurrent.GlobalLock.withLockReturning) LocationAttributePredicate(org.openremote.model.query.filter.LocationAttributePredicate) Attribute(org.openremote.model.attribute.Attribute) PersistenceService(org.openremote.container.persistence.PersistenceService) ScheduledExecutorService(java.util.concurrent.ScheduledExecutorService) ManagerWebService(org.openremote.manager.web.ManagerWebService) PersistenceEvent(org.openremote.model.PersistenceEvent) MessageBrokerService(org.openremote.container.message.MessageBrokerService) FlowResourceImpl(org.openremote.manager.rules.flow.FlowResourceImpl) ManagerIdentityService(org.openremote.manager.security.ManagerIdentityService) Asset(org.openremote.model.asset.Asset) MetaItemType(org.openremote.model.value.MetaItemType) AssetQuery(org.openremote.model.query.AssetQuery) Pair(org.openremote.model.util.Pair) EntityManager(javax.persistence.EntityManager) ClientEventService(org.openremote.manager.event.ClientEventService) Collectors.toList(java.util.stream.Collectors.toList) TimerService(org.openremote.container.timer.TimerService) AssetUpdateProcessor(org.openremote.manager.asset.AssetUpdateProcessor) PersistenceService.isPersistenceEventForEntityType(org.openremote.container.persistence.PersistenceService.isPersistenceEventForEntityType) Source(org.openremote.model.attribute.AttributeEvent.Source) FINEST(java.util.logging.Level.FINEST) GeofenceAssetAdapter(org.openremote.manager.rules.geofence.GeofenceAssetAdapter) AssetProcessingException(org.openremote.manager.asset.AssetProcessingException)

Example 28 with Asset

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);
    });
}
Also used : Tenant(org.openremote.model.security.Tenant) PersistenceEvent(org.openremote.model.PersistenceEvent) Asset(org.openremote.model.asset.Asset)

Example 29 with Asset

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;
}
Also used : AssetStorageService(org.openremote.manager.asset.AssetStorageService) Arrays(java.util.Arrays) AbstractNotificationMessage(org.openremote.model.notification.AbstractNotificationMessage) KEYCLOAK_USER_ATTRIBUTE_EMAIL_NOTIFICATIONS_DISABLED(org.openremote.manager.security.ManagerKeycloakIdentityProvider.KEYCLOAK_USER_ATTRIBUTE_EMAIL_NOTIFICATIONS_DISABLED) EmailPopulatingBuilder(org.simplejavamail.email.EmailPopulatingBuilder) TransportStrategy(org.simplejavamail.mailer.config.TransportStrategy) MapAccess.getInteger(org.openremote.container.util.MapAccess.getInteger) ArrayList(java.util.ArrayList) Level(java.util.logging.Level) Notification(org.openremote.model.notification.Notification) UserQuery(org.openremote.model.query.UserQuery) Recipient(org.simplejavamail.email.Recipient) org.openremote.model.query.filter(org.openremote.model.query.filter) EmailNotificationMessage(org.openremote.model.notification.EmailNotificationMessage) MapAccess.getBoolean(org.openremote.container.util.MapAccess.getBoolean) TextUtil(org.openremote.model.util.TextUtil) NotificationSendResult(org.openremote.model.notification.NotificationSendResult) User(org.openremote.model.security.User) ManagerIdentityService(org.openremote.manager.security.ManagerIdentityService) Asset(org.openremote.model.asset.Asset) MailerBuilder(org.simplejavamail.mailer.MailerBuilder) AssetQuery(org.openremote.model.query.AssetQuery) Mailer(org.simplejavamail.mailer.Mailer) ContainerService(org.openremote.model.ContainerService) Logger(java.util.logging.Logger) Constants(org.openremote.model.Constants) Collectors(java.util.stream.Collectors) Container(org.openremote.model.Container) List(java.util.List) EmailBuilder(org.simplejavamail.email.EmailBuilder) Email(org.simplejavamail.email.Email) Collections(java.util.Collections) EmailNotificationMessage(org.openremote.model.notification.EmailNotificationMessage) User(org.openremote.model.security.User) AssetQuery(org.openremote.model.query.AssetQuery) ArrayList(java.util.ArrayList) Recipient(org.simplejavamail.email.Recipient) Notification(org.openremote.model.notification.Notification) UserQuery(org.openremote.model.query.UserQuery) Asset(org.openremote.model.asset.Asset)

Example 30 with Asset

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()));
        });
    }
}
Also used : AssetStorageService(org.openremote.manager.asset.AssetStorageService) Tenant(org.openremote.model.security.Tenant) IntStream(java.util.stream.IntStream) ManagerKeycloakIdentityProvider(org.openremote.manager.security.ManagerKeycloakIdentityProvider) java.util(java.util) GATEWAY(org.openremote.model.syslog.SyslogCategory.GATEWAY) AssetProcessingException(org.openremote.manager.asset.AssetProcessingException) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) Exchange(org.apache.camel.Exchange) AssetProcessingService(org.openremote.manager.asset.AssetProcessingService) Level(java.util.logging.Level) Predicate(org.apache.camel.Predicate) RulesetStorageService(org.openremote.manager.rules.RulesetStorageService) RulesService(org.openremote.manager.rules.RulesService) ScheduledExecutorService(java.util.concurrent.ScheduledExecutorService) SyslogCategory(org.openremote.model.syslog.SyslogCategory) TextUtil(org.openremote.model.util.TextUtil) PersistenceEvent(org.openremote.model.PersistenceEvent) MessageBrokerService(org.openremote.container.message.MessageBrokerService) User(org.openremote.model.security.User) Ruleset(org.openremote.model.rules.Ruleset) ManagerIdentityService(org.openremote.manager.security.ManagerIdentityService) Asset(org.openremote.model.asset.Asset) GatewayDisconnectEvent(org.openremote.model.gateway.GatewayDisconnectEvent) AssetQuery(org.openremote.model.query.AssetQuery) GatewayAsset(org.openremote.model.asset.impl.GatewayAsset) ContainerService(org.openremote.model.ContainerService) EntityManager(javax.persistence.EntityManager) Logger(java.util.logging.Logger) Collectors(java.util.stream.Collectors) Container(org.openremote.model.Container) Consumer(java.util.function.Consumer) ClientEventService(org.openremote.manager.event.ClientEventService) RouteBuilder(org.apache.camel.builder.RouteBuilder) PERSISTENCE_TOPIC(org.openremote.container.persistence.PersistenceService.PERSISTENCE_TOPIC) GatewayConnector.mapAssetId(org.openremote.manager.gateway.GatewayConnector.mapAssetId) org.openremote.model.attribute(org.openremote.model.attribute) AssetUpdateProcessor(org.openremote.manager.asset.AssetUpdateProcessor) PredicateBuilder.and(org.apache.camel.builder.PredicateBuilder.and) PredicateBuilder.or(org.apache.camel.builder.PredicateBuilder.or) PersistenceService.isPersistenceEventForEntityType(org.openremote.container.persistence.PersistenceService.isPersistenceEventForEntityType) ConnectionConstants(org.openremote.container.web.ConnectionConstants) SharedEvent(org.openremote.model.event.shared.SharedEvent) AssetQuery(org.openremote.model.query.AssetQuery) Asset(org.openremote.model.asset.Asset) GatewayAsset(org.openremote.model.asset.impl.GatewayAsset) GatewayAsset(org.openremote.model.asset.impl.GatewayAsset)

Aggregations

Asset (org.openremote.model.asset.Asset)45 Logger (java.util.logging.Logger)20 java.util (java.util)18 Level (java.util.logging.Level)18 Collectors (java.util.stream.Collectors)18 AssetQuery (org.openremote.model.query.AssetQuery)15 AssetStorageService (org.openremote.manager.asset.AssetStorageService)14 ManagerIdentityService (org.openremote.manager.security.ManagerIdentityService)14 MessageBrokerService (org.openremote.container.message.MessageBrokerService)13 TimerService (org.openremote.container.timer.TimerService)13 Container (org.openremote.model.Container)13 RouteBuilder (org.apache.camel.builder.RouteBuilder)12 ContainerService (org.openremote.model.ContainerService)11 PersistenceEvent (org.openremote.model.PersistenceEvent)11 Attribute (org.openremote.model.attribute.Attribute)11 ScheduledExecutorService (java.util.concurrent.ScheduledExecutorService)10 ClientEventService (org.openremote.manager.event.ClientEventService)10 EntityManager (javax.persistence.EntityManager)9 Tenant (org.openremote.model.security.Tenant)9 Pair (org.openremote.model.util.Pair)9