use of org.openremote.model.asset.Asset 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.asset.Asset in project openremote by openremote.
the class RulesetResourceImpl method getAssetRulesets.
@Override
public AssetRuleset[] getAssetRulesets(@BeanParam RequestParams requestParams, String assetId) {
Asset asset = assetStorageService.find(assetId, false);
if (asset == null)
return new AssetRuleset[0];
if (!isRealmAccessibleByUser(asset.getTenantRealm())) {
throw new WebApplicationException(Response.Status.FORBIDDEN);
}
if (isRestrictedUser() && !assetStorageService.isUserAsset(getUserId(), assetId)) {
throw new WebApplicationException(Response.Status.FORBIDDEN);
}
List<AssetRuleset> result = rulesetStorageService.findAssetRulesets(asset.getRealmId(), assetId);
return result.toArray(new AssetRuleset[result.size()]);
}
use of org.openremote.model.asset.Asset in project openremote by openremote.
the class RulesetResourceImpl method deleteAssetRuleset.
@Override
public void deleteAssetRuleset(@BeanParam RequestParams requestParams, Long id) {
AssetRuleset ruleset = rulesetStorageService.findById(AssetRuleset.class, id);
if (ruleset == null) {
return;
}
Asset asset = assetStorageService.find(ruleset.getAssetId(), false);
if (asset == null) {
throw new WebApplicationException(NOT_FOUND);
}
if (!isRealmAccessibleByUser(asset.getTenantRealm())) {
throw new WebApplicationException(Response.Status.FORBIDDEN);
}
if (isRestrictedUser() && !assetStorageService.isUserAsset(getUserId(), asset.getId())) {
throw new WebApplicationException(Response.Status.FORBIDDEN);
}
rulesetStorageService.delete(AssetRuleset.class, id);
}
use of org.openremote.model.asset.Asset in project openremote by openremote.
the class RulesetResourceImpl method getAssetRuleset.
@Override
public AssetRuleset getAssetRuleset(@BeanParam RequestParams requestParams, Long id) {
AssetRuleset ruleset = rulesetStorageService.findById(AssetRuleset.class, id);
if (ruleset == null) {
throw new WebApplicationException(NOT_FOUND);
}
Asset asset = assetStorageService.find(ruleset.getAssetId(), false);
if (asset == null) {
throw new WebApplicationException(NOT_FOUND);
}
if (!isRealmAccessibleByUser(asset.getTenantRealm())) {
throw new WebApplicationException(Response.Status.FORBIDDEN);
}
if (isRestrictedUser() && !assetStorageService.isUserAsset(getUserId(), asset.getId())) {
throw new WebApplicationException(Response.Status.FORBIDDEN);
}
return ruleset;
}
use of org.openremote.model.asset.Asset in project openremote by openremote.
the class UpnpProtocol method createAsset.
protected Asset createAsset(String parentId, Device device) {
Asset asset = new Asset(device.getDisplayString(), AssetType.THING);
asset.setParentId(parentId);
asset.setId(getAssetId(device));
long currentTime = timerService.getCurrentTimeMillis();
Optional.ofNullable(device.getType().getDisplayString()).ifPresent(v -> asset.addAttributes(new AssetAttribute("type", STRING, Values.create(v), currentTime).addMeta(new MetaItem(LABEL, Values.create("Device Type")))));
Optional.ofNullable(device.getDetails().getManufacturerDetails().getManufacturer()).ifPresent(v -> asset.addAttributes(new AssetAttribute("manufacturer", STRING, Values.create(v), currentTime).addMeta(new MetaItem(LABEL, Values.create("Manufacturer")))));
Optional.ofNullable(device.getDetails().getFriendlyName()).ifPresent(v -> asset.addAttributes(new AssetAttribute("friendlyName", STRING, Values.create(v), currentTime).addMeta(new MetaItem(LABEL, Values.create("Friendly Name")))));
Optional.ofNullable(device.getDetails().getModelDetails().getModelNumber()).ifPresent(v -> asset.addAttributes(new AssetAttribute("modelNumber", STRING, Values.create(v), currentTime).addMeta(new MetaItem(LABEL, Values.create("Model Number")))));
Optional.ofNullable(device.getDetails().getModelDetails().getModelName()).ifPresent(v -> asset.addAttributes(new AssetAttribute("modelName", STRING, Values.create(v), currentTime).addMeta(new MetaItem(LABEL, Values.create("Model Name")))));
Optional.ofNullable(device.getDetails().getModelDetails().getModelDescription()).ifPresent(v -> asset.addAttributes(new AssetAttribute("modelDescription", STRING, Values.create(v), currentTime).addMeta(new MetaItem(LABEL, Values.create("Model Description")))));
Optional.ofNullable(device.getDetails().getSerialNumber()).ifPresent(v -> asset.addAttributes(new AssetAttribute("serialNumber", STRING, Values.create(v), currentTime).addMeta(new MetaItem(LABEL, Values.create("Serial Number")))));
return asset;
}
Aggregations