Search in sources :

Example 36 with Asset

use of org.openremote.model.asset.Asset in project openremote by openremote.

the class RulesetResourceImpl method createAssetRuleset.

/* ################################################################################################# */
@Override
public void createAssetRuleset(@BeanParam RequestParams requestParams, AssetRuleset ruleset) {
    String assetId = ruleset.getAssetId();
    if (assetId == null || assetId.length() == 0) {
        throw new WebApplicationException("Missing asset identifier value", BAD_REQUEST);
    }
    Asset asset = assetStorageService.find(assetId, 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.merge(ruleset);
}
Also used : WebApplicationException(javax.ws.rs.WebApplicationException) Asset(org.openremote.model.asset.Asset)

Example 37 with Asset

use of org.openremote.model.asset.Asset in project openremote by openremote.

the class RulesetResourceImpl method updateAssetRuleset.

@Override
public void updateAssetRuleset(@BeanParam RequestParams requestParams, Long id, AssetRuleset ruleset) {
    AssetRuleset existingRuleset = rulesetStorageService.findById(AssetRuleset.class, id);
    if (existingRuleset == null) {
        throw new WebApplicationException(NOT_FOUND);
    }
    Asset asset = assetStorageService.find(existingRuleset.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);
    }
    if (!id.equals(ruleset.getId())) {
        throw new WebApplicationException("Requested ID and ruleset ID don't match", BAD_REQUEST);
    }
    if (!existingRuleset.getAssetId().equals(ruleset.getAssetId())) {
        throw new WebApplicationException("Can't update asset ID, delete and create the ruleset to reassign", BAD_REQUEST);
    }
    rulesetStorageService.merge(ruleset);
}
Also used : AssetRuleset(org.openremote.model.rules.AssetRuleset) WebApplicationException(javax.ws.rs.WebApplicationException) Asset(org.openremote.model.asset.Asset)

Example 38 with Asset

use of org.openremote.model.asset.Asset in project openremote by openremote.

the class AssetsFacade method query.

@Override
public Assets.RestrictedQuery query() {
    Assets.RestrictedQuery query = new Assets.RestrictedQuery() {

        @Override
        public Assets.RestrictedQuery select(Select select) {
            throw new IllegalArgumentException("Overriding query projection is not allowed in this rules scope");
        }

        @Override
        public Assets.RestrictedQuery id(String id) {
            throw new IllegalArgumentException("Overriding query restriction is not allowed in this rules scope");
        }

        @Override
        public Assets.RestrictedQuery tenant(TenantPredicate tenantPredicate) {
            if (GlobalRuleset.class.isAssignableFrom(rulesEngineId.getScope()))
                return super.tenant(tenantPredicate);
            throw new IllegalArgumentException("Overriding query restriction is not allowed in this rules scope");
        }

        @Override
        public Assets.RestrictedQuery userId(String userId) {
            throw new IllegalArgumentException("Overriding query restriction is not allowed in this rules scope");
        }

        @Override
        public Assets.RestrictedQuery orderBy(OrderBy orderBy) {
            throw new IllegalArgumentException("Overriding query result order is not allowed in this rules scope");
        }

        @Override
        public String getResult() {
            ServerAsset asset = assetStorageService.find(this);
            return asset != null ? asset.getId() : null;
        }

        @Override
        public Stream<String> stream() {
            if (this.select == null)
                this.select = new Select();
            Include oldValue = this.select.include;
            this.select.include = Include.ONLY_ID_AND_NAME;
            try {
                return assetStorageService.findAll(this).stream().map(Asset::getId);
            } finally {
                this.select.include = oldValue;
            }
        }
    };
    if (TenantRuleset.class.isAssignableFrom(rulesEngineId.getScope())) {
        query.tenant = new TenantPredicate(rulesEngineId.getRealmId().orElseThrow(() -> new IllegalArgumentException("Realm ID missing: " + rulesEngineId)));
    }
    if (AssetRuleset.class.isAssignableFrom(rulesEngineId.getScope())) {
        ServerAsset restrictedAsset = assetStorageService.find(rulesEngineId.getAssetId().orElseThrow(() -> new IllegalStateException("Asset ID missing: " + rulesEngineId)), true);
        if (restrictedAsset == null) {
            throw new IllegalStateException("Asset is no longer available: " + rulesEngineId);
        }
        query.path = new PathPredicate(restrictedAsset.getPath());
    }
    return query;
}
Also used : PathPredicate(org.openremote.model.asset.AssetQuery.PathPredicate) ServerAsset(org.openremote.manager.asset.ServerAsset) TenantPredicate(org.openremote.model.asset.AssetQuery.TenantPredicate) Asset(org.openremote.model.asset.Asset) ServerAsset(org.openremote.manager.asset.ServerAsset)

Example 39 with Asset

use of org.openremote.model.asset.Asset in project openremote by openremote.

the class PersistenceService method init.

@Override
public void init(Container container) throws Exception {
    this.messageBrokerService = container.hasService(MessageBrokerService.class) ? container.getService(MessageBrokerService.class) : null;
    String dbVendor = getString(container.getConfig(), DB_VENDOR, DB_VENDOR_DEFAULT).toUpperCase(Locale.ROOT);
    LOG.info("Preparing persistence service for database: " + dbVendor);
    try {
        database = Database.Product.valueOf(dbVendor);
    } catch (Exception e) {
        LOG.severe("Requested DB_VENDOR is not supported: " + dbVendor);
        throw new UnsupportedOperationException("Requested DB_VENDOR is not supported: " + dbVendor);
    }
    String dbHost = getString(container.getConfig(), DB_HOST, DB_HOST_DEFAULT);
    int dbPort = getInteger(container.getConfig(), DB_PORT, DB_PORT_DEFAULT);
    String dbName = getString(container.getConfig(), DB_NAME, DB_NAME_DEFAULT);
    String dbSchema = getString(container.getConfig(), DB_SCHEMA, DB_SCHEMA_DEFAULT);
    String dbUsername = getString(container.getConfig(), DB_USERNAME, DB_USERNAME_DEFAULT);
    String dbPassword = getString(container.getConfig(), DB_PASSWORD, DB_PASSWORD_DEFAULT);
    String connectionUrl = "jdbc:" + database.getConnectorName() + "://" + dbHost + ":" + dbPort + "/" + dbName;
    connectionUrl = UriBuilder.fromUri(connectionUrl).replaceQueryParam("currentSchema", dbSchema).build().toString();
    persistenceUnitProperties = database.createProperties();
    if (messageBrokerService != null) {
        persistenceUnitProperties.put(AvailableSettings.SESSION_SCOPED_INTERCEPTOR, PersistenceEventInterceptor.class.getName());
    }
    persistenceUnitProperties.put(AvailableSettings.DEFAULT_SCHEMA, dbSchema);
    // Add custom integrator so we can register a custom flush entity event listener
    persistenceUnitProperties.put(EntityManagerFactoryBuilderImpl.INTEGRATOR_PROVIDER, IntegratorProvider.class.getName());
    persistenceUnitName = getString(container.getConfig(), PERSISTENCE_UNIT_NAME, PERSISTENCE_UNIT_NAME_DEFAULT);
    forceClean = getBoolean(container.getConfig(), SETUP_WIPE_CLEAN_INSTALL, container.isDevMode());
    openDatabase(container, database, dbUsername, dbPassword, connectionUrl);
    prepareSchema(connectionUrl, dbUsername, dbPassword, dbSchema);
    // Register standard entity classes and also any Entity ClassProviders
    List<String> entityClasses = new ArrayList<>(50);
    entityClasses.add(Asset.class.getName());
    entityClasses.add(UserAssetLink.class.getName());
    entityClasses.add(AssetDatapoint.class.getName());
    entityClasses.add(SentNotification.class.getName());
    entityClasses.add(AssetPredictedDatapoint.class.getName());
    entityClasses.add(Tenant.class.getName());
    entityClasses.add(User.class.getName());
    entityClasses.add(UserAttribute.class.getName());
    entityClasses.add(RealmRole.class.getName());
    entityClasses.add(GlobalRuleset.class.getName());
    entityClasses.add(AssetRuleset.class.getName());
    entityClasses.add(TenantRuleset.class.getName());
    entityClasses.add(SyslogEvent.class.getName());
    entityClasses.add(GatewayConnection.class.getName());
    entityClasses.add(ConsoleAppConfig.class.getName());
    entityClasses.add(ProvisioningConfig.class.getName());
    entityClasses.add(X509ProvisioningConfig.class.getName());
    // Add packages with package-info (don't think this is JPA spec but hibernate specific)
    entityClasses.add("org.openremote.container.persistence");
    entityClasses.add("org.openremote.container.util");
    // Get asset sub type entities from asset model
    Arrays.stream(ValueUtil.getAssetDescriptors(null)).map(AssetDescriptor::getType).filter(assetClass -> assetClass.getAnnotation(Entity.class) != null).map(Class::getName).forEach(entityClasses::add);
    // Get any entity class providers from the service loader
    ServiceLoader<EntityClassProvider> entityClassProviders = ServiceLoader.load(EntityClassProvider.class);
    entityClassProviders.forEach(entityClassProvider -> entityClassProvider.getEntityClasses().stream().filter(entityClass -> entityClass.getAnnotation(Entity.class) != null).map(Class::getName).forEach(entityClasses::add));
    this.entityManagerFactory = getEntityManagerFactory(persistenceUnitProperties, entityClasses);
// Persistence.createEntityManagerFactory(persistenceUnitName, persistenceUnitProperties);
}
Also used : Tenant(org.openremote.model.security.Tenant) IntStream(java.util.stream.IntStream) MigrateResult(org.flywaydb.core.api.output.MigrateResult) UserAssetLink(org.openremote.model.asset.UserAssetLink) java.util(java.util) javax.persistence(javax.persistence) GatewayConnection(org.openremote.model.gateway.GatewayConnection) AssetDescriptor(org.openremote.model.asset.AssetDescriptor) AvailableSettings(org.hibernate.cfg.AvailableSettings) SentNotification(org.openremote.model.notification.SentNotification) URL(java.net.URL) Session(org.hibernate.Session) ValueUtil(org.openremote.model.util.ValueUtil) Function(java.util.function.Function) Level(java.util.logging.Level) ProvisioningConfig(org.openremote.model.provisioning.ProvisioningConfig) Predicate(org.apache.camel.Predicate) ClassTransformer(javax.persistence.spi.ClassTransformer) RealmRole(org.openremote.model.security.RealmRole) AssetRuleset(org.openremote.model.rules.AssetRuleset) DataSource(javax.sql.DataSource) ProducerTemplate(org.apache.camel.ProducerTemplate) X509ProvisioningConfig(org.openremote.model.provisioning.X509ProvisioningConfig) UriBuilder(javax.ws.rs.core.UriBuilder) MigrationInfo(org.flywaydb.core.api.MigrationInfo) ExchangePattern(org.apache.camel.ExchangePattern) ConsoleAppConfig(org.openremote.model.apps.ConsoleAppConfig) MessageBrokerService(org.openremote.container.message.MessageBrokerService) User(org.openremote.model.security.User) GlobalRuleset(org.openremote.model.rules.GlobalRuleset) Asset(org.openremote.model.asset.Asset) PersistenceUnitInfoDescriptor(org.hibernate.jpa.boot.internal.PersistenceUnitInfoDescriptor) PersistenceUnitTransactionType(javax.persistence.spi.PersistenceUnitTransactionType) AssetDatapoint(org.openremote.model.datapoint.AssetDatapoint) Field(java.lang.reflect.Field) Logger(java.util.logging.Logger) Consumer(java.util.function.Consumer) SyslogEvent(org.openremote.model.syslog.SyslogEvent) MapAccess(org.openremote.container.util.MapAccess) org.openremote.model(org.openremote.model) AssetPredictedDatapoint(org.openremote.model.datapoint.AssetPredictedDatapoint) EntityManagerFactoryBuilder(org.hibernate.jpa.boot.spi.EntityManagerFactoryBuilder) UserAttribute(org.openremote.model.security.UserAttribute) EntityManagerFactoryBuilderImpl(org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl) Flyway(org.flywaydb.core.Flyway) TenantRuleset(org.openremote.model.rules.TenantRuleset) SharedSessionContractImplementor(org.hibernate.engine.spi.SharedSessionContractImplementor) User(org.openremote.model.security.User) UserAttribute(org.openremote.model.security.UserAttribute) AssetDatapoint(org.openremote.model.datapoint.AssetDatapoint) UserAssetLink(org.openremote.model.asset.UserAssetLink) SentNotification(org.openremote.model.notification.SentNotification) AssetPredictedDatapoint(org.openremote.model.datapoint.AssetPredictedDatapoint) SyslogEvent(org.openremote.model.syslog.SyslogEvent) AssetRuleset(org.openremote.model.rules.AssetRuleset) Tenant(org.openremote.model.security.Tenant) GatewayConnection(org.openremote.model.gateway.GatewayConnection) TenantRuleset(org.openremote.model.rules.TenantRuleset) Asset(org.openremote.model.asset.Asset) X509ProvisioningConfig(org.openremote.model.provisioning.X509ProvisioningConfig) GlobalRuleset(org.openremote.model.rules.GlobalRuleset) AssetDatapoint(org.openremote.model.datapoint.AssetDatapoint) AssetPredictedDatapoint(org.openremote.model.datapoint.AssetPredictedDatapoint) ProvisioningConfig(org.openremote.model.provisioning.ProvisioningConfig) X509ProvisioningConfig(org.openremote.model.provisioning.X509ProvisioningConfig) RealmRole(org.openremote.model.security.RealmRole) ConsoleAppConfig(org.openremote.model.apps.ConsoleAppConfig)

Example 40 with Asset

use of org.openremote.model.asset.Asset in project openremote by openremote.

the class AssetsFacade method getResults.

@Override
public Stream<Asset<?>> getResults(AssetQuery assetQuery) {
    if (TenantRuleset.class.isAssignableFrom(rulesEngineId.getScope())) {
        // Realm is restricted to rules
        assetQuery.tenant = new TenantPredicate(rulesEngineId.getRealm().orElseThrow(() -> new IllegalArgumentException("Realm missing: " + rulesEngineId)));
    } else if (AssetRuleset.class.isAssignableFrom(rulesEngineId.getScope())) {
        // Realm is restricted to assets'
        assetQuery.tenant = new TenantPredicate(rulesEngineId.getRealm().orElseThrow(() -> new IllegalArgumentException("Realm missing: " + rulesEngineId)));
        Asset<?> restrictedAsset = assetStorageService.find(rulesEngineId.getAssetId().orElseThrow(() -> new IllegalStateException("Asset ID missing: " + rulesEngineId)), true);
        if (restrictedAsset == null) {
            throw new IllegalStateException("Asset is no longer available: " + rulesEngineId);
        }
        assetQuery.paths(new PathPredicate(restrictedAsset.getPath()));
    }
    AssetQuery.Select oldValue = assetQuery.select;
    assetQuery.select = new AssetQuery.Select().excludeAttributes();
    try {
        return assetStorageService.findAll(assetQuery).stream();
    } finally {
        assetQuery.select = oldValue;
    }
}
Also used : AssetRuleset(org.openremote.model.rules.AssetRuleset) PathPredicate(org.openremote.model.query.filter.PathPredicate) AssetQuery(org.openremote.model.query.AssetQuery) Asset(org.openremote.model.asset.Asset) TenantPredicate(org.openremote.model.query.filter.TenantPredicate)

Aggregations

Asset (org.openremote.model.asset.Asset)45 Logger (java.util.logging.Logger)20 java.util (java.util)18 Level (java.util.logging.Level)18 Collectors (java.util.stream.Collectors)18 AssetQuery (org.openremote.model.query.AssetQuery)15 AssetStorageService (org.openremote.manager.asset.AssetStorageService)14 ManagerIdentityService (org.openremote.manager.security.ManagerIdentityService)14 MessageBrokerService (org.openremote.container.message.MessageBrokerService)13 TimerService (org.openremote.container.timer.TimerService)13 Container (org.openremote.model.Container)13 RouteBuilder (org.apache.camel.builder.RouteBuilder)12 ContainerService (org.openremote.model.ContainerService)11 PersistenceEvent (org.openremote.model.PersistenceEvent)11 Attribute (org.openremote.model.attribute.Attribute)11 ScheduledExecutorService (java.util.concurrent.ScheduledExecutorService)10 ClientEventService (org.openremote.manager.event.ClientEventService)10 EntityManager (javax.persistence.EntityManager)9 Tenant (org.openremote.model.security.Tenant)9 Pair (org.openremote.model.util.Pair)9