use of org.openremote.model.value.ObjectValue in project openremote by openremote.
the class Protocol method getLinkedAttributeMessageFilters.
/**
* Extract the {@link MessageFilter}s from the specified {@link Attribute}
*/
static Optional<List<MessageFilter>> getLinkedAttributeMessageFilters(Attribute attribute) {
if (attribute == null) {
return Optional.empty();
}
Optional<ArrayValue> arrayValueOptional = attribute.getMetaItem(META_PROTOCOL_FILTERS).flatMap(AbstractValueHolder::getValueAsArray);
if (!arrayValueOptional.isPresent()) {
return Optional.empty();
}
try {
ArrayValue arrayValue = arrayValueOptional.get();
List<MessageFilter> messageFilters = new ArrayList<>(arrayValue.length());
for (int i = 0; i < arrayValue.length(); i++) {
ObjectValue objValue = arrayValue.getObject(i).orElseThrow(() -> new IllegalArgumentException("Attribute protocol filters meta item is invalid"));
MessageFilter filter = deserialiseMessageFilter(objValue);
messageFilters.add(filter);
}
return messageFilters.isEmpty() ? Optional.empty() : Optional.of(messageFilters);
} catch (IllegalArgumentException e) {
LOG.log(Level.WARNING, e.getMessage(), e);
}
return Optional.empty();
}
use of org.openremote.model.value.ObjectValue in project openremote by openremote.
the class RulesService method processAssetChange.
protected void processAssetChange(ServerAsset asset, PersistenceEvent persistenceEvent) {
withLock(getClass().getSimpleName() + "::processAssetChange", () -> {
// We must load the asset from database (only when required), as the
// persistence event might not contain a completely loaded asset
BiFunction<Asset, AssetAttribute, AssetState> buildAssetState = (loadedAsset, attribute) -> new AssetState(loadedAsset, attribute.deepCopy(), Source.INTERNAL);
switch(persistenceEvent.getCause()) {
case INSERT:
// New asset has been created so get attributes that have RULE_STATE meta
List<AssetAttribute> ruleStateAttributes = asset.getAttributesStream().filter(AssetAttribute::isRuleState).collect(Collectors.toList());
// Build an update with a fully loaded asset
ruleStateAttributes.forEach(attribute -> {
ServerAsset loadedAsset = assetStorageService.find(asset.getId(), true);
// If the asset is now gone it was deleted immediately after being inserted, nothing more to do
if (loadedAsset == null)
return;
AssetState assetState = buildAssetState.apply(loadedAsset, attribute);
LOG.fine("Asset was persisted (" + persistenceEvent.getCause() + "), inserting fact: " + assetState);
updateAssetState(assetState, true, true);
});
break;
case UPDATE:
int attributesIndex = Arrays.asList(persistenceEvent.getPropertyNames()).indexOf("attributes");
if (attributesIndex < 0) {
return;
}
// Fully load the asset
final Asset loadedAsset = assetStorageService.find(asset.getId(), true);
// If the asset is now gone it was deleted immediately after being updated, nothing more to do
if (loadedAsset == null)
return;
// Attributes have possibly changed so need to compare old and new attributes
// to determine which facts to retract and which to insert
List<AssetAttribute> oldRuleStateAttributes = attributesFromJson((ObjectValue) persistenceEvent.getPreviousState()[attributesIndex], asset.getId()).filter(AssetAttribute::isRuleState).collect(Collectors.toList());
List<AssetAttribute> newRuleStateAttributes = attributesFromJson((ObjectValue) persistenceEvent.getCurrentState()[attributesIndex], asset.getId()).filter(AssetAttribute::isRuleState).collect(Collectors.toList());
// Retract facts for attributes that are obsolete
getAddedOrModifiedAttributes(newRuleStateAttributes, oldRuleStateAttributes, key -> key.equals(VALUE_TIMESTAMP_FIELD_NAME)).forEach(obsoleteFactAttribute -> {
AssetState update = buildAssetState.apply(loadedAsset, obsoleteFactAttribute);
LOG.fine("Asset was persisted (" + persistenceEvent.getCause() + "), retracting: " + update);
retractAssetState(update);
});
// Insert facts for attributes that are new
getAddedOrModifiedAttributes(oldRuleStateAttributes, newRuleStateAttributes, key -> key.equals(VALUE_TIMESTAMP_FIELD_NAME)).forEach(newFactAttribute -> {
AssetState assetState = buildAssetState.apply(loadedAsset, newFactAttribute);
LOG.fine("Asset was persisted (" + persistenceEvent.getCause() + "), updating: " + assetState);
updateAssetState(assetState, true, true);
});
break;
case DELETE:
// Retract any facts that were associated with this asset
asset.getAttributesStream().filter(AssetAttribute::isRuleState).forEach(attribute -> {
// We can't load the asset again (it was deleted), so don't use buildAssetState() and
// hope that the path of the event asset has been loaded before deletion, although it is
// "unlikely" anybody will access it during retraction...
AssetState assetState = new AssetState(asset, attribute, Source.INTERNAL);
LOG.fine("Asset was persisted (" + persistenceEvent.getCause() + "), retracting fact: " + assetState);
retractAssetState(assetState);
});
break;
}
});
}
use of org.openremote.model.value.ObjectValue in project openremote by openremote.
the class AttributeValueConstraint method toModelValue.
public ObjectValue toModelValue() {
ObjectValue objectValue = Values.createObject();
objectValue.put("valueComparator", valueComparator.name());
objectValue.put("value", value);
return objectValue;
}
use of org.openremote.model.value.ObjectValue in project openremote by openremote.
the class CalendarEvent method fromValue.
public static Optional<CalendarEvent> fromValue(Value value) {
if (value == null || value.getType() != ValueType.OBJECT) {
return Optional.empty();
}
ObjectValue objectValue = (ObjectValue) value;
Optional<Long> start = objectValue.get("start").flatMap(Values::getLongCoerced);
Optional<Long> end = objectValue.get("end").flatMap(Values::getLongCoerced);
Optional<RecurrenceRule> recurrence = RecurrenceRule.fromValue(objectValue.getObject("recurrence").orElse(null));
if (!start.isPresent() || !end.isPresent()) {
return Optional.empty();
}
return Optional.of(new CalendarEvent(new Date(1000L * start.get()), new Date(1000L * end.get()), recurrence.orElse(null)));
}
use of org.openremote.model.value.ObjectValue in project openremote by openremote.
the class RecurrenceRule method toValue.
public Value toValue() {
ObjectValue objectValue = Values.createObject();
objectValue.put("frequency", Values.create(frequency.name()));
if (interval != null) {
objectValue.put("interval", Values.create(interval));
}
if (count != null) {
objectValue.put("count", Values.create(count));
}
if (until != null) {
objectValue.put("until", Values.create(until.getTime() / 1000));
}
return objectValue;
}
Aggregations