Search in sources :

Example 6 with Asset

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;
        }
    });
}
Also used : PersistenceEvent(org.openremote.container.persistence.PersistenceEvent) Tenant(org.openremote.model.security.Tenant) java.util(java.util) BiFunction(java.util.function.BiFunction) AssetAttribute.getAddedOrModifiedAttributes(org.openremote.model.asset.AssetAttribute.getAddedOrModifiedAttributes) NotificationService(org.openremote.manager.notification.NotificationService) ObjectValue(org.openremote.model.value.ObjectValue) MapAccess.getString(org.openremote.container.util.MapAccess.getString) GlobalLock.withLockReturning(org.openremote.container.concurrent.GlobalLock.withLockReturning) Container(org.openremote.container.Container) ContainerService(org.openremote.container.ContainerService) PersistenceEvent.isPersistenceEventForEntityType(org.openremote.container.persistence.PersistenceEvent.isPersistenceEventForEntityType) PersistenceService(org.openremote.container.persistence.PersistenceService) ManagerExecutorService(org.openremote.manager.concurrent.ManagerExecutorService) PERSISTENCE_TOPIC(org.openremote.container.persistence.PersistenceEvent.PERSISTENCE_TOPIC) org.openremote.model.rules(org.openremote.model.rules) ManagerIdentityService(org.openremote.manager.security.ManagerIdentityService) Asset(org.openremote.model.asset.Asset) 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) EntityManager(javax.persistence.EntityManager) Logger(java.util.logging.Logger) MessageBrokerSetupService(org.openremote.container.message.MessageBrokerSetupService) Collectors(java.util.stream.Collectors) AssetMeta(org.openremote.model.asset.AssetMeta) org.openremote.manager.asset(org.openremote.manager.asset) AssetQuery(org.openremote.model.asset.AssetQuery) Stream(java.util.stream.Stream) RouteBuilder(org.apache.camel.builder.RouteBuilder) TimerService(org.openremote.container.timer.TimerService) Source(org.openremote.model.attribute.AttributeEvent.Source) AssetAttribute(org.openremote.model.asset.AssetAttribute) FINEST(java.util.logging.Level.FINEST) GlobalLock.withLock(org.openremote.container.concurrent.GlobalLock.withLock) AssetAttribute(org.openremote.model.asset.AssetAttribute) Asset(org.openremote.model.asset.Asset)

Example 7 with Asset

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()]);
}
Also used : AssetRuleset(org.openremote.model.rules.AssetRuleset) WebApplicationException(javax.ws.rs.WebApplicationException) Asset(org.openremote.model.asset.Asset)

Example 8 with Asset

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);
}
Also used : AssetRuleset(org.openremote.model.rules.AssetRuleset) WebApplicationException(javax.ws.rs.WebApplicationException) Asset(org.openremote.model.asset.Asset)

Example 9 with Asset

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;
}
Also used : AssetRuleset(org.openremote.model.rules.AssetRuleset) WebApplicationException(javax.ws.rs.WebApplicationException) Asset(org.openremote.model.asset.Asset)

Example 10 with Asset

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;
}
Also used : MetaItem(org.openremote.model.attribute.MetaItem) AssetAttribute(org.openremote.model.asset.AssetAttribute) Asset(org.openremote.model.asset.Asset)

Aggregations

Asset (org.openremote.model.asset.Asset)19 WebApplicationException (javax.ws.rs.WebApplicationException)5 ServerAsset (org.openremote.manager.asset.ServerAsset)5 AssetAttribute (org.openremote.model.asset.AssetAttribute)5 PersistenceService (org.openremote.container.persistence.PersistenceService)3 TimerService (org.openremote.container.timer.TimerService)3 ManagerIdentityService (org.openremote.manager.security.ManagerIdentityService)3 AssetRuleset (org.openremote.model.rules.AssetRuleset)3 ArrayList (java.util.ArrayList)2 Logger (java.util.logging.Logger)2 Collectors (java.util.stream.Collectors)2 EntityManager (javax.persistence.EntityManager)2 RouteBuilder (org.apache.camel.builder.RouteBuilder)2 Container (org.openremote.container.Container)2 ContainerService (org.openremote.container.ContainerService)2 GlobalLock.withLock (org.openremote.container.concurrent.GlobalLock.withLock)2 MessageBrokerService (org.openremote.container.message.MessageBrokerService)2 MessageBrokerSetupService (org.openremote.container.message.MessageBrokerSetupService)2 AgentService (org.openremote.manager.agent.AgentService)2 ByteArrayInputStream (java.io.ByteArrayInputStream)1