Search in sources :

Example 6 with PersistenceEvent

use of org.openremote.container.persistence.PersistenceEvent in project openremote by openremote.

the class AgentService method processAgentChange.

/**
 * Looks for new, modified and obsolete protocol configurations and links / unlinks any associated attributes
 */
protected void processAgentChange(Asset agent, PersistenceEvent persistenceEvent) {
    LOG.finest("Processing agent persistence event: " + persistenceEvent.getCause());
    switch(persistenceEvent.getCause()) {
        case INSERT:
            addReplaceAgent(agent);
            linkProtocolConfigurations(agent.getAttributesStream().filter(ProtocolConfiguration::isProtocolConfiguration));
            break;
        case UPDATE:
            addReplaceAgent(agent);
            // Check if any protocol config attributes have been added/removed or modified
            int attributesIndex = Arrays.asList(persistenceEvent.getPropertyNames()).indexOf("attributes");
            if (attributesIndex < 0) {
                return;
            }
            // Attributes have possibly changed so need to compare old and new state to determine
            // which protocol configs are affected
            List<AssetAttribute> oldProtocolConfigurations = attributesFromJson((ObjectValue) persistenceEvent.getPreviousState()[attributesIndex], agent.getId()).filter(ProtocolConfiguration::isProtocolConfiguration).collect(Collectors.toList());
            List<AssetAttribute> newProtocolConfigurations = attributesFromJson((ObjectValue) persistenceEvent.getCurrentState()[attributesIndex], agent.getId()).filter(ProtocolConfiguration::isProtocolConfiguration).collect(Collectors.toList());
            // Compare protocol configurations by JSON value
            // Unlink protocols that are in oldConfigs but not in newConfigs
            unlinkProtocolConfigurations(oldProtocolConfigurations.stream().filter(oldProtocolAttribute -> newProtocolConfigurations.stream().noneMatch(oldProtocolAttribute::equals)));
            // Link protocols that are in newConfigs but not in oldConfigs
            linkProtocolConfigurations(newProtocolConfigurations.stream().filter(newProtocolAttribute -> oldProtocolConfigurations.stream().noneMatch(newProtocolAttribute::equals)));
            break;
        case DELETE:
            removeAgent(agent);
            // Unlink any attributes that have an agent link to this agent
            unlinkProtocolConfigurations(agent.getAttributesStream().filter(ProtocolConfiguration::isProtocolConfiguration));
            break;
    }
}
Also used : PersistenceEvent(org.openremote.container.persistence.PersistenceEvent) java.util(java.util) ClientRole(org.openremote.model.security.ClientRole) WebService(org.openremote.container.web.WebService) AssetAttribute.getAddedOrModifiedAttributes(org.openremote.model.asset.AssetAttribute.getAddedOrModifiedAttributes) ConnectionStatus(org.openremote.model.asset.agent.ConnectionStatus) AttributeRef(org.openremote.model.attribute.AttributeRef) SENSOR_QUEUE(org.openremote.agent.protocol.Protocol.SENSOR_QUEUE) ASSET_QUEUE(org.openremote.manager.asset.AssetProcessingService.ASSET_QUEUE) ObjectValue(org.openremote.model.value.ObjectValue) Point(com.vividsolutions.jts.geom.Point) Level(java.util.logging.Level) ACTUATOR_TOPIC(org.openremote.agent.protocol.Protocol.ACTUATOR_TOPIC) GlobalLock.withLockReturning(org.openremote.container.concurrent.GlobalLock.withLockReturning) Container(org.openremote.container.Container) TenantFilter(org.openremote.model.event.shared.TenantFilter) ContainerService(org.openremote.container.ContainerService) AttributeEvent(org.openremote.model.attribute.AttributeEvent) org.openremote.model.asset(org.openremote.model.asset) AGENT(org.openremote.model.asset.AssetType.AGENT) AgentLink.getAgentLink(org.openremote.model.asset.agent.AgentLink.getAgentLink) MessageBrokerService(org.openremote.container.message.MessageBrokerService) ManagerIdentityService(org.openremote.manager.security.ManagerIdentityService) SENSOR(org.openremote.model.attribute.AttributeEvent.Source.SENSOR) Predicate(java.util.function.Predicate) Pair(org.openremote.model.util.Pair) VALUE_TIMESTAMP_FIELD_NAME(org.openremote.model.AbstractValueTimestampHolder.VALUE_TIMESTAMP_FIELD_NAME) AssetAttribute.attributesFromJson(org.openremote.model.asset.AssetAttribute.attributesFromJson) ProtocolAssetService(org.openremote.agent.protocol.ProtocolAssetService) EntityManager(javax.persistence.EntityManager) Logger(java.util.logging.Logger) MessageBrokerSetupService(org.openremote.container.message.MessageBrokerSetupService) Collectors(java.util.stream.Collectors) HEADER_SOURCE(org.openremote.model.attribute.AttributeEvent.HEADER_SOURCE) TextUtil.isValidURN(org.openremote.model.util.TextUtil.isValidURN) org.openremote.manager.asset(org.openremote.manager.asset) Consumer(java.util.function.Consumer) ClientEventService(org.openremote.manager.event.ClientEventService) Stream(java.util.stream.Stream) org.openremote.model.asset.agent(org.openremote.model.asset.agent) RouteBuilder(org.apache.camel.builder.RouteBuilder) TimerService(org.openremote.container.timer.TimerService) Source(org.openremote.model.attribute.AttributeEvent.Source) TextUtil.isNullOrEmpty(org.openremote.model.util.TextUtil.isNullOrEmpty) GlobalLock(org.openremote.container.concurrent.GlobalLock) Protocol(org.openremote.agent.protocol.Protocol) GlobalLock.withLock(org.openremote.container.concurrent.GlobalLock.withLock) Point(com.vividsolutions.jts.geom.Point)

Aggregations

PersistenceEvent (org.openremote.container.persistence.PersistenceEvent)6 java.util (java.util)3 Logger (java.util.logging.Logger)3 Collectors (java.util.stream.Collectors)3 Stream (java.util.stream.Stream)3 EntityManager (javax.persistence.EntityManager)3 RouteBuilder (org.apache.camel.builder.RouteBuilder)3 Container (org.openremote.container.Container)3 ContainerService (org.openremote.container.ContainerService)3 GlobalLock.withLock (org.openremote.container.concurrent.GlobalLock.withLock)3 GlobalLock.withLockReturning (org.openremote.container.concurrent.GlobalLock.withLockReturning)3 MessageBrokerSetupService (org.openremote.container.message.MessageBrokerSetupService)3 TimerService (org.openremote.container.timer.TimerService)3 org.openremote.manager.asset (org.openremote.manager.asset)3 ManagerIdentityService (org.openremote.manager.security.ManagerIdentityService)3 VALUE_TIMESTAMP_FIELD_NAME (org.openremote.model.AbstractValueTimestampHolder.VALUE_TIMESTAMP_FIELD_NAME)3 AssetAttribute.attributesFromJson (org.openremote.model.asset.AssetAttribute.attributesFromJson)3 AssetAttribute.getAddedOrModifiedAttributes (org.openremote.model.asset.AssetAttribute.getAddedOrModifiedAttributes)3 AttributeEvent (org.openremote.model.attribute.AttributeEvent)3 Source (org.openremote.model.attribute.AttributeEvent.Source)3