use of org.openremote.model.asset.AssetType.AGENT in project openremote by openremote.
the class AgentService method processAssetChange.
/**
* Looks for new, modified and obsolete AGENT_LINK attributes and links / unlinks them
* with the protocol
*/
protected void processAssetChange(Asset asset, PersistenceEvent persistenceEvent) {
LOG.finest("Processing asset persistence event: " + persistenceEvent.getCause());
switch(persistenceEvent.getCause()) {
case INSERT:
// Asset insert persistence events can be fired before the agent insert persistence event
// so need to check that all protocol configs exist - any that don't we will exclude here
// and handle in agent insert
// If an agent insert just occurred then we will end up trying to link the attribute again
// so we keep track of linked attributes to avoid this
// Link any AGENT_LINK attributes to their referenced protocol
Map<AssetAttribute, List<AssetAttribute>> groupedAgentLinksAttributes = getGroupedAgentLinkAttributes(asset.getAttributesStream(), attribute -> true, attribute -> LOG.warning("Linked protocol configuration not found: " + attribute));
groupedAgentLinksAttributes.forEach(this::linkAttributes);
break;
case UPDATE:
List<String> propertyNames = Arrays.asList(persistenceEvent.getPropertyNames());
// Check if attributes of the asset have been modified
int attributesIndex = propertyNames.indexOf("attributes");
if (attributesIndex < 0) {
return;
}
// Attributes have possibly changed so need to compare old and new state to determine any changes to
// AGENT_LINK attributes
List<AssetAttribute> oldAgentLinkedAttributes = attributesFromJson((ObjectValue) persistenceEvent.getPreviousState()[attributesIndex], asset.getId()).filter(AgentLink::hasAgentLink).collect(Collectors.toList());
List<AssetAttribute> newAgentLinkedAttributes = attributesFromJson((ObjectValue) persistenceEvent.getCurrentState()[attributesIndex], asset.getId()).filter(AgentLink::hasAgentLink).collect(Collectors.toList());
// Unlink thing attributes that are in old but not in new
getGroupedAgentLinkAttributes(getAddedOrModifiedAttributes(newAgentLinkedAttributes, oldAgentLinkedAttributes, key -> key.equals(VALUE_TIMESTAMP_FIELD_NAME)), attribute -> true).forEach(this::unlinkAttributes);
// Link thing attributes that are in new but not in old
getGroupedAgentLinkAttributes(getAddedOrModifiedAttributes(oldAgentLinkedAttributes, newAgentLinkedAttributes, key -> key.equals(VALUE_TIMESTAMP_FIELD_NAME)), attribute -> true, attribute -> LOG.warning("Linked protocol configuration not found: " + attribute)).forEach(this::linkAttributes);
break;
case DELETE:
{
// Unlink any AGENT_LINK attributes from the referenced protocol
Map<AssetAttribute, List<AssetAttribute>> groupedAgentLinkAndProtocolAttributes = getGroupedAgentLinkAttributes(asset.getAttributesStream(), attribute -> true);
groupedAgentLinkAndProtocolAttributes.forEach(this::unlinkAttributes);
break;
}
}
}
use of org.openremote.model.asset.AssetType.AGENT 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;
}
}
Aggregations