You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@streampipes.apache.org by ri...@apache.org on 2026/06/18 16:46:50 UTC
(streampipes) branch introduce-storage-cache created (now b90aaf1888)
This is an automated email from the ASF dual-hosted git repository.
dominikriemer pushed a change to branch introduce-storage-cache
in repository https://gitbox.apache.org/repos/asf/streampipes.git
at b90aaf1888 Fix tests
This branch includes the following new commits:
new 742ccd31b6 refactor: Prepare chart storage for DI
new 07b2105a0c Add initial cache version, provide resource management from DI
new 8a0610629b Add permission cache
new b90aaf1888 Fix tests
The 4 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
(streampipes) 03/04: Add permission cache
Posted by ri...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
dominikriemer pushed a commit to branch introduce-storage-cache
in repository https://gitbox.apache.org/repos/asf/streampipes.git
commit 8a0610629b742d1e06f5e84c02b6b0e3d24c9f7d
Author: Dominik Riemer <do...@gmail.com>
AuthorDate: Thu Jun 18 17:30:26 2026 +0200
Add permission cache
---
.../dataexplorer/api/IDataExplorerManager.java | 4 +-
.../influx/DataExplorerManagerInflux.java | 6 +-
.../iotdb/DataExplorerManagerIotDb.java | 8 +-
.../loadbalance/unit/InvokeHttpRequest.java | 3 +-
.../AbstractPipelineElementResourceManager.java | 3 +-
.../management/AdapterResourceManager.java | 9 +-
.../resource/management/AssetResourceManager.java | 4 +-
.../resource/management/CrudResourceManager.java | 2 +-
.../management/DataLakeMeasureResourceManager.java | 4 +-
.../management/PermissionResourceManager.java | 5 -
.../resource/management/SpResourceManager.java | 6 +-
.../permission/SpPermissionEvaluator.java | 5 +-
.../management/AdapterResourceManagerTest.java | 2 +-
.../apache/streampipes/rest/ResetManagement.java | 2 +-
.../rest/impl/AdapterMonitoringResource.java | 2 +-
.../rest/impl/connect/AdapterResource.java | 2 +-
.../impl/datalake/AbstractDataLakeResource.java | 10 +-
.../impl/datalake/DataLakeMeasureResource.java | 2 +-
.../rest/impl/datalake/DataLakeResource.java | 6 +-
.../datalake/KioskDashboardDataLakeResource.java | 10 +-
.../datalake/importer/DataLakeImportResource.java | 6 +-
.../service/core/WebSecurityConfig.java | 11 +-
.../core/filter/TokenAuthenticationFilter.java | 9 +-
.../core/oauth2/CustomOAuth2UserService.java | 9 +-
.../service/core/oauth2/CustomOidcUserService.java | 8 +-
.../core/oauth2/OidcUserAccountDetails.java | 11 +-
.../service/core/oauth2/UserService.java | 33 +--
.../service/core/scheduler/DataLakeScheduler.java | 6 +-
.../core/storage/CachedPermissionStorage.java | 236 +++++++++++++++++++++
.../core/storage/StorageApiConfiguration.java | 7 +-
.../src/main/resources/application.properties | 2 +-
.../core/storage/CachedPermissionStorageTest.java | 122 +++++++++++
.../storage/api/core/INoSqlStorage.java | 3 -
.../storage/couchdb/CouchDbStorageManager.java | 7 -
.../management/model/PrincipalUserDetails.java | 6 +-
.../management/model/ServiceAccountDetails.java | 6 +-
.../user/management/model/UserAccountDetails.java | 6 +-
.../management/service/SpUserDetailsService.java | 11 +-
.../management/util/GrantedPermissionsBuilder.java | 12 +-
39 files changed, 504 insertions(+), 102 deletions(-)
diff --git a/streampipes-data-explorer-api/src/main/java/org/apache/streampipes/dataexplorer/api/IDataExplorerManager.java b/streampipes-data-explorer-api/src/main/java/org/apache/streampipes/dataexplorer/api/IDataExplorerManager.java
index 3de231ca5f..3f87b4b5f5 100644
--- a/streampipes-data-explorer-api/src/main/java/org/apache/streampipes/dataexplorer/api/IDataExplorerManager.java
+++ b/streampipes-data-explorer-api/src/main/java/org/apache/streampipes/dataexplorer/api/IDataExplorerManager.java
@@ -21,6 +21,7 @@ package org.apache.streampipes.dataexplorer.api;
import org.apache.streampipes.client.api.IStreamPipesClient;
import org.apache.streampipes.manager.pipeline.update.ChartSchemaUpdateCoordinator;
import org.apache.streampipes.model.datalake.DataLakeMeasure;
+import org.apache.streampipes.storage.api.user.IPermissionStorage;
import java.util.List;
@@ -42,7 +43,8 @@ public interface IDataExplorerManager {
IDataExplorerQueryManagement getQueryManagement(IDataExplorerSchemaManagement dataExplorerSchemaManagement);
- IDataExplorerSchemaManagement getSchemaManagement(ChartSchemaUpdateCoordinator chartSchemaUpdateCoordinator);
+ IDataExplorerSchemaManagement getSchemaManagement(ChartSchemaUpdateCoordinator chartSchemaUpdateCoordinator,
+ IPermissionStorage permissionStorage);
default ITimeSeriesStorage getTimeseriesStorage(DataLakeMeasure measure) {
return getTimeseriesStorage(measure, false);
diff --git a/streampipes-data-explorer-influx/src/main/java/org/apache/streampipes/dataexplorer/influx/DataExplorerManagerInflux.java b/streampipes-data-explorer-influx/src/main/java/org/apache/streampipes/dataexplorer/influx/DataExplorerManagerInflux.java
index 8d600847d5..181ecb5be5 100644
--- a/streampipes-data-explorer-influx/src/main/java/org/apache/streampipes/dataexplorer/influx/DataExplorerManagerInflux.java
+++ b/streampipes-data-explorer-influx/src/main/java/org/apache/streampipes/dataexplorer/influx/DataExplorerManagerInflux.java
@@ -32,6 +32,7 @@ import org.apache.streampipes.dataexplorer.influx.sanitize.DataLakeMeasurementSa
import org.apache.streampipes.manager.permission.DataLakePermissionManager;
import org.apache.streampipes.manager.pipeline.update.ChartSchemaUpdateCoordinator;
import org.apache.streampipes.model.datalake.DataLakeMeasure;
+import org.apache.streampipes.storage.api.user.IPermissionStorage;
import org.apache.streampipes.storage.management.StorageDispatcher;
import java.util.List;
@@ -57,12 +58,13 @@ public class DataExplorerManagerInflux implements IDataExplorerManager {
}
@Override
- public IDataExplorerSchemaManagement getSchemaManagement(ChartSchemaUpdateCoordinator chartSchemaUpdateCoordinator) {
+ public IDataExplorerSchemaManagement getSchemaManagement(ChartSchemaUpdateCoordinator chartSchemaUpdateCoordinator,
+ IPermissionStorage permissionStorage) {
return new DataExplorerSchemaManagement(StorageDispatcher.INSTANCE
.getNoSqlStore()
.getDataLakeStorage(),
new DataLakePermissionManager(
- StorageDispatcher.INSTANCE.getNoSqlStore().getPermissionStorage()
+ permissionStorage
),
chartSchemaUpdateCoordinator
);
diff --git a/streampipes-data-explorer-iotdb/src/main/java/org/apache/streampipes/dataexplorer/iotdb/DataExplorerManagerIotDb.java b/streampipes-data-explorer-iotdb/src/main/java/org/apache/streampipes/dataexplorer/iotdb/DataExplorerManagerIotDb.java
index 4db64664d7..a8c31313d9 100644
--- a/streampipes-data-explorer-iotdb/src/main/java/org/apache/streampipes/dataexplorer/iotdb/DataExplorerManagerIotDb.java
+++ b/streampipes-data-explorer-iotdb/src/main/java/org/apache/streampipes/dataexplorer/iotdb/DataExplorerManagerIotDb.java
@@ -31,6 +31,7 @@ import org.apache.streampipes.dataexplorer.iotdb.sanitize.DataLakeMeasurementSan
import org.apache.streampipes.manager.permission.DataLakePermissionManager;
import org.apache.streampipes.manager.pipeline.update.ChartSchemaUpdateCoordinator;
import org.apache.streampipes.model.datalake.DataLakeMeasure;
+import org.apache.streampipes.storage.api.user.IPermissionStorage;
import org.apache.streampipes.storage.management.StorageDispatcher;
import java.util.List;
@@ -53,13 +54,12 @@ public class DataExplorerManagerIotDb implements IDataExplorerManager {
}
@Override
- public IDataExplorerSchemaManagement getSchemaManagement(ChartSchemaUpdateCoordinator chartSchemaUpdateCoordinator) {
+ public IDataExplorerSchemaManagement getSchemaManagement(ChartSchemaUpdateCoordinator chartSchemaUpdateCoordinator,
+ IPermissionStorage permissionStorage) {
return new DataExplorerSchemaManagement(StorageDispatcher.INSTANCE
.getNoSqlStore()
.getDataLakeStorage(),
- new DataLakePermissionManager(
- StorageDispatcher.INSTANCE.getNoSqlStore().getPermissionStorage()
- ),
+ new DataLakePermissionManager(permissionStorage),
chartSchemaUpdateCoordinator
);
}
diff --git a/streampipes-load-balancer/src/main/java/org/apache/streampipes/loadbalance/unit/InvokeHttpRequest.java b/streampipes-load-balancer/src/main/java/org/apache/streampipes/loadbalance/unit/InvokeHttpRequest.java
index ba7d6026c9..0af6c20bcd 100644
--- a/streampipes-load-balancer/src/main/java/org/apache/streampipes/loadbalance/unit/InvokeHttpRequest.java
+++ b/streampipes-load-balancer/src/main/java/org/apache/streampipes/loadbalance/unit/InvokeHttpRequest.java
@@ -23,6 +23,7 @@ import org.apache.streampipes.model.client.user.Permission;
import org.apache.streampipes.model.client.user.Principal;
import org.apache.streampipes.model.pipeline.PipelineElementStatus;
import org.apache.streampipes.serializers.json.JacksonSerializer;
+import org.apache.streampipes.storage.couchdb.impl.user.PermissionStorageImpl;
import org.apache.streampipes.storage.management.StorageDispatcher;
import org.apache.streampipes.user.management.jwt.JwtTokenProvider;
@@ -121,7 +122,7 @@ public class InvokeHttpRequest{
}
private static String getOwnerSid(String resourceId) {
- return StorageDispatcher.INSTANCE.getNoSqlStore().getPermissionStorage().getUserPermissionsForObject(resourceId)
+ return new PermissionStorageImpl("users/permissions").getUserPermissionsForObject(resourceId)
.stream()
.findFirst()
.map(Permission::getOwnerSid)
diff --git a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/AbstractPipelineElementResourceManager.java b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/AbstractPipelineElementResourceManager.java
index 2e4ee34f18..4ca033cf56 100644
--- a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/AbstractPipelineElementResourceManager.java
+++ b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/AbstractPipelineElementResourceManager.java
@@ -78,8 +78,7 @@ public abstract class AbstractPipelineElementResourceManager<T extends CRUDStora
W existing = find(pipelineElement.getElementId());
if (existing == null) {
this.db.persist(pipelineElement);
- new PermissionResourceManager()
- .createDefault(pipelineElement.getElementId(), SpDataStream.class, principalSid, false);
+ permissionResourceManager.createDefault(pipelineElement.getElementId(), SpDataStream.class, principalSid, false);
} else {
throw new IllegalArgumentException("This pipeline element already exists");
}
diff --git a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/AdapterResourceManager.java b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/AdapterResourceManager.java
index f3ba00fc39..b4ff3cbed2 100644
--- a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/AdapterResourceManager.java
+++ b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/AdapterResourceManager.java
@@ -36,17 +36,18 @@ public class AdapterResourceManager extends AbstractResourceManager<IAdapterStor
private final SpPermissionEvaluator permissionEvaluator;
public AdapterResourceManager(IAdapterStorage adapterStorage,
- ICertificateStorage certificateStorage) {
+ ICertificateStorage certificateStorage,
+ PermissionResourceManager permissionResourceManager) {
super(adapterStorage);
this.certificateStorage = certificateStorage;
- this.permissionEvaluator = new SpPermissionEvaluator();
+ this.permissionEvaluator = new SpPermissionEvaluator(permissionResourceManager.getDb());
}
- public AdapterResourceManager() {
+ public AdapterResourceManager(PermissionResourceManager permissionResourceManager) {
super(StorageDispatcher.INSTANCE.getNoSqlStore()
.getAdapterInstanceStorage());
this.certificateStorage = StorageDispatcher.INSTANCE.getNoSqlStore().getCertificateStorage();
- this.permissionEvaluator = new SpPermissionEvaluator();
+ this.permissionEvaluator = new SpPermissionEvaluator(permissionResourceManager.getDb());
}
public ResourceSummaryDto<AdapterSummaryDto> getSummary(Authentication auth) {
diff --git a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/AssetResourceManager.java b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/AssetResourceManager.java
index b8aa3a0ba4..ecd02ee85f 100644
--- a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/AssetResourceManager.java
+++ b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/AssetResourceManager.java
@@ -31,9 +31,9 @@ public class AssetResourceManager extends AbstractResourceManager<IAssetStorage>
private final SpPermissionEvaluator permissionEvaluator;
- public AssetResourceManager() {
+ public AssetResourceManager(PermissionResourceManager permissionResourceManager) {
super(StorageDispatcher.INSTANCE.getNoSqlStore().getAssetStorage());
- this.permissionEvaluator = new SpPermissionEvaluator();
+ this.permissionEvaluator = new SpPermissionEvaluator(permissionResourceManager.getDb());
}
public ResourceSummaryDto<AssetSummaryDto> getSummary(Authentication auth) {
diff --git a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/CrudResourceManager.java b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/CrudResourceManager.java
index 8951bbb6ad..edb0586267 100644
--- a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/CrudResourceManager.java
+++ b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/CrudResourceManager.java
@@ -37,7 +37,7 @@ public class CrudResourceManager<T extends Storable>
PermissionResourceManager permissionResourceManager) {
super(db);
this.elementClass = elementClass;
- this.permissionEvaluator = new SpPermissionEvaluator();
+ this.permissionEvaluator = new SpPermissionEvaluator(permissionResourceManager.getDb());
this.permissionResourceManager = permissionResourceManager;
}
diff --git a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataLakeMeasureResourceManager.java b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataLakeMeasureResourceManager.java
index a80c7280e1..ee8892818f 100644
--- a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataLakeMeasureResourceManager.java
+++ b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataLakeMeasureResourceManager.java
@@ -46,10 +46,10 @@ public class DataLakeMeasureResourceManager extends AbstractResourceManager<IDat
private final IPipelineStorage pipelineStorage;
private final SpPermissionEvaluator permissionEvaluator;
- public DataLakeMeasureResourceManager() {
+ public DataLakeMeasureResourceManager(PermissionResourceManager permissionResourceManager) {
super(StorageDispatcher.INSTANCE.getNoSqlStore().getDataLakeStorage());
this.pipelineStorage = StorageDispatcher.INSTANCE.getNoSqlStore().getPipelineStorageAPI();
- this.permissionEvaluator = new SpPermissionEvaluator();
+ this.permissionEvaluator = new SpPermissionEvaluator(permissionResourceManager.getDb());
}
public ResourceSummaryDto<DatasetSummaryDto> getSummary(Authentication auth) {
diff --git a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/PermissionResourceManager.java b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/PermissionResourceManager.java
index b9b5751968..ea72f5b75c 100644
--- a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/PermissionResourceManager.java
+++ b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/PermissionResourceManager.java
@@ -21,7 +21,6 @@ import org.apache.streampipes.model.client.user.Permission;
import org.apache.streampipes.model.client.user.PermissionBuilder;
import org.apache.streampipes.model.dashboard.DashboardModel;
import org.apache.streampipes.storage.api.user.IPermissionStorage;
-import org.apache.streampipes.storage.management.StorageDispatcher;
import java.util.List;
@@ -31,10 +30,6 @@ public class PermissionResourceManager extends AbstractResourceManager<IPermissi
DashboardModel.class.getCanonicalName()
);
- public PermissionResourceManager() {
- super(StorageDispatcher.INSTANCE.getNoSqlStore().getPermissionStorage());
- }
-
public PermissionResourceManager(IPermissionStorage permissionStorage) {
super(permissionStorage);
}
diff --git a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/SpResourceManager.java b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/SpResourceManager.java
index 83107b42e1..11a9e08d96 100644
--- a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/SpResourceManager.java
+++ b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/SpResourceManager.java
@@ -49,15 +49,15 @@ public class SpResourceManager {
}
public AssetResourceManager manageAssets() {
- return new AssetResourceManager();
+ return new AssetResourceManager(managePermissions());
}
public AdapterResourceManager manageAdapters() {
- return new AdapterResourceManager();
+ return new AdapterResourceManager(managePermissions());
}
public DataLakeMeasureResourceManager manageDataLakeMeasures() {
- return new DataLakeMeasureResourceManager();
+ return new DataLakeMeasureResourceManager(managePermissions());
}
public PermissionResourceManager managePermissions() {
diff --git a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/permission/SpPermissionEvaluator.java b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/permission/SpPermissionEvaluator.java
index 0c208847c4..ce6f451c7d 100644
--- a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/permission/SpPermissionEvaluator.java
+++ b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/permission/SpPermissionEvaluator.java
@@ -22,7 +22,6 @@ import org.apache.streampipes.model.client.user.Permission;
import org.apache.streampipes.model.pipeline.PipelineElementRecommendation;
import org.apache.streampipes.model.pipeline.PipelineElementRecommendationMessage;
import org.apache.streampipes.storage.api.user.IPermissionStorage;
-import org.apache.streampipes.storage.management.StorageDispatcher;
import org.apache.streampipes.user.management.model.PrincipalUserDetails;
import org.springframework.security.access.PermissionEvaluator;
@@ -40,8 +39,8 @@ public class SpPermissionEvaluator implements PermissionEvaluator {
private final IPermissionStorage permissionStorage;
- public SpPermissionEvaluator() {
- this.permissionStorage = StorageDispatcher.INSTANCE.getNoSqlStore().getPermissionStorage();
+ public SpPermissionEvaluator(IPermissionStorage permissionStorage) {
+ this.permissionStorage = permissionStorage;
}
/**
diff --git a/streampipes-resource-management/src/test/java/org/apache/streampipes/resource/management/AdapterResourceManagerTest.java b/streampipes-resource-management/src/test/java/org/apache/streampipes/resource/management/AdapterResourceManagerTest.java
index 3e0175c738..ec63f239b9 100644
--- a/streampipes-resource-management/src/test/java/org/apache/streampipes/resource/management/AdapterResourceManagerTest.java
+++ b/streampipes-resource-management/src/test/java/org/apache/streampipes/resource/management/AdapterResourceManagerTest.java
@@ -43,7 +43,7 @@ public class AdapterResourceManagerTest {
@BeforeEach
void setUp() {
storage = mock(IAdapterStorage.class);
- adapterResourceManager = new AdapterResourceManager(storage, null);
+ adapterResourceManager = new AdapterResourceManager(storage, null, null);
}
@Test
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/ResetManagement.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/ResetManagement.java
index 9d3e764166..50065f2b22 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/ResetManagement.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/ResetManagement.java
@@ -158,7 +158,7 @@ public class ResetManagement {
private void removeAllDataInDataLake() {
var dataLakeMeasureManagement = new DataExplorerDispatcher()
.getDataExplorerManager()
- .getSchemaManagement(chartSchemaUpdateCoordinator);
+ .getSchemaManagement(chartSchemaUpdateCoordinator, resourceManager.managePermissions().getDb());
var dataExplorerQueryManagement = new DataExplorerDispatcher()
.getDataExplorerManager()
.getQueryManagement(dataLakeMeasureManagement);
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/AdapterMonitoringResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/AdapterMonitoringResource.java
index cb13ff6e73..4fa53dbe19 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/AdapterMonitoringResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/AdapterMonitoringResource.java
@@ -130,7 +130,7 @@ public class AdapterMonitoringResource extends AbstractMonitoringResource {
*/
private boolean checkAdapterPermission(AdapterDescription adapterDescription,
String permission) {
- var spPermissionEvaluator = new SpPermissionEvaluator();
+ var spPermissionEvaluator = new SpPermissionEvaluator(resourceManager.managePermissions().getDb());
var authentication = SecurityContextHolder.getContext()
.getAuthentication();
return spPermissionEvaluator.hasPermission(
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/connect/AdapterResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/connect/AdapterResource.java
index da43b782af..86eae06dca 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/connect/AdapterResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/connect/AdapterResource.java
@@ -218,7 +218,7 @@ public class AdapterResource extends AbstractAdapterResource<AdapterMasterManage
*/
private boolean checkAdapterPermission(AdapterDescription adapterDescription,
String permission) {
- var spPermissionEvaluator = new SpPermissionEvaluator();
+ var spPermissionEvaluator = new SpPermissionEvaluator(resourceManager.managePermissions().getDb());
var authentication = SecurityContextHolder.getContext()
.getAuthentication();
return spPermissionEvaluator.hasPermission(
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/AbstractDataLakeResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/AbstractDataLakeResource.java
index b24717c1bd..ef9dab09b2 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/AbstractDataLakeResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/AbstractDataLakeResource.java
@@ -21,6 +21,7 @@ import org.apache.streampipes.dataexplorer.api.IDataExplorerSchemaManagement;
import org.apache.streampipes.dataexplorer.management.DataExplorerDispatcher;
import org.apache.streampipes.manager.pipeline.update.ChartSchemaUpdateCoordinator;
import org.apache.streampipes.model.client.user.DefaultPrivilege;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.resource.management.permission.SpPermissionEvaluator;
import org.apache.streampipes.rest.core.base.impl.AbstractAuthGuardedRestResource;
import org.apache.streampipes.storage.api.explorer.IDataLakeMeasureStorage;
@@ -36,11 +37,14 @@ public class AbstractDataLakeResource extends AbstractAuthGuardedRestResource {
private final IDataLakeMeasureStorage dataLakeMeasureStorage =
StorageDispatcher.INSTANCE.getNoSqlStore().getDataLakeStorage();
protected final ChartSchemaUpdateCoordinator chartSchemaUpdateCoordinator;
+ private final SpResourceManager resourceManager;
- public AbstractDataLakeResource(ChartSchemaUpdateCoordinator chartSchemaUpdateCoordinator) {
+ public AbstractDataLakeResource(ChartSchemaUpdateCoordinator chartSchemaUpdateCoordinator,
+ SpResourceManager resourceManager) {
this.chartSchemaUpdateCoordinator = chartSchemaUpdateCoordinator;
+ this.resourceManager = resourceManager;
this.dataLakeMeasureManagement = new DataExplorerDispatcher().getDataExplorerManager()
- .getSchemaManagement(chartSchemaUpdateCoordinator);
+ .getSchemaManagement(chartSchemaUpdateCoordinator, resourceManager.managePermissions().getDb());
}
/**
@@ -72,7 +76,7 @@ public class AbstractDataLakeResource extends AbstractAuthGuardedRestResource {
var measure = dataLakeMeasureStorage.getByMeasureName(measurementName);
if (Objects.nonNull(measure)) {
- var spPermissionEvaluator = new SpPermissionEvaluator();
+ var spPermissionEvaluator = new SpPermissionEvaluator(resourceManager.managePermissions().getDb());
var authentication = SecurityContextHolder.getContext()
.getAuthentication();
return spPermissionEvaluator.hasPermission(
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeMeasureResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeMeasureResource.java
index bb6b2176c0..b490c591ae 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeMeasureResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeMeasureResource.java
@@ -55,7 +55,7 @@ public class DataLakeMeasureResource extends AbstractDataLakeResource {
public DataLakeMeasureResource(IDataExplorerWidgetStorage chartStorage,
SpResourceManager resourceManager) {
- super(new ChartSchemaUpdateCoordinator(chartStorage));
+ super(new ChartSchemaUpdateCoordinator(chartStorage), resourceManager);
this.resourceManager = resourceManager;
}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeResource.java
index 1d6dd96d83..d2db088eab 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeResource.java
@@ -31,6 +31,7 @@ import org.apache.streampipes.model.datalake.SpQueryResult;
import org.apache.streampipes.model.datalake.param.ProvidedRestQueryParams;
import org.apache.streampipes.model.message.Notifications;
import org.apache.streampipes.model.monitoring.SpLogMessage;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.rest.security.AuthConstants;
import org.apache.streampipes.rest.shared.exception.SpMessageException;
import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
@@ -97,8 +98,9 @@ public class DataLakeResource extends AbstractDataLakeResource {
private final IDataExplorerQueryManagement dataExplorerQueryManagement;
private final DataLakeExportManager dataLakeExportManager;
- public DataLakeResource(IDataExplorerWidgetStorage chartStorage) {
- super(new ChartSchemaUpdateCoordinator(chartStorage));
+ public DataLakeResource(IDataExplorerWidgetStorage chartStorage,
+ SpResourceManager resourceManager) {
+ super(new ChartSchemaUpdateCoordinator(chartStorage), resourceManager);
this.dataExplorerQueryManagement = new DataExplorerDispatcher()
.getDataExplorerManager()
.getQueryManagement(this.dataLakeMeasureManagement);
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/KioskDashboardDataLakeResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/KioskDashboardDataLakeResource.java
index 84305ad078..1c5b44daad 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/KioskDashboardDataLakeResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/KioskDashboardDataLakeResource.java
@@ -27,6 +27,7 @@ import org.apache.streampipes.model.datalake.DataExplorerWidgetModel;
import org.apache.streampipes.model.datalake.SpQueryResult;
import org.apache.streampipes.model.datalake.param.ProvidedRestQueryParams;
import org.apache.streampipes.model.monitoring.SpLogMessage;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.rest.core.base.impl.AbstractAuthGuardedRestResource;
import org.apache.streampipes.storage.api.explorer.IDataExplorerDashboardStorage;
import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
@@ -56,15 +57,18 @@ public class KioskDashboardDataLakeResource extends AbstractAuthGuardedRestResou
private final IPermissionStorage permissionStorage;
public KioskDashboardDataLakeResource(IDataExplorerWidgetStorage dataExplorerWidgetStorage,
- IPermissionStorage permissionStorage) {
+ SpResourceManager resourceManager) {
IDataExplorerSchemaManagement dataExplorerSchemaManagement = new DataExplorerDispatcher()
.getDataExplorerManager()
- .getSchemaManagement(new ChartSchemaUpdateCoordinator(dataExplorerWidgetStorage));
+ .getSchemaManagement(
+ new ChartSchemaUpdateCoordinator(dataExplorerWidgetStorage),
+ resourceManager.managePermissions().getDb()
+ );
this.dataExplorerQueryManagement = new DataExplorerDispatcher()
.getDataExplorerManager()
.getQueryManagement(dataExplorerSchemaManagement);
this.dataExplorerWidgetStorage = dataExplorerWidgetStorage;
- this.permissionStorage = permissionStorage;
+ this.permissionStorage = resourceManager.managePermissions().getDb();
}
@PostMapping(path = "/{dashboardId}/{widgetId}/data",
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/importer/DataLakeImportResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/importer/DataLakeImportResource.java
index 54a9840f3c..338e8e5762 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/importer/DataLakeImportResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/importer/DataLakeImportResource.java
@@ -26,6 +26,7 @@ import org.apache.streampipes.model.datalake.importer.CsvImportResult;
import org.apache.streampipes.model.datalake.importer.CsvImportSchemaValidationRequest;
import org.apache.streampipes.model.datalake.importer.CsvImportSchemaValidationResult;
import org.apache.streampipes.model.datalake.importer.CsvImportTargetMode;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.rest.impl.datalake.AbstractDataLakeResource;
import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
@@ -48,8 +49,9 @@ public class DataLakeImportResource extends AbstractDataLakeResource {
private final CsvDataLakeImportService importService;
- public DataLakeImportResource(IDataExplorerWidgetStorage chartStorage) {
- super(new ChartSchemaUpdateCoordinator(chartStorage));
+ public DataLakeImportResource(IDataExplorerWidgetStorage chartStorage,
+ SpResourceManager resourceManager) {
+ super(new ChartSchemaUpdateCoordinator(chartStorage), resourceManager);
this.importService = new CsvDataLakeImportService(getDataLakeMeasureManagement());
}
diff --git a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/WebSecurityConfig.java b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/WebSecurityConfig.java
index 229d03e167..eb25ed6f3c 100644
--- a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/WebSecurityConfig.java
+++ b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/WebSecurityConfig.java
@@ -30,6 +30,7 @@ import org.apache.streampipes.service.core.oauth2.OAuth2AccessTokenResponseConve
import org.apache.streampipes.service.core.oauth2.OAuth2AuthenticationFailureHandler;
import org.apache.streampipes.service.core.oauth2.OAuth2AuthenticationSuccessHandler;
import org.apache.streampipes.service.core.oauth2.OAuthEnabledCondition;
+import org.apache.streampipes.storage.api.user.IPermissionStorage;
import org.apache.streampipes.user.management.service.SpUserDetailsService;
import org.slf4j.Logger;
@@ -95,10 +96,14 @@ public class WebSecurityConfig {
@Autowired
private OAuth2AuthenticationFailureHandler oAuth2AuthenticationFailureHandler;
- public WebSecurityConfig(StreamPipesPasswordEncoder passwordEncoder) {
+ private final IPermissionStorage permissionStorage;
+
+ public WebSecurityConfig(StreamPipesPasswordEncoder passwordEncoder,
+ IPermissionStorage permissionStorage) {
this.passwordEncoder = passwordEncoder;
- this.userDetailsService = new SpUserDetailsService();
+ this.userDetailsService = new SpUserDetailsService(permissionStorage);
this.env = Environments.getEnvironment();
+ this.permissionStorage = permissionStorage;
}
@Autowired
@@ -153,7 +158,7 @@ public class WebSecurityConfig {
}
public TokenAuthenticationFilter tokenAuthenticationFilter() {
- return new TokenAuthenticationFilter();
+ return new TokenAuthenticationFilter(permissionStorage);
}
@Bean(BeanIds.USER_DETAILS_SERVICE)
diff --git a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/filter/TokenAuthenticationFilter.java b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/filter/TokenAuthenticationFilter.java
index 6a14bd320f..e91c87e940 100644
--- a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/filter/TokenAuthenticationFilter.java
+++ b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/filter/TokenAuthenticationFilter.java
@@ -23,6 +23,7 @@ import org.apache.streampipes.model.client.user.DefaultRole;
import org.apache.streampipes.model.client.user.Principal;
import org.apache.streampipes.model.client.user.ServiceAccount;
import org.apache.streampipes.model.client.user.UserAccount;
+import org.apache.streampipes.storage.api.user.IPermissionStorage;
import org.apache.streampipes.storage.api.user.IUserStorage;
import org.apache.streampipes.storage.management.StorageDispatcher;
import org.apache.streampipes.user.management.encryption.SecretEncryptionManager;
@@ -61,6 +62,7 @@ public class TokenAuthenticationFilter extends OncePerRequestFilter {
private final JwtTokenProvider tokenProvider;
private final IUserStorage userStorage;
+ private final IPermissionStorage permissionStorage;
private final List<String> supportedBasicAuthPaths = List.of(
"/actuator/prometheus"
@@ -70,9 +72,10 @@ public class TokenAuthenticationFilter extends OncePerRequestFilter {
private static final Logger logger = LoggerFactory.getLogger(TokenAuthenticationFilter.class);
- public TokenAuthenticationFilter() {
+ public TokenAuthenticationFilter(IPermissionStorage permissionStorage) {
this.tokenProvider = new JwtTokenProvider();
this.userStorage = StorageDispatcher.INSTANCE.getNoSqlStore().getUserStorageAPI();
+ this.permissionStorage = permissionStorage;
}
@Override
@@ -155,8 +158,8 @@ public class TokenAuthenticationFilter extends OncePerRequestFilter {
}
private PrincipalUserDetails<?> makeDetails(Principal user) {
- return user instanceof UserAccount ? new UserAccountDetails((UserAccount) user) :
- new ServiceAccountDetails((ServiceAccount) user);
+ return user instanceof UserAccount ? new UserAccountDetails((UserAccount) user, permissionStorage) :
+ new ServiceAccountDetails((ServiceAccount) user, permissionStorage);
}
private boolean isAdminUser(PrincipalUserDetails<?> userDetails) {
diff --git a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/oauth2/CustomOAuth2UserService.java b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/oauth2/CustomOAuth2UserService.java
index 7715d1c668..0177814cb9 100755
--- a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/oauth2/CustomOAuth2UserService.java
+++ b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/oauth2/CustomOAuth2UserService.java
@@ -19,6 +19,7 @@
package org.apache.streampipes.service.core.oauth2;
import org.apache.streampipes.rest.security.OAuth2AuthenticationProcessingException;
+import org.apache.streampipes.storage.api.user.IPermissionStorage;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService;
@@ -32,13 +33,19 @@ import java.util.HashMap;
@Service
public class CustomOAuth2UserService extends DefaultOAuth2UserService {
+ private final IPermissionStorage permissionStorage;
+
+ public CustomOAuth2UserService(IPermissionStorage permissionStorage) {
+ this.permissionStorage = permissionStorage;
+ }
+
@Override
public OAuth2User loadUser(OAuth2UserRequest oAuth2UserRequest) throws OAuth2AuthenticationException {
OAuth2User oAuth2User = super.loadUser(oAuth2UserRequest);
try {
var attributes = new HashMap<>(oAuth2User.getAttributes());
var provider = oAuth2UserRequest.getClientRegistration().getRegistrationId();
- return new UserService().processUserRegistration(provider, attributes);
+ return new UserService(permissionStorage).processUserRegistration(provider, attributes);
} catch (AuthenticationException e) {
throw e;
} catch (Exception e) {
diff --git a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/oauth2/CustomOidcUserService.java b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/oauth2/CustomOidcUserService.java
index 558fb870c3..eb9371402d 100755
--- a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/oauth2/CustomOidcUserService.java
+++ b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/oauth2/CustomOidcUserService.java
@@ -21,6 +21,7 @@ package org.apache.streampipes.service.core.oauth2;
import org.apache.streampipes.commons.environment.Environments;
import org.apache.streampipes.rest.security.OAuth2AuthenticationProcessingException;
+import org.apache.streampipes.storage.api.user.IPermissionStorage;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.oauth2.client.oidc.userinfo.OidcUserRequest;
@@ -34,7 +35,10 @@ import java.util.Objects;
@Service
public class CustomOidcUserService extends OidcUserService {
- public CustomOidcUserService() {
+ private final IPermissionStorage permissionStorage;
+
+ public CustomOidcUserService(IPermissionStorage permissionStorage) {
+ this.permissionStorage = permissionStorage;
var env = Environments.getEnvironment();
this.setRetrieveUserInfo(req -> {
var config = env.getOAuthConfigurations()
@@ -52,7 +56,7 @@ public class CustomOidcUserService extends OidcUserService {
OidcUser oidcUser = super.loadUser(userRequest);
try {
var provider = userRequest.getClientRegistration().getRegistrationId();
- return new UserService().processUserRegistration(
+ return new UserService(permissionStorage).processUserRegistration(
provider,
oidcUser.getAttributes(),
oidcUser.getIdToken(),
diff --git a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/oauth2/OidcUserAccountDetails.java b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/oauth2/OidcUserAccountDetails.java
index 48b3fd5c4f..671adbad20 100755
--- a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/oauth2/OidcUserAccountDetails.java
+++ b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/oauth2/OidcUserAccountDetails.java
@@ -19,6 +19,7 @@
package org.apache.streampipes.service.core.oauth2;
import org.apache.streampipes.model.client.user.UserAccount;
+import org.apache.streampipes.storage.api.user.IPermissionStorage;
import org.apache.streampipes.user.management.model.UserAccountDetails;
import org.springframework.security.oauth2.core.oidc.OidcIdToken;
@@ -36,8 +37,9 @@ public class OidcUserAccountDetails extends UserAccountDetails implements OAuth2
public OidcUserAccountDetails(UserAccount user,
OidcIdToken idToken,
- OidcUserInfo userInfo) {
- super(user);
+ OidcUserInfo userInfo,
+ IPermissionStorage permissionStorage) {
+ super(user, permissionStorage);
this.idToken = idToken;
this.userInfo = userInfo;
}
@@ -45,8 +47,9 @@ public class OidcUserAccountDetails extends UserAccountDetails implements OAuth2
public static OidcUserAccountDetails create(UserAccount user,
Map<String, Object> attributes,
OidcIdToken idToken,
- OidcUserInfo userInfo) {
- OidcUserAccountDetails localUser = new OidcUserAccountDetails(user, idToken, userInfo);
+ OidcUserInfo userInfo,
+ IPermissionStorage permissionStorage) {
+ OidcUserAccountDetails localUser = new OidcUserAccountDetails(user, idToken, userInfo, permissionStorage);
localUser.setAttributes(attributes);
return localUser;
}
diff --git a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/oauth2/UserService.java b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/oauth2/UserService.java
index bac55bb048..b2c2991134 100755
--- a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/oauth2/UserService.java
+++ b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/oauth2/UserService.java
@@ -21,14 +21,15 @@ package org.apache.streampipes.service.core.oauth2;
import org.apache.streampipes.commons.environment.Environment;
import org.apache.streampipes.commons.environment.Environments;
import org.apache.streampipes.commons.environment.model.OAuthConfiguration;
-import org.apache.streampipes.model.client.user.Group;
-import org.apache.streampipes.model.client.user.Role;
-import org.apache.streampipes.model.client.user.UserAccount;
-import org.apache.streampipes.resource.management.UserResourceManager;
-import org.apache.streampipes.rest.security.OAuth2AuthenticationProcessingException;
-import org.apache.streampipes.storage.api.user.IRoleStorage;
-import org.apache.streampipes.storage.api.user.IUserGroupStorage;
-import org.apache.streampipes.storage.api.user.IUserStorage;
+import org.apache.streampipes.model.client.user.Group;
+import org.apache.streampipes.model.client.user.Role;
+import org.apache.streampipes.model.client.user.UserAccount;
+import org.apache.streampipes.resource.management.UserResourceManager;
+import org.apache.streampipes.rest.security.OAuth2AuthenticationProcessingException;
+import org.apache.streampipes.storage.api.user.IPermissionStorage;
+import org.apache.streampipes.storage.api.user.IRoleStorage;
+import org.apache.streampipes.storage.api.user.IUserGroupStorage;
+import org.apache.streampipes.storage.api.user.IUserStorage;
import org.apache.streampipes.storage.management.StorageDispatcher;
import org.slf4j.Logger;
@@ -45,22 +46,24 @@ import java.util.stream.Collectors;
public class UserService {
- private static final Logger LOG = LoggerFactory.getLogger(UserService.class);
-
- private final IUserStorage userStorage;
- private final IRoleStorage roleStorage;
- private final IUserGroupStorage groupStorage;
+ private static final Logger LOG = LoggerFactory.getLogger(UserService.class);
+
+ private final IUserStorage userStorage;
+ private final IRoleStorage roleStorage;
+ private final IUserGroupStorage groupStorage;
private final Environment env;
private List<Role> allRoles;
private List<Group> allGroups;
+ private final IPermissionStorage permissionStorage;
- public UserService() {
+ public UserService(IPermissionStorage permissionStorage) {
this.userStorage = StorageDispatcher.INSTANCE.getNoSqlStore().getUserStorageAPI();
this.roleStorage = StorageDispatcher.INSTANCE.getNoSqlStore().getRoleStorage();
this.groupStorage = StorageDispatcher.INSTANCE.getNoSqlStore().getUserGroupStorage();
this.allGroups = this.groupStorage.findAll();
this.allRoles = this.roleStorage.findAll();
this.env = Environments.getEnvironment();
+ this.permissionStorage = permissionStorage;
}
public OidcUserAccountDetails processUserRegistration(String registrationId,
@@ -103,7 +106,7 @@ public class UserService {
}
user = (UserAccount) userStorage.getUserById(principalId);
- return OidcUserAccountDetails.create(user, attributes, idToken, userInfo);
+ return OidcUserAccountDetails.create(user, attributes, idToken, userInfo, permissionStorage);
} else {
throw new OAuth2AuthenticationProcessingException(
String.format("No config found for provider %s", registrationId)
diff --git a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/scheduler/DataLakeScheduler.java b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/scheduler/DataLakeScheduler.java
index 3c2522234d..04c45cd1fa 100644
--- a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/scheduler/DataLakeScheduler.java
+++ b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/scheduler/DataLakeScheduler.java
@@ -23,6 +23,7 @@ import org.apache.streampipes.dataexplorer.management.DataExplorerDispatcher;
import org.apache.streampipes.export.DataLakeExportManager;
import org.apache.streampipes.manager.pipeline.update.ChartSchemaUpdateCoordinator;
import org.apache.streampipes.model.datalake.DataLakeMeasure;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
import org.slf4j.Logger;
@@ -42,11 +43,12 @@ public class DataLakeScheduler implements SchedulingConfigurer {
private final IDataExplorerSchemaManagement dataExplorerSchemaManagement;
- public DataLakeScheduler(IDataExplorerWidgetStorage chartStorage) {
+ public DataLakeScheduler(IDataExplorerWidgetStorage chartStorage,
+ SpResourceManager resourceManager) {
var chartSchemaUpdateCoordinator = new ChartSchemaUpdateCoordinator(chartStorage);
dataExplorerSchemaManagement = new DataExplorerDispatcher()
.getDataExplorerManager()
- .getSchemaManagement(chartSchemaUpdateCoordinator);
+ .getSchemaManagement(chartSchemaUpdateCoordinator, resourceManager.managePermissions().getDb());
this.dataLakeExportManager = new DataLakeExportManager(
dataExplorerSchemaManagement,
new DataExplorerDispatcher().getDataExplorerManager()
diff --git a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/storage/CachedPermissionStorage.java b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/storage/CachedPermissionStorage.java
new file mode 100644
index 0000000000..3076842bf2
--- /dev/null
+++ b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/storage/CachedPermissionStorage.java
@@ -0,0 +1,236 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.streampipes.service.core.storage;
+
+import org.apache.streampipes.model.Tuple2;
+import org.apache.streampipes.model.client.user.Permission;
+import org.apache.streampipes.serializers.json.JacksonSerializer;
+import org.apache.streampipes.storage.api.user.IPermissionStorage;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.cache.Cache;
+import org.springframework.cache.CacheManager;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+
+public class CachedPermissionStorage implements IPermissionStorage {
+
+ static final String CACHE_NAME = "permissions";
+ static final String FIND_ALL_CACHE_NAME = "permissionsAll";
+ static final String BY_OBJECT_CACHE_NAME = "permissionsByObject";
+ static final String BY_PRINCIPALS_CACHE_NAME = "objectPermissionsByPrincipals";
+
+ private static final Logger LOG = LoggerFactory.getLogger(CachedPermissionStorage.class);
+ private static final String FIND_ALL_CACHE_KEY = "all";
+ private static final TypeReference<List<Permission>> PERMISSION_LIST_TYPE = new TypeReference<>() {
+ };
+ private static final TypeReference<Set<String>> OBJECT_PERMISSION_SET_TYPE = new TypeReference<>() {
+ };
+
+ private final IPermissionStorage delegate;
+ private final Cache cache;
+ private final Cache findAllCache;
+ private final Cache byObjectCache;
+ private final Cache byPrincipalsCache;
+ private final ObjectMapper objectMapper;
+
+ public CachedPermissionStorage(IPermissionStorage delegate,
+ CacheManager cacheManager) {
+ this(delegate, cacheManager, JacksonSerializer.getObjectMapper());
+ }
+
+ CachedPermissionStorage(IPermissionStorage delegate,
+ CacheManager cacheManager,
+ ObjectMapper objectMapper) {
+ this.delegate = delegate;
+ this.cache = getCache(cacheManager, CACHE_NAME);
+ this.findAllCache = getCache(cacheManager, FIND_ALL_CACHE_NAME);
+ this.byObjectCache = getCache(cacheManager, BY_OBJECT_CACHE_NAME);
+ this.byPrincipalsCache = getCache(cacheManager, BY_PRINCIPALS_CACHE_NAME);
+ this.objectMapper = objectMapper;
+ }
+
+ @Override
+ public List<Permission> findAll() {
+ var cachedPermissions = getPermissionList(findAllCache, FIND_ALL_CACHE_KEY);
+ if (cachedPermissions != null) {
+ return cachedPermissions;
+ }
+
+ var permissions = delegate.findAll();
+ put(findAllCache, FIND_ALL_CACHE_KEY, permissions);
+ return permissions;
+ }
+
+ @Override
+ public Tuple2<Boolean, String> persist(Permission element) {
+ var result = delegate.persist(element);
+ if (Boolean.TRUE.equals(result.k)) {
+ clearCaches();
+ }
+ return result;
+ }
+
+ @Override
+ public Permission getElementById(String id) {
+ var cachedPermission = getPermission(id);
+ if (cachedPermission != null) {
+ return cachedPermission;
+ }
+
+ var permission = delegate.getElementById(id);
+ if (permission != null) {
+ put(cache, id, permission);
+ }
+ return permission;
+ }
+
+ @Override
+ public Permission updateElement(Permission element) {
+ var updatedElement = delegate.updateElement(element);
+ clearCaches();
+ return updatedElement;
+ }
+
+ @Override
+ public void deleteElement(Permission element) {
+ delegate.deleteElement(element);
+ clearCaches();
+ }
+
+ @Override
+ public void deleteElementById(String id) {
+ delegate.deleteElementById(id);
+ clearCaches();
+ }
+
+ @Override
+ public Set<String> getObjectPermissions(List<String> sids) {
+ var cacheKey = makePrincipalCacheKey(sids);
+ var cachedPermissions = getObjectPermissionSet(cacheKey);
+ if (cachedPermissions != null) {
+ return cachedPermissions;
+ }
+
+ var permissions = delegate.getObjectPermissions(sids);
+ put(byPrincipalsCache, cacheKey, permissions);
+ return permissions;
+ }
+
+ @Override
+ public List<Permission> getUserPermissionsForObject(String objectInstanceId) {
+ var cachedPermissions = getPermissionList(byObjectCache, objectInstanceId);
+ if (cachedPermissions != null) {
+ return cachedPermissions;
+ }
+
+ var permissions = delegate.getUserPermissionsForObject(objectInstanceId);
+ put(byObjectCache, objectInstanceId, permissions);
+ return permissions;
+ }
+
+ private Permission getPermission(String id) {
+ try {
+ var cachedValue = cache.get(id, String.class);
+ return cachedValue == null ? null : objectMapper.readValue(cachedValue, Permission.class);
+ } catch (JsonProcessingException | RuntimeException e) {
+ LOG.warn("Could not read permission {} from cache", id, e);
+ evict(cache, id);
+ return null;
+ }
+ }
+
+ private List<Permission> getPermissionList(Cache targetCache,
+ String key) {
+ try {
+ var cachedValue = targetCache.get(key, String.class);
+ return cachedValue == null ? null : objectMapper.readValue(cachedValue, PERMISSION_LIST_TYPE);
+ } catch (JsonProcessingException | RuntimeException e) {
+ LOG.warn("Could not read permissions from cache {}", targetCache.getName(), e);
+ evict(targetCache, key);
+ return null;
+ }
+ }
+
+ private Set<String> getObjectPermissionSet(String key) {
+ try {
+ var cachedValue = byPrincipalsCache.get(key, String.class);
+ return cachedValue == null ? null : objectMapper.readValue(cachedValue, OBJECT_PERMISSION_SET_TYPE);
+ } catch (JsonProcessingException | RuntimeException e) {
+ LOG.warn("Could not read object permissions from cache", e);
+ evict(byPrincipalsCache, key);
+ return null;
+ }
+ }
+
+ private String makePrincipalCacheKey(List<String> sids) {
+ var sortedSids = new ArrayList<>(sids);
+ sortedSids.sort(String::compareTo);
+ try {
+ return objectMapper.writeValueAsString(sortedSids);
+ } catch (JsonProcessingException e) {
+ throw new IllegalStateException("Could not create permission cache key", e);
+ }
+ }
+
+ private void put(Cache targetCache,
+ String key,
+ Object value) {
+ try {
+ targetCache.put(key, objectMapper.writeValueAsString(value));
+ } catch (JsonProcessingException | RuntimeException e) {
+ LOG.warn("Could not write permissions to cache {}", targetCache.getName(), e);
+ }
+ }
+
+ private void clearCaches() {
+ clear(cache);
+ clear(findAllCache);
+ clear(byObjectCache);
+ clear(byPrincipalsCache);
+ }
+
+ private void clear(Cache targetCache) {
+ try {
+ targetCache.clear();
+ } catch (RuntimeException e) {
+ LOG.warn("Could not clear permission cache {}", targetCache.getName(), e);
+ }
+ }
+
+ private void evict(Cache targetCache,
+ String key) {
+ try {
+ targetCache.evict(key);
+ } catch (RuntimeException e) {
+ LOG.warn("Could not evict permission cache entry from {}", targetCache.getName(), e);
+ }
+ }
+
+ private static Cache getCache(CacheManager cacheManager,
+ String cacheName) {
+ return Objects.requireNonNull(cacheManager.getCache(cacheName));
+ }
+}
diff --git a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/storage/StorageApiConfiguration.java b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/storage/StorageApiConfiguration.java
index cdfcffeada..002d6fcfae 100644
--- a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/storage/StorageApiConfiguration.java
+++ b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/storage/StorageApiConfiguration.java
@@ -48,7 +48,10 @@ public class StorageApiConfiguration {
}
@Bean
- public IPermissionStorage permissionStorage() {
- return new PermissionStorageImpl("users/permissions");
+ public IPermissionStorage permissionStorage(CacheManager cacheManager) {
+ return new CachedPermissionStorage(
+ new PermissionStorageImpl("users/permissions"),
+ cacheManager
+ );
}
}
diff --git a/streampipes-service-core/src/main/resources/application.properties b/streampipes-service-core/src/main/resources/application.properties
index ece15145a6..f48263acff 100644
--- a/streampipes-service-core/src/main/resources/application.properties
+++ b/streampipes-service-core/src/main/resources/application.properties
@@ -22,7 +22,7 @@ spring.servlet.multipart.max-request-size=5120MB
server.tomcat.additional-tld-skip-patterns=*.jar
spring.mvc.async.request-timeout=900000
spring.cache.type=caffeine
-spring.cache.cache-names=dataExplorerWidgets,dataExplorerWidgetsAll
+spring.cache.cache-names=dataExplorerWidgets,dataExplorerWidgetsAll,permissions,permissionsAll,permissionsByObject,objectPermissionsByPrincipals
spring.cache.caffeine.spec=maximumSize=10000,expireAfterWrite=10m
logging.config=classpath:logback.xml
spring.output.ansi.enabled=always
diff --git a/streampipes-service-core/src/test/java/org/apache/streampipes/service/core/storage/CachedPermissionStorageTest.java b/streampipes-service-core/src/test/java/org/apache/streampipes/service/core/storage/CachedPermissionStorageTest.java
new file mode 100644
index 0000000000..b276a9149e
--- /dev/null
+++ b/streampipes-service-core/src/test/java/org/apache/streampipes/service/core/storage/CachedPermissionStorageTest.java
@@ -0,0 +1,122 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.streampipes.service.core.storage;
+
+import org.apache.streampipes.model.client.user.Permission;
+import org.apache.streampipes.storage.api.user.IPermissionStorage;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.cache.concurrent.ConcurrentMapCacheManager;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotSame;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+class CachedPermissionStorageTest {
+
+ private static final String PERMISSION_ID = "permission-id";
+ private static final String OBJECT_ID = "object-id";
+
+ private IPermissionStorage delegate;
+ private CachedPermissionStorage storage;
+
+ @BeforeEach
+ void setUp() {
+ delegate = mock(IPermissionStorage.class);
+ var cacheManager = new ConcurrentMapCacheManager(
+ CachedPermissionStorage.CACHE_NAME,
+ CachedPermissionStorage.FIND_ALL_CACHE_NAME,
+ CachedPermissionStorage.BY_OBJECT_CACHE_NAME,
+ CachedPermissionStorage.BY_PRINCIPALS_CACHE_NAME
+ );
+ storage = new CachedPermissionStorage(delegate, cacheManager);
+ }
+
+ @Test
+ void getUserPermissionsForObjectCachesSerializedCopies() {
+ var permission = makePermission("owner");
+ when(delegate.getUserPermissionsForObject(OBJECT_ID)).thenReturn(List.of(permission));
+
+ var firstResult = storage.getUserPermissionsForObject(OBJECT_ID);
+ firstResult.get(0).setOwnerSid("changed-owner");
+ var secondResult = storage.getUserPermissionsForObject(OBJECT_ID);
+
+ assertNotSame(firstResult, secondResult);
+ assertNotSame(firstResult.get(0), secondResult.get(0));
+ assertEquals("owner", secondResult.get(0).getOwnerSid());
+ verify(delegate, times(1)).getUserPermissionsForObject(OBJECT_ID);
+ }
+
+ @Test
+ void getObjectPermissionsUsesOrderIndependentPrincipalKey() {
+ var firstOrder = new ArrayList<>(List.of("user", "group"));
+ var secondOrder = new ArrayList<>(List.of("group", "user"));
+ when(delegate.getObjectPermissions(firstOrder)).thenReturn(Set.of(OBJECT_ID));
+
+ var firstResult = storage.getObjectPermissions(firstOrder);
+ var secondResult = storage.getObjectPermissions(secondOrder);
+
+ assertEquals(Set.of(OBJECT_ID), firstResult);
+ assertEquals(Set.of(OBJECT_ID), secondResult);
+ verify(delegate, times(1)).getObjectPermissions(firstOrder);
+ }
+
+ @Test
+ void updateElementClearsAllQueryCaches() {
+ var permission = makePermission("owner");
+ var updatedPermission = makePermission("updated-owner");
+ var sids = List.of("user");
+ when(delegate.getElementById(PERMISSION_ID)).thenReturn(permission, updatedPermission);
+ when(delegate.findAll()).thenReturn(List.of(permission), List.of(updatedPermission));
+ when(delegate.getUserPermissionsForObject(OBJECT_ID))
+ .thenReturn(List.of(permission), List.of(updatedPermission));
+ when(delegate.getObjectPermissions(sids)).thenReturn(Set.of("old-object"), Set.of("new-object"));
+ when(delegate.updateElement(updatedPermission)).thenReturn(updatedPermission);
+
+ storage.getElementById(PERMISSION_ID);
+ storage.findAll();
+ storage.getUserPermissionsForObject(OBJECT_ID);
+ storage.getObjectPermissions(sids);
+ storage.updateElement(updatedPermission);
+
+ assertEquals("updated-owner", storage.getElementById(PERMISSION_ID).getOwnerSid());
+ assertEquals("updated-owner", storage.findAll().get(0).getOwnerSid());
+ assertEquals("updated-owner", storage.getUserPermissionsForObject(OBJECT_ID).get(0).getOwnerSid());
+ assertEquals(Set.of("new-object"), storage.getObjectPermissions(sids));
+ verify(delegate, times(2)).getElementById(PERMISSION_ID);
+ verify(delegate, times(2)).findAll();
+ verify(delegate, times(2)).getUserPermissionsForObject(OBJECT_ID);
+ verify(delegate, times(2)).getObjectPermissions(sids);
+ }
+
+ private Permission makePermission(String ownerSid) {
+ var permission = new Permission();
+ permission.setPermissionId(PERMISSION_ID);
+ permission.setObjectInstanceId(OBJECT_ID);
+ permission.setOwnerSid(ownerSid);
+ return permission;
+ }
+}
diff --git a/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/core/INoSqlStorage.java b/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/core/INoSqlStorage.java
index de4ef4b597..c5891d7d85 100644
--- a/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/core/INoSqlStorage.java
+++ b/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/core/INoSqlStorage.java
@@ -38,7 +38,6 @@ import org.apache.streampipes.storage.api.system.IImageStorage;
import org.apache.streampipes.storage.api.system.ISpCoreConfigurationStorage;
import org.apache.streampipes.storage.api.system.ITransformationScriptTemplateStorage;
import org.apache.streampipes.storage.api.user.IPasswordRecoveryTokenStorage;
-import org.apache.streampipes.storage.api.user.IPermissionStorage;
import org.apache.streampipes.storage.api.user.IPrivilegeStorage;
import org.apache.streampipes.storage.api.user.IRefreshTokenStorage;
import org.apache.streampipes.storage.api.user.IRoleStorage;
@@ -74,8 +73,6 @@ public interface INoSqlStorage {
IPipelineElementDescriptionStorage getPipelineElementDescriptionStorage();
- IPermissionStorage getPermissionStorage();
-
IDataProcessorStorage getDataProcessorStorage();
IDataSinkStorage getDataSinkStorage();
diff --git a/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/CouchDbStorageManager.java b/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/CouchDbStorageManager.java
index 577b82b51f..e4fb7b29b4 100644
--- a/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/CouchDbStorageManager.java
+++ b/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/CouchDbStorageManager.java
@@ -40,7 +40,6 @@ import org.apache.streampipes.storage.api.system.IImageStorage;
import org.apache.streampipes.storage.api.system.ISpCoreConfigurationStorage;
import org.apache.streampipes.storage.api.system.ITransformationScriptTemplateStorage;
import org.apache.streampipes.storage.api.user.IPasswordRecoveryTokenStorage;
-import org.apache.streampipes.storage.api.user.IPermissionStorage;
import org.apache.streampipes.storage.api.user.IPrivilegeStorage;
import org.apache.streampipes.storage.api.user.IRefreshTokenStorage;
import org.apache.streampipes.storage.api.user.IRoleStorage;
@@ -69,7 +68,6 @@ import org.apache.streampipes.storage.couchdb.impl.system.GenericStorageImpl;
import org.apache.streampipes.storage.couchdb.impl.system.ImageStorageImpl;
import org.apache.streampipes.storage.couchdb.impl.system.TransformationScriptTemplateStorageImpl;
import org.apache.streampipes.storage.couchdb.impl.user.PasswordRecoveryTokenStorageImpl;
-import org.apache.streampipes.storage.couchdb.impl.user.PermissionStorageImpl;
import org.apache.streampipes.storage.couchdb.impl.user.PrivilegeStorageImpl;
import org.apache.streampipes.storage.couchdb.impl.user.RefreshTokenStorageImpl;
import org.apache.streampipes.storage.couchdb.impl.user.RoleStorageImpl;
@@ -148,11 +146,6 @@ public class CouchDbStorageManager implements INoSqlStorage {
return new PipelineElementDescriptionStorageImpl();
}
- @Override
- public IPermissionStorage getPermissionStorage() {
- return new PermissionStorageImpl("users/permissions");
- }
-
@Override
public IDataProcessorStorage getDataProcessorStorage() {
return new DataProcessorStorageImpl();
diff --git a/streampipes-user-management/src/main/java/org/apache/streampipes/user/management/model/PrincipalUserDetails.java b/streampipes-user-management/src/main/java/org/apache/streampipes/user/management/model/PrincipalUserDetails.java
index a9c943822d..7a029b2161 100644
--- a/streampipes-user-management/src/main/java/org/apache/streampipes/user/management/model/PrincipalUserDetails.java
+++ b/streampipes-user-management/src/main/java/org/apache/streampipes/user/management/model/PrincipalUserDetails.java
@@ -18,6 +18,7 @@
package org.apache.streampipes.user.management.model;
import org.apache.streampipes.model.client.user.Principal;
+import org.apache.streampipes.storage.api.user.IPermissionStorage;
import org.apache.streampipes.user.management.util.GrantedAuthoritiesBuilder;
import org.apache.streampipes.user.management.util.GrantedPermissionsBuilder;
@@ -35,10 +36,11 @@ public abstract class PrincipalUserDetails<T extends Principal> implements UserD
private Set<String> allAuthorities;
private Set<String> allObjectPermissions;
- public PrincipalUserDetails(T details) {
+ public PrincipalUserDetails(T details,
+ IPermissionStorage permissionStorage) {
this.details = details;
this.allAuthorities = new GrantedAuthoritiesBuilder(details).buildAllAuthorities();
- this.allObjectPermissions = new GrantedPermissionsBuilder(details).buildAllPermissions();
+ this.allObjectPermissions = new GrantedPermissionsBuilder(details, permissionStorage).buildAllPermissions();
}
public T getDetails() {
diff --git a/streampipes-user-management/src/main/java/org/apache/streampipes/user/management/model/ServiceAccountDetails.java b/streampipes-user-management/src/main/java/org/apache/streampipes/user/management/model/ServiceAccountDetails.java
index fee4703089..a5ae3758a2 100644
--- a/streampipes-user-management/src/main/java/org/apache/streampipes/user/management/model/ServiceAccountDetails.java
+++ b/streampipes-user-management/src/main/java/org/apache/streampipes/user/management/model/ServiceAccountDetails.java
@@ -18,12 +18,14 @@
package org.apache.streampipes.user.management.model;
import org.apache.streampipes.model.client.user.ServiceAccount;
+import org.apache.streampipes.storage.api.user.IPermissionStorage;
public class ServiceAccountDetails extends PrincipalUserDetails<ServiceAccount> {
- public ServiceAccountDetails(ServiceAccount details) {
- super(details);
+ public ServiceAccountDetails(ServiceAccount details,
+ IPermissionStorage permissionStorage) {
+ super(details, permissionStorage);
}
@Override
diff --git a/streampipes-user-management/src/main/java/org/apache/streampipes/user/management/model/UserAccountDetails.java b/streampipes-user-management/src/main/java/org/apache/streampipes/user/management/model/UserAccountDetails.java
index da2405066e..08f4452098 100644
--- a/streampipes-user-management/src/main/java/org/apache/streampipes/user/management/model/UserAccountDetails.java
+++ b/streampipes-user-management/src/main/java/org/apache/streampipes/user/management/model/UserAccountDetails.java
@@ -18,11 +18,13 @@
package org.apache.streampipes.user.management.model;
import org.apache.streampipes.model.client.user.UserAccount;
+import org.apache.streampipes.storage.api.user.IPermissionStorage;
public class UserAccountDetails extends PrincipalUserDetails<UserAccount> {
- public UserAccountDetails(UserAccount details) {
- super(details);
+ public UserAccountDetails(UserAccount details,
+ IPermissionStorage permissionStorage) {
+ super(details, permissionStorage);
}
@Override
diff --git a/streampipes-user-management/src/main/java/org/apache/streampipes/user/management/service/SpUserDetailsService.java b/streampipes-user-management/src/main/java/org/apache/streampipes/user/management/service/SpUserDetailsService.java
index a113185810..5fd1bb74fb 100644
--- a/streampipes-user-management/src/main/java/org/apache/streampipes/user/management/service/SpUserDetailsService.java
+++ b/streampipes-user-management/src/main/java/org/apache/streampipes/user/management/service/SpUserDetailsService.java
@@ -20,6 +20,7 @@ package org.apache.streampipes.user.management.service;
import org.apache.streampipes.model.client.user.Principal;
import org.apache.streampipes.model.client.user.ServiceAccount;
import org.apache.streampipes.model.client.user.UserAccount;
+import org.apache.streampipes.storage.api.user.IPermissionStorage;
import org.apache.streampipes.storage.management.StorageDispatcher;
import org.apache.streampipes.user.management.model.ServiceAccountDetails;
import org.apache.streampipes.user.management.model.UserAccountDetails;
@@ -30,10 +31,16 @@ import org.springframework.security.core.userdetails.UsernameNotFoundException;
public class SpUserDetailsService implements UserDetailsService {
+ private final IPermissionStorage permissionStorage;
+
+ public SpUserDetailsService(IPermissionStorage permissionStorage) {
+ this.permissionStorage = permissionStorage;
+ }
+
@Override
public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
Principal user = StorageDispatcher.INSTANCE.getNoSqlStore().getUserStorageAPI().getUser(s);
- return user instanceof UserAccount ? new UserAccountDetails((UserAccount) user) :
- new ServiceAccountDetails((ServiceAccount) user);
+ return user instanceof UserAccount ? new UserAccountDetails((UserAccount) user, permissionStorage) :
+ new ServiceAccountDetails((ServiceAccount) user, permissionStorage);
}
}
diff --git a/streampipes-user-management/src/main/java/org/apache/streampipes/user/management/util/GrantedPermissionsBuilder.java b/streampipes-user-management/src/main/java/org/apache/streampipes/user/management/util/GrantedPermissionsBuilder.java
index 1674849767..90db32e7dd 100644
--- a/streampipes-user-management/src/main/java/org/apache/streampipes/user/management/util/GrantedPermissionsBuilder.java
+++ b/streampipes-user-management/src/main/java/org/apache/streampipes/user/management/util/GrantedPermissionsBuilder.java
@@ -18,7 +18,7 @@
package org.apache.streampipes.user.management.util;
import org.apache.streampipes.model.client.user.Principal;
-import org.apache.streampipes.storage.management.StorageDispatcher;
+import org.apache.streampipes.storage.api.user.IPermissionStorage;
import java.util.ArrayList;
import java.util.Set;
@@ -26,18 +26,18 @@ import java.util.Set;
public class GrantedPermissionsBuilder {
private final Principal principal;
+ private final IPermissionStorage permissionStorage;
- public GrantedPermissionsBuilder(Principal principal) {
+ public GrantedPermissionsBuilder(Principal principal,
+ IPermissionStorage permissionStorage) {
this.principal = principal;
+ this.permissionStorage = permissionStorage;
}
public Set<String> buildAllPermissions() {
Set<String> sids = extractSids();
- return StorageDispatcher
- .INSTANCE
- .getNoSqlStore()
- .getPermissionStorage()
+ return permissionStorage
.getObjectPermissions(new ArrayList<>(sids));
}
(streampipes) 04/04: Fix tests
Posted by ri...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
dominikriemer pushed a commit to branch introduce-storage-cache
in repository https://gitbox.apache.org/repos/asf/streampipes.git
commit b90aaf1888895d53a852c8820cc8c0f21bba0b10
Author: Dominik Riemer <do...@gmail.com>
AuthorDate: Thu Jun 18 18:46:30 2026 +0200
Fix tests
---
.../sinks/internal/jvm/datalake/DataLakeSink.java | 20 +++--
.../update/PipelineUpdateCoordinatorTest.java | 87 +++++++++-------------
.../management/AdapterResourceManagerTest.java | 3 +-
.../apache/streampipes/rest/ResetManagement.java | 4 +-
4 files changed, 50 insertions(+), 64 deletions(-)
diff --git a/streampipes-extensions/streampipes-sinks-internal-jvm/src/main/java/org/apache/streampipes/sinks/internal/jvm/datalake/DataLakeSink.java b/streampipes-extensions/streampipes-sinks-internal-jvm/src/main/java/org/apache/streampipes/sinks/internal/jvm/datalake/DataLakeSink.java
index f0e1812556..1fc1fe3c23 100644
--- a/streampipes-extensions/streampipes-sinks-internal-jvm/src/main/java/org/apache/streampipes/sinks/internal/jvm/datalake/DataLakeSink.java
+++ b/streampipes-extensions/streampipes-sinks-internal-jvm/src/main/java/org/apache/streampipes/sinks/internal/jvm/datalake/DataLakeSink.java
@@ -22,7 +22,6 @@ import org.apache.streampipes.client.api.IStreamPipesClient;
import org.apache.streampipes.commons.environment.Environments;
import org.apache.streampipes.commons.exceptions.SpRuntimeException;
import org.apache.streampipes.dataexplorer.TimeSeriesStore;
-import org.apache.streampipes.dataexplorer.api.IDataExplorerSchemaManagement;
import org.apache.streampipes.dataexplorer.management.DataExplorerDispatcher;
import org.apache.streampipes.extensions.api.extractor.IStaticPropertyExtractor;
import org.apache.streampipes.extensions.api.pe.IStreamPipesDataSink;
@@ -166,18 +165,17 @@ public class DataLakeSink implements IStreamPipesDataSink, SupportsRuntimeConfig
private RetentionTimeConfig getRetentionTime(String measureName, IStreamPipesClient client){
- // TODO
- IDataExplorerSchemaManagement dataExplorerSchemaManagement = new DataExplorerDispatcher().getDataExplorerManager()
- .getSchemaManagement(null);
+ try {
+ var originalMeasure = client.dataLakeMeasureApi().getByDatasetName(measureName);
+ RetentionTimeConfig retentionTime = null;
- var originalMeasure = dataExplorerSchemaManagement.getExistingMeasureByName(measureName);
-
- RetentionTimeConfig retentionTime = null;
-
- if (originalMeasure.isPresent()){
- retentionTime = originalMeasure.get().getRetentionTime();
+ if (originalMeasure.isPresent()) {
+ retentionTime = originalMeasure.get().getRetentionTime();
+ }
+ return retentionTime;
+ } catch (Exception e) {
+ return null;
}
- return retentionTime;
}
/**
diff --git a/streampipes-pipeline-management/src/test/java/org/apache/streampipes/manager/pipeline/update/PipelineUpdateCoordinatorTest.java b/streampipes-pipeline-management/src/test/java/org/apache/streampipes/manager/pipeline/update/PipelineUpdateCoordinatorTest.java
index 22ac557411..3b7440ac5b 100644
--- a/streampipes-pipeline-management/src/test/java/org/apache/streampipes/manager/pipeline/update/PipelineUpdateCoordinatorTest.java
+++ b/streampipes-pipeline-management/src/test/java/org/apache/streampipes/manager/pipeline/update/PipelineUpdateCoordinatorTest.java
@@ -39,7 +39,6 @@ import org.apache.streampipes.model.schema.EventPropertyPrimitive;
import org.apache.streampipes.model.schema.EventSchema;
import org.apache.streampipes.model.schema.PropertyScope;
import org.apache.streampipes.resource.management.SpResourceManager;
-import org.apache.streampipes.storage.api.core.INoSqlStorage;
import org.apache.streampipes.storage.api.pipeline.IPipelineStorage;
import org.apache.streampipes.storage.couchdb.CouchDbStorageManager;
import org.apache.streampipes.vocabulary.XSD;
@@ -47,7 +46,6 @@ import org.apache.streampipes.vocabulary.XSD;
import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.MockedConstruction;
-import org.mockito.MockedStatic;
import java.net.URI;
import java.util.ArrayList;
@@ -59,7 +57,6 @@ import static org.junit.jupiter.api.Assertions.assertSame;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.mockConstruction;
-import static org.mockito.Mockito.mockStatic;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.when;
@@ -82,13 +79,12 @@ class PipelineUpdateCoordinatorTest {
var modifiedPipeline = makePipeline("pipeline-1", "Pipeline", true, "stream-1", "Updated stream");
var modificationMessage = new PipelineModificationMessage(List.of(validModification("sepa-1")));
- var noSqlStorage = mock(INoSqlStorage.class);
var pipelineStorage = mock(IPipelineStorage.class);
var verifiedPipelines = new ArrayList<Pipeline>();
- when(noSqlStorage.getPipelineStorageAPI()).thenReturn(pipelineStorage);
+ when(pipelineManager.getPipelinesContainingElements("stream-1")).thenReturn(List.of(affectedPipeline));
+ when(pipelineManager.getPipeline("pipeline-1")).thenReturn(storedPipeline, modifiedPipeline);
- try (MockedStatic<PipelineManager> pipelineManager = mockStatic(PipelineManager.class);
- MockedConstruction<PipelineVerificationHandlerV2> verificationHandlerConstruction =
+ try (MockedConstruction<PipelineVerificationHandlerV2> verificationHandlerConstruction =
mockConstruction(PipelineVerificationHandlerV2.class, (mock, context) -> {
verifiedPipelines.add((Pipeline) context.arguments().get(0));
when(mock.verifyPipeline()).thenReturn(modificationMessage);
@@ -101,11 +97,6 @@ class PipelineUpdateCoordinatorTest {
MockedConstruction<PipelineExecutor> executorConstruction =
mockConstruction(PipelineExecutor.class)) {
- pipelineManager.when(() -> PipelineManager.getPipelinesContainingElements("stream-1"))
- .thenReturn(List.of(affectedPipeline));
- pipelineManager.when(() -> PipelineManager.getPipeline("pipeline-1"))
- .thenReturn(storedPipeline, modifiedPipeline);
-
coordinator.updatePipelines(dataStream);
assertEquals(1, verificationHandlerConstruction.constructed().size());
@@ -126,7 +117,10 @@ class PipelineUpdateCoordinatorTest {
void updatePipelines_ShouldMarkPipelinesRequiringAttentionForAdapterUpdates() {
var requestManager = mock(ExtensionServiceRequestManager.class);
var chartSchemaUpdateCoordinator = mock(ChartSchemaUpdateCoordinator.class);
- var coordinator = new PipelineUpdateCoordinator(requestManager, chartSchemaUpdateCoordinator);
+ var resourceManager = mock(SpResourceManager.class);
+ var pipelineManager = mock(PipelineManager.class);
+ var coordinator = new PipelineUpdateCoordinator(
+ requestManager, resourceManager, chartSchemaUpdateCoordinator, pipelineManager);
var adapterDescription = makeAdapter("stream-1", "Updated adapter");
var storedPipeline = makePipeline("pipeline-1", "Pipeline", false, "stream-1", "Old stream");
var modifiedPipeline = makePipeline("pipeline-1", "Pipeline", false, "stream-1", "Updated adapter");
@@ -134,13 +128,12 @@ class PipelineUpdateCoordinatorTest {
var warning = PipelineElementValidationInfo.error("Schema mismatch");
var modificationMessage = new PipelineModificationMessage(List.of(invalidModification("sepa-1", warning)));
- var noSqlStorage = mock(INoSqlStorage.class);
var pipelineStorage = mock(IPipelineStorage.class);
var verifiedPipelines = new ArrayList<Pipeline>();
- when(noSqlStorage.getPipelineStorageAPI()).thenReturn(pipelineStorage);
+ when(pipelineManager.getPipelinesContainingElements("stream-1")).thenReturn(List.of(storedPipeline));
+ when(pipelineManager.getPipeline("pipeline-1")).thenReturn(storedPipeline);
- try (MockedStatic<PipelineManager> pipelineManager = mockStatic(PipelineManager.class);
- MockedConstruction<PipelineVerificationHandlerV2> verificationHandlerConstruction =
+ try (MockedConstruction<PipelineVerificationHandlerV2> verificationHandlerConstruction =
mockConstruction(PipelineVerificationHandlerV2.class, (mock, context) -> {
verifiedPipelines.add((Pipeline) context.arguments().get(0));
when(mock.verifyPipeline()).thenReturn(modificationMessage);
@@ -153,11 +146,6 @@ class PipelineUpdateCoordinatorTest {
MockedConstruction<PipelineExecutor> executorConstruction =
mockConstruction(PipelineExecutor.class)) {
- pipelineManager.when(() -> PipelineManager.getPipelinesContainingElements("stream-1"))
- .thenReturn(List.of(storedPipeline));
- pipelineManager.when(() -> PipelineManager.getPipeline("pipeline-1"))
- .thenReturn(storedPipeline);
-
coordinator.updatePipelines(adapterDescription);
assertEquals(1, verificationHandlerConstruction.constructed().size());
@@ -180,7 +168,10 @@ class PipelineUpdateCoordinatorTest {
void updatePipelines_ShouldMarkPipelineRequiringAttentionForCriticalMeasurementFieldChange() {
var requestManager = mock(ExtensionServiceRequestManager.class);
var chartSchemaUpdateCoordinator = mock(ChartSchemaUpdateCoordinator.class);
- var coordinator = new PipelineUpdateCoordinator(requestManager, chartSchemaUpdateCoordinator);
+ var resourceManager = mock(SpResourceManager.class);
+ var pipelineManager = mock(PipelineManager.class);
+ var coordinator = new PipelineUpdateCoordinator(
+ requestManager, resourceManager, chartSchemaUpdateCoordinator, pipelineManager);
var adapterDescription = makeAdapter("stream-1", "Updated adapter");
adapterDescription.getDataStream().setEventSchema(makeSchema(makeMeasurementProperty("temperature", XSD.STRING)));
@@ -193,9 +184,10 @@ class PipelineUpdateCoordinatorTest {
measurementUpdateRequiredMessage());
var modificationMessage = new PipelineModificationMessage(List.of(validModification("sepa-1", measurementUpdateInfo)));
var pipelineStorage = mock(IPipelineStorage.class);
+ when(pipelineManager.getPipelinesContainingElements("stream-1")).thenReturn(List.of(storedPipeline));
+ when(pipelineManager.getPipeline("pipeline-1")).thenReturn(storedPipeline);
- try (MockedStatic<PipelineManager> pipelineManager = mockStatic(PipelineManager.class);
- MockedConstruction<PipelineVerificationHandlerV2> verificationHandlerConstruction =
+ try (MockedConstruction<PipelineVerificationHandlerV2> verificationHandlerConstruction =
mockConstruction(PipelineVerificationHandlerV2.class, (mock, context) -> {
when(mock.verifyPipeline()).thenReturn(modificationMessage);
when(mock.makeModifiedPipeline(modificationMessage))
@@ -207,11 +199,6 @@ class PipelineUpdateCoordinatorTest {
MockedConstruction<PipelineExecutor> executorConstruction =
mockConstruction(PipelineExecutor.class)) {
- pipelineManager.when(() -> PipelineManager.getPipelinesContainingElements("stream-1"))
- .thenReturn(List.of(storedPipeline));
- pipelineManager.when(() -> PipelineManager.getPipeline("pipeline-1"))
- .thenReturn(storedPipeline);
-
coordinator.updatePipelines(adapterDescription);
assertEquals(1, verificationHandlerConstruction.constructed().size());
@@ -231,15 +218,20 @@ class PipelineUpdateCoordinatorTest {
void checkPipelineMigrations_ShouldUseUpdatedDataStreamValues() {
var requestManager = mock(ExtensionServiceRequestManager.class);
var chartSchemaUpdateCoordinator = mock(ChartSchemaUpdateCoordinator.class);
- var coordinator = new PipelineUpdateCoordinator(requestManager, chartSchemaUpdateCoordinator);
+ var resourceManager = mock(SpResourceManager.class);
+ var pipelineManager = mock(PipelineManager.class);
+ var coordinator = new PipelineUpdateCoordinator(
+ requestManager, resourceManager, chartSchemaUpdateCoordinator, pipelineManager);
var dataStream = makeDataStream("stream-1", "Updated stream");
var pipeline = makePipeline("pipeline-1", "Pipeline", false, "stream-1", "Old stream");
var modificationMessage = new PipelineModificationMessage(List.of(validModification("sepa-1")));
var verifiedPipelines = new ArrayList<Pipeline>();
var chartUpdateInfo = new ChartSchemaUpdateInfo();
+ when(pipelineManager.getPipelinesContainingElements("stream-1")).thenReturn(List.of(pipeline));
+ when(chartSchemaUpdateCoordinator.checkChartMigrations(pipeline, dataStream.getEventSchema()))
+ .thenReturn(List.of(chartUpdateInfo));
- try (MockedStatic<PipelineManager> pipelineManager = mockStatic(PipelineManager.class);
- MockedConstruction<PipelineVerificationHandlerV2> verificationHandlerConstruction =
+ try (MockedConstruction<PipelineVerificationHandlerV2> verificationHandlerConstruction =
mockConstruction(PipelineVerificationHandlerV2.class, (mock, context) -> {
verifiedPipelines.add((Pipeline) context.arguments().get(0));
when(mock.verifyPipeline()).thenReturn(modificationMessage);
@@ -247,11 +239,6 @@ class PipelineUpdateCoordinatorTest {
.thenReturn(new PipelineModificationResult((Pipeline) context.arguments().get(0), List.of()));
})) {
- pipelineManager.when(() -> PipelineManager.getPipelinesContainingElements("stream-1"))
- .thenReturn(List.of(pipeline));
- when(chartSchemaUpdateCoordinator.checkChartMigrations(pipeline, dataStream.getEventSchema()))
- .thenReturn(List.of(chartUpdateInfo));
-
var result = coordinator.checkPipelineMigrations(dataStream);
assertEquals(1, result.size());
@@ -271,16 +258,19 @@ class PipelineUpdateCoordinatorTest {
void checkPipelineMigrations_ShouldReportWarningsForAdapterUpdates() {
var requestManager = mock(ExtensionServiceRequestManager.class);
var chartSchemaUpdateCoordinator = mock(ChartSchemaUpdateCoordinator.class);
- var coordinator = new PipelineUpdateCoordinator(requestManager, chartSchemaUpdateCoordinator);
+ var resourceManager = mock(SpResourceManager.class);
+ var pipelineManager = mock(PipelineManager.class);
+ var coordinator = new PipelineUpdateCoordinator(
+ requestManager, resourceManager, chartSchemaUpdateCoordinator, pipelineManager);
var adapterDescription = makeAdapter("stream-1", "Updated adapter");
var pipeline = makePipeline("pipeline-1", "Pipeline", false, "stream-1", "Old stream");
pipeline.setSepas(List.of(makeSepa("sepa-1", "Processor")));
var warning = PipelineElementValidationInfo.error("Schema mismatch");
var modificationMessage = new PipelineModificationMessage(List.of(invalidModification("sepa-1", warning)));
var verifiedPipelines = new ArrayList<Pipeline>();
+ when(pipelineManager.getPipelinesContainingElements("stream-1")).thenReturn(List.of(pipeline));
- try (MockedStatic<PipelineManager> pipelineManager = mockStatic(PipelineManager.class);
- MockedConstruction<PipelineVerificationHandlerV2> verificationHandlerConstruction =
+ try (MockedConstruction<PipelineVerificationHandlerV2> verificationHandlerConstruction =
mockConstruction(PipelineVerificationHandlerV2.class, (mock, context) -> {
verifiedPipelines.add((Pipeline) context.arguments().get(0));
when(mock.verifyPipeline()).thenReturn(modificationMessage);
@@ -288,9 +278,6 @@ class PipelineUpdateCoordinatorTest {
.thenReturn(new PipelineModificationResult((Pipeline) context.arguments().get(0), List.of()));
})) {
- pipelineManager.when(() -> PipelineManager.getPipelinesContainingElements("stream-1"))
- .thenReturn(List.of(pipeline));
-
var result = coordinator.checkPipelineMigrations(adapterDescription);
assertEquals(1, result.size());
@@ -310,7 +297,10 @@ class PipelineUpdateCoordinatorTest {
void checkPipelineMigrations_ShouldDisableAutoMigrationForCriticalMeasurementFieldChange() {
var requestManager = mock(ExtensionServiceRequestManager.class);
var chartSchemaUpdateCoordinator = mock(ChartSchemaUpdateCoordinator.class);
- var coordinator = new PipelineUpdateCoordinator(requestManager, chartSchemaUpdateCoordinator);
+ var resourceManager = mock(SpResourceManager.class);
+ var pipelineManager = mock(PipelineManager.class);
+ var coordinator = new PipelineUpdateCoordinator(
+ requestManager, resourceManager, chartSchemaUpdateCoordinator, pipelineManager);
var adapterDescription = makeAdapter("stream-1", "Updated adapter");
adapterDescription.getDataStream().setEventSchema(makeSchema(makeMeasurementProperty("temperature", XSD.STRING)));
@@ -321,18 +311,15 @@ class PipelineUpdateCoordinatorTest {
var measurementUpdateInfo = PipelineElementValidationInfo.info(
measurementUpdateRequiredMessage());
var modificationMessage = new PipelineModificationMessage(List.of(validModification("sepa-1", measurementUpdateInfo)));
+ when(pipelineManager.getPipelinesContainingElements("stream-1")).thenReturn(List.of(pipeline));
- try (MockedStatic<PipelineManager> pipelineManager = mockStatic(PipelineManager.class);
- MockedConstruction<PipelineVerificationHandlerV2> verificationHandlerConstruction =
+ try (MockedConstruction<PipelineVerificationHandlerV2> verificationHandlerConstruction =
mockConstruction(PipelineVerificationHandlerV2.class, (mock, context) -> {
when(mock.verifyPipeline()).thenReturn(modificationMessage);
when(mock.makeModifiedPipeline(modificationMessage))
.thenReturn(new PipelineModificationResult((Pipeline) context.arguments().get(0), List.of()));
})) {
- pipelineManager.when(() -> PipelineManager.getPipelinesContainingElements("stream-1"))
- .thenReturn(List.of(pipeline));
-
var result = coordinator.checkPipelineMigrations(adapterDescription);
assertEquals(1, verificationHandlerConstruction.constructed().size());
diff --git a/streampipes-resource-management/src/test/java/org/apache/streampipes/resource/management/AdapterResourceManagerTest.java b/streampipes-resource-management/src/test/java/org/apache/streampipes/resource/management/AdapterResourceManagerTest.java
index ec63f239b9..8e6fbf767f 100644
--- a/streampipes-resource-management/src/test/java/org/apache/streampipes/resource/management/AdapterResourceManagerTest.java
+++ b/streampipes-resource-management/src/test/java/org/apache/streampipes/resource/management/AdapterResourceManagerTest.java
@@ -43,7 +43,8 @@ public class AdapterResourceManagerTest {
@BeforeEach
void setUp() {
storage = mock(IAdapterStorage.class);
- adapterResourceManager = new AdapterResourceManager(storage, null, null);
+ PermissionResourceManager permissionResourceManager = mock(PermissionResourceManager.class);
+ adapterResourceManager = new AdapterResourceManager(storage, null, permissionResourceManager);
}
@Test
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/ResetManagement.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/ResetManagement.java
index 50065f2b22..22c98de554 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/ResetManagement.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/ResetManagement.java
@@ -127,8 +127,8 @@ public class ResetManagement {
}
private void stopAndDeleteAllAdapters(WorkerRestClient workerRestClient,
- IExtensionsServiceStorage extensionsServiceStorage,
- ExtensionServiceRequestManager requestManager) {
+ IExtensionsServiceStorage extensionsServiceStorage,
+ ExtensionServiceRequestManager requestManager) {
AdapterMasterManagement adapterMasterManagement = new AdapterMasterManagement(
StorageDispatcher.INSTANCE.getNoSqlStore()
.getAdapterInstanceStorage(),
(streampipes) 01/04: refactor: Prepare chart storage for DI
Posted by ri...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
dominikriemer pushed a commit to branch introduce-storage-cache
in repository https://gitbox.apache.org/repos/asf/streampipes.git
commit 742ccd31b62c3302aa495549cc96b37385174836
Author: Dominik Riemer <do...@gmail.com>
AuthorDate: Wed Jun 17 23:14:37 2026 +0200
refactor: Prepare chart storage for DI
---
.../management/AdapterUpdateManagement.java | 6 ++-
.../dataexplorer/api/IDataExplorerManager.java | 3 +-
.../influx/DataExplorerManagerInflux.java | 9 +++-
.../iotdb/DataExplorerManagerIotDb.java | 6 ++-
.../management/DataExplorerDispatcher.java | 1 +
.../dataexplorer/DataExplorerSchemaManagement.java | 5 --
.../streampipes/export/AssetLinkResolver.java | 9 +++-
.../streampipes/export/DataLakeExportManager.java | 14 +++---
.../apache/streampipes/export/ExportManager.java | 14 ++++--
.../apache/streampipes/export/ImportManager.java | 12 +++--
.../export/dataimport/PerformImportGenerator.java | 11 +++--
.../export/dataimport/PreviewImportGenerator.java | 8 +++-
.../export/generator/ExportPackageGenerator.java | 12 +++--
.../streampipes/export/resolver/ChartResolver.java | 13 ++++--
.../sinks/internal/jvm/datalake/DataLakeSink.java | 3 +-
.../update/ChartSchemaUpdateCoordinator.java | 7 +--
.../update/DataStreamUpdateManagement.java | 5 +-
.../update/MeasurementUpdateManagement.java | 6 +--
.../pipeline/update/PipelineUpdateCoordinator.java | 6 +--
.../management/DataExplorerResourceManager.java | 19 ++++++--
.../resource/management/SpResourceManager.java | 4 --
.../apache/streampipes/rest/ResetManagement.java | 53 ++++++++++++++--------
.../streampipes/rest/impl/PipelineResource.java | 11 ++++-
.../streampipes/rest/impl/ResetResource.java | 22 ++++-----
.../rest/impl/admin/DataExportResource.java | 11 +++--
.../rest/impl/admin/DataImportResource.java | 11 +++--
.../rest/impl/connect/AdapterResource.java | 16 +++++--
.../rest/impl/connect/CompactAdapterResource.java | 8 +++-
.../impl/dashboard/DataLakeDashboardResource.java | 7 ++-
.../impl/datalake/AbstractDataLakeResource.java | 9 ++--
.../impl/datalake/DataLakeMeasureResource.java | 6 ++-
.../rest/impl/datalake/DataLakeResource.java | 14 +++---
.../rest/impl/datalake/DataLakeWidgetResource.java | 7 +--
.../datalake/KioskDashboardDataLakeResource.java | 14 +++---
.../datalake/importer/DataLakeImportResource.java | 6 ++-
.../rest/impl/pe/DataStreamResource.java | 9 +++-
.../service/core/StreamPipesCoreApplication.java | 6 ++-
.../core/migrations/AvailableMigrations.java | 9 +++-
.../v0980/FixImportedPermissionsMigration.java | 12 +++--
.../service/core/scheduler/DataLakeScheduler.java | 21 +++++++--
.../core/storage/StorageApiConfiguration.java | 7 +++
.../storage/api/core/INoSqlStorage.java | 3 --
.../storage/couchdb/CouchDbStorageManager.java | 5 --
43 files changed, 275 insertions(+), 165 deletions(-)
diff --git a/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/AdapterUpdateManagement.java b/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/AdapterUpdateManagement.java
index 9a68ba38e3..094272aa00 100644
--- a/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/AdapterUpdateManagement.java
+++ b/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/AdapterUpdateManagement.java
@@ -20,6 +20,7 @@ package org.apache.streampipes.connect.management.management;
import org.apache.streampipes.commons.exceptions.connect.AdapterException;
import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequestManager;
+import org.apache.streampipes.manager.pipeline.update.ChartSchemaUpdateCoordinator;
import org.apache.streampipes.manager.pipeline.update.PipelineUpdateCoordinator;
import org.apache.streampipes.model.SpDataStream;
import org.apache.streampipes.model.connect.adapter.AdapterDescription;
@@ -38,11 +39,12 @@ public class AdapterUpdateManagement {
private final PipelineUpdateCoordinator pipelineUpdateCoordinator;
public AdapterUpdateManagement(AdapterMasterManagement adapterMasterManagement,
- ExtensionServiceRequestManager requestManager) {
+ ExtensionServiceRequestManager requestManager,
+ ChartSchemaUpdateCoordinator chartSchemaUpdateCoordinator) {
this.adapterMasterManagement = adapterMasterManagement;
this.adapterResourceManager = new SpResourceManager().manageAdapters();
this.dataStreamResourceManager = new SpResourceManager().manageDataStreams();
- this.pipelineUpdateCoordinator = new PipelineUpdateCoordinator(requestManager);
+ this.pipelineUpdateCoordinator = new PipelineUpdateCoordinator(requestManager, chartSchemaUpdateCoordinator);
}
public void updateAdapter(AdapterDescription ad)
diff --git a/streampipes-data-explorer-api/src/main/java/org/apache/streampipes/dataexplorer/api/IDataExplorerManager.java b/streampipes-data-explorer-api/src/main/java/org/apache/streampipes/dataexplorer/api/IDataExplorerManager.java
index 5711aade33..3de231ca5f 100644
--- a/streampipes-data-explorer-api/src/main/java/org/apache/streampipes/dataexplorer/api/IDataExplorerManager.java
+++ b/streampipes-data-explorer-api/src/main/java/org/apache/streampipes/dataexplorer/api/IDataExplorerManager.java
@@ -19,6 +19,7 @@
package org.apache.streampipes.dataexplorer.api;
import org.apache.streampipes.client.api.IStreamPipesClient;
+import org.apache.streampipes.manager.pipeline.update.ChartSchemaUpdateCoordinator;
import org.apache.streampipes.model.datalake.DataLakeMeasure;
import java.util.List;
@@ -41,7 +42,7 @@ public interface IDataExplorerManager {
IDataExplorerQueryManagement getQueryManagement(IDataExplorerSchemaManagement dataExplorerSchemaManagement);
- IDataExplorerSchemaManagement getSchemaManagement();
+ IDataExplorerSchemaManagement getSchemaManagement(ChartSchemaUpdateCoordinator chartSchemaUpdateCoordinator);
default ITimeSeriesStorage getTimeseriesStorage(DataLakeMeasure measure) {
return getTimeseriesStorage(measure, false);
diff --git a/streampipes-data-explorer-influx/src/main/java/org/apache/streampipes/dataexplorer/influx/DataExplorerManagerInflux.java b/streampipes-data-explorer-influx/src/main/java/org/apache/streampipes/dataexplorer/influx/DataExplorerManagerInflux.java
index 5ec67f0db9..8d600847d5 100644
--- a/streampipes-data-explorer-influx/src/main/java/org/apache/streampipes/dataexplorer/influx/DataExplorerManagerInflux.java
+++ b/streampipes-data-explorer-influx/src/main/java/org/apache/streampipes/dataexplorer/influx/DataExplorerManagerInflux.java
@@ -30,6 +30,7 @@ import org.apache.streampipes.dataexplorer.api.ITimeSeriesStorage;
import org.apache.streampipes.dataexplorer.influx.client.InfluxClientProvider;
import org.apache.streampipes.dataexplorer.influx.sanitize.DataLakeMeasurementSanitizerInflux;
import org.apache.streampipes.manager.permission.DataLakePermissionManager;
+import org.apache.streampipes.manager.pipeline.update.ChartSchemaUpdateCoordinator;
import org.apache.streampipes.model.datalake.DataLakeMeasure;
import org.apache.streampipes.storage.management.StorageDispatcher;
@@ -37,6 +38,9 @@ import java.util.List;
public class DataExplorerManagerInflux implements IDataExplorerManager {
+ public DataExplorerManagerInflux() {
+ }
+
@Override
public IDataLakeMeasurementCounter getMeasurementCounter(
List<DataLakeMeasure> allMeasurements,
@@ -53,13 +57,14 @@ public class DataExplorerManagerInflux implements IDataExplorerManager {
}
@Override
- public IDataExplorerSchemaManagement getSchemaManagement() {
+ public IDataExplorerSchemaManagement getSchemaManagement(ChartSchemaUpdateCoordinator chartSchemaUpdateCoordinator) {
return new DataExplorerSchemaManagement(StorageDispatcher.INSTANCE
.getNoSqlStore()
.getDataLakeStorage(),
new DataLakePermissionManager(
StorageDispatcher.INSTANCE.getNoSqlStore().getPermissionStorage()
- )
+ ),
+ chartSchemaUpdateCoordinator
);
}
diff --git a/streampipes-data-explorer-iotdb/src/main/java/org/apache/streampipes/dataexplorer/iotdb/DataExplorerManagerIotDb.java b/streampipes-data-explorer-iotdb/src/main/java/org/apache/streampipes/dataexplorer/iotdb/DataExplorerManagerIotDb.java
index ba0f060b94..4db64664d7 100644
--- a/streampipes-data-explorer-iotdb/src/main/java/org/apache/streampipes/dataexplorer/iotdb/DataExplorerManagerIotDb.java
+++ b/streampipes-data-explorer-iotdb/src/main/java/org/apache/streampipes/dataexplorer/iotdb/DataExplorerManagerIotDb.java
@@ -29,6 +29,7 @@ import org.apache.streampipes.dataexplorer.api.IDataLakeMeasurementSanitizer;
import org.apache.streampipes.dataexplorer.api.ITimeSeriesStorage;
import org.apache.streampipes.dataexplorer.iotdb.sanitize.DataLakeMeasurementSanitizerIotDb;
import org.apache.streampipes.manager.permission.DataLakePermissionManager;
+import org.apache.streampipes.manager.pipeline.update.ChartSchemaUpdateCoordinator;
import org.apache.streampipes.model.datalake.DataLakeMeasure;
import org.apache.streampipes.storage.management.StorageDispatcher;
@@ -52,13 +53,14 @@ public class DataExplorerManagerIotDb implements IDataExplorerManager {
}
@Override
- public IDataExplorerSchemaManagement getSchemaManagement() {
+ public IDataExplorerSchemaManagement getSchemaManagement(ChartSchemaUpdateCoordinator chartSchemaUpdateCoordinator) {
return new DataExplorerSchemaManagement(StorageDispatcher.INSTANCE
.getNoSqlStore()
.getDataLakeStorage(),
new DataLakePermissionManager(
StorageDispatcher.INSTANCE.getNoSqlStore().getPermissionStorage()
- )
+ ),
+ chartSchemaUpdateCoordinator
);
}
diff --git a/streampipes-data-explorer-management/src/main/java/org/apache/streampipes/dataexplorer/management/DataExplorerDispatcher.java b/streampipes-data-explorer-management/src/main/java/org/apache/streampipes/dataexplorer/management/DataExplorerDispatcher.java
index 8614c15b57..10b810134f 100644
--- a/streampipes-data-explorer-management/src/main/java/org/apache/streampipes/dataexplorer/management/DataExplorerDispatcher.java
+++ b/streampipes-data-explorer-management/src/main/java/org/apache/streampipes/dataexplorer/management/DataExplorerDispatcher.java
@@ -22,6 +22,7 @@ import org.apache.streampipes.commons.environment.Environments;
import org.apache.streampipes.dataexplorer.api.IDataExplorerManager;
import org.apache.streampipes.dataexplorer.influx.DataExplorerManagerInflux;
import org.apache.streampipes.dataexplorer.iotdb.DataExplorerManagerIotDb;
+import org.apache.streampipes.manager.pipeline.update.ChartSchemaUpdateCoordinator;
public class DataExplorerDispatcher {
diff --git a/streampipes-data-explorer/src/main/java/org/apache/streampipes/dataexplorer/DataExplorerSchemaManagement.java b/streampipes-data-explorer/src/main/java/org/apache/streampipes/dataexplorer/DataExplorerSchemaManagement.java
index a833e41860..fa44455a03 100644
--- a/streampipes-data-explorer/src/main/java/org/apache/streampipes/dataexplorer/DataExplorerSchemaManagement.java
+++ b/streampipes-data-explorer/src/main/java/org/apache/streampipes/dataexplorer/DataExplorerSchemaManagement.java
@@ -44,11 +44,6 @@ public class DataExplorerSchemaManagement implements IDataExplorerSchemaManageme
private final ChartSchemaUpdateCoordinator chartSchemaUpdateCoordinator;
public DataExplorerSchemaManagement(CRUDStorage<DataLakeMeasure> dataLakeStorage,
- DataLakePermissionManager permissionManager) {
- this(dataLakeStorage, permissionManager, new ChartSchemaUpdateCoordinator());
- }
-
- DataExplorerSchemaManagement(CRUDStorage<DataLakeMeasure> dataLakeStorage,
DataLakePermissionManager permissionManager,
ChartSchemaUpdateCoordinator chartSchemaUpdateCoordinator) {
this.dataLakeStorage = dataLakeStorage;
diff --git a/streampipes-data-export/src/main/java/org/apache/streampipes/export/AssetLinkResolver.java b/streampipes-data-export/src/main/java/org/apache/streampipes/export/AssetLinkResolver.java
index e767967ed9..708e680938 100644
--- a/streampipes-data-export/src/main/java/org/apache/streampipes/export/AssetLinkResolver.java
+++ b/streampipes-data-export/src/main/java/org/apache/streampipes/export/AssetLinkResolver.java
@@ -31,6 +31,7 @@ import org.apache.streampipes.model.assets.AssetLink;
import org.apache.streampipes.model.assets.SpAssetModel;
import org.apache.streampipes.model.export.AssetExportConfiguration;
import org.apache.streampipes.serializers.json.JacksonSerializer;
+import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
import org.apache.streampipes.storage.management.StorageDispatcher;
import com.fasterxml.jackson.databind.DeserializationFeature;
@@ -51,11 +52,14 @@ public class AssetLinkResolver {
private final String assetId;
private final ObjectMapper mapper;
private final ExtensionServiceRequestManager extensionServiceRequestManager;
+ private final IDataExplorerWidgetStorage chartStorage;
public AssetLinkResolver(String assetId,
- ExtensionServiceRequestManager extensionServiceRequestManager) {
+ ExtensionServiceRequestManager extensionServiceRequestManager,
+ IDataExplorerWidgetStorage chartStorage) {
this.assetId = assetId;
this.extensionServiceRequestManager = extensionServiceRequestManager;
+ this.chartStorage = chartStorage;
this.mapper = JacksonSerializer.getObjectMapper(Map.of(
DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true,
SerializationFeature.INDENT_OUTPUT, false
@@ -72,7 +76,8 @@ public class AssetLinkResolver {
exportConfig.setAssetName(asset.getAssetName());
exportConfig.setAdapters(new AdapterResolver(extensionServiceRequestManager)
.resolve(getLinks(assetLinks, ResolvableAssetLinks.ADAPTER)));
- exportConfig.setDataViews(new ChartResolver().resolve(getLinks(assetLinks, ResolvableAssetLinks.CHART)));
+ exportConfig.setDataViews(new ChartResolver(chartStorage)
+ .resolve(getLinks(assetLinks, ResolvableAssetLinks.CHART)));
exportConfig.setDashboards(new DashboardResolver().resolve(getLinks(assetLinks, ResolvableAssetLinks.DASHBOARD)));
exportConfig.setDataSources(
new DataSourceResolver().resolve(getLinks(assetLinks, ResolvableAssetLinks.DATA_SOURCE)));
diff --git a/streampipes-data-export/src/main/java/org/apache/streampipes/export/DataLakeExportManager.java b/streampipes-data-export/src/main/java/org/apache/streampipes/export/DataLakeExportManager.java
index c865bad32b..a0274f5800 100644
--- a/streampipes-data-export/src/main/java/org/apache/streampipes/export/DataLakeExportManager.java
+++ b/streampipes-data-export/src/main/java/org/apache/streampipes/export/DataLakeExportManager.java
@@ -24,7 +24,6 @@ import org.apache.streampipes.dataexplorer.api.IDataExplorerSchemaManagement;
import org.apache.streampipes.dataexplorer.export.OutputFormat;
import org.apache.streampipes.dataexplorer.export.objectstorage.ExportProviderFactory;
import org.apache.streampipes.dataexplorer.export.objectstorage.IObjectStorage;
-import org.apache.streampipes.dataexplorer.management.DataExplorerDispatcher;
import org.apache.streampipes.model.configuration.ExportProviderSettings;
import org.apache.streampipes.model.configuration.ProviderType;
import org.apache.streampipes.model.datalake.DataLakeMeasure;
@@ -49,13 +48,14 @@ public class DataLakeExportManager {
private static final Logger LOG = LoggerFactory.getLogger(DataLakeExportManager.class);
private static final Environment env = Environments.getEnvironment();
- private final IDataExplorerSchemaManagement dataExplorerSchemaManagement = new DataExplorerDispatcher()
- .getDataExplorerManager()
- .getSchemaManagement();
+ private final IDataExplorerSchemaManagement dataExplorerSchemaManagement;
+ private final IDataExplorerQueryManagement dataExplorerQueryManagement;
- private final IDataExplorerQueryManagement dataExplorerQueryManagement = new DataExplorerDispatcher()
- .getDataExplorerManager()
- .getQueryManagement(this.dataExplorerSchemaManagement);
+ public DataLakeExportManager(IDataExplorerSchemaManagement dataLakeSchemaManagement,
+ IDataExplorerQueryManagement dataLakeQueryManagement) {
+ this.dataExplorerSchemaManagement = dataLakeSchemaManagement;
+ this.dataExplorerQueryManagement = dataLakeQueryManagement;
+ }
private String savePath = "";
diff --git a/streampipes-data-export/src/main/java/org/apache/streampipes/export/ExportManager.java b/streampipes-data-export/src/main/java/org/apache/streampipes/export/ExportManager.java
index 37ccdeaef8..4254ee693a 100644
--- a/streampipes-data-export/src/main/java/org/apache/streampipes/export/ExportManager.java
+++ b/streampipes-data-export/src/main/java/org/apache/streampipes/export/ExportManager.java
@@ -21,6 +21,7 @@ package org.apache.streampipes.export;
import org.apache.streampipes.export.generator.ExportPackageGenerator;
import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequestManager;
import org.apache.streampipes.model.export.ExportConfiguration;
+import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
import java.io.IOException;
import java.util.List;
@@ -29,11 +30,13 @@ import java.util.stream.Collectors;
public class ExportManager {
public static ExportConfiguration getExportPreview(List<String> selectedAssetIds,
- ExtensionServiceRequestManager extensionServiceRequestManager) {
+ ExtensionServiceRequestManager extensionServiceRequestManager,
+ IDataExplorerWidgetStorage chartStorage) {
var exportConfig = new ExportConfiguration();
var assetExportConfigurations = selectedAssetIds
.stream()
- .map(assetId -> new AssetLinkResolver(assetId, extensionServiceRequestManager).resolveResources())
+ .map(assetId -> new AssetLinkResolver(assetId, extensionServiceRequestManager, chartStorage)
+ .resolveResources())
.collect(Collectors.toList());
exportConfig.setAssetExportConfiguration(assetExportConfigurations);
@@ -42,9 +45,10 @@ public class ExportManager {
}
public static byte[] getExportPackage(ExportConfiguration exportConfiguration,
- ExtensionServiceRequestManager extensionServiceRequestManager)
- throws IOException {
- return new ExportPackageGenerator(exportConfiguration, extensionServiceRequestManager).generateExportPackage();
+ ExtensionServiceRequestManager extensionServiceRequestManager,
+ IDataExplorerWidgetStorage chartStorage) throws IOException {
+ return new ExportPackageGenerator(exportConfiguration, extensionServiceRequestManager, chartStorage)
+ .generateExportPackage();
}
}
diff --git a/streampipes-data-export/src/main/java/org/apache/streampipes/export/ImportManager.java b/streampipes-data-export/src/main/java/org/apache/streampipes/export/ImportManager.java
index b98c4638f4..7802525cd4 100644
--- a/streampipes-data-export/src/main/java/org/apache/streampipes/export/ImportManager.java
+++ b/streampipes-data-export/src/main/java/org/apache/streampipes/export/ImportManager.java
@@ -22,6 +22,7 @@ import org.apache.streampipes.export.dataimport.PerformImportGenerator;
import org.apache.streampipes.export.dataimport.PreviewImportGenerator;
import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequestManager;
import org.apache.streampipes.model.export.AssetExportConfiguration;
+import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
import java.io.IOException;
import java.io.InputStream;
@@ -29,15 +30,18 @@ import java.io.InputStream;
public class ImportManager {
public static AssetExportConfiguration getImportPreview(InputStream packageZipStream,
- ExtensionServiceRequestManager extensionServiceRequestManager)
+ ExtensionServiceRequestManager extensionServiceRequestManager,
+ IDataExplorerWidgetStorage chartStorage)
throws IOException {
- return new PreviewImportGenerator(extensionServiceRequestManager).generate(packageZipStream);
+ return new PreviewImportGenerator(extensionServiceRequestManager, chartStorage).generate(packageZipStream);
}
public static void performImport(InputStream packageZipStream,
AssetExportConfiguration exportConfiguration,
String ownerSid,
- ExtensionServiceRequestManager extensionServiceRequestManager) throws IOException {
- new PerformImportGenerator(exportConfiguration, ownerSid, extensionServiceRequestManager).generate(packageZipStream);
+ ExtensionServiceRequestManager extensionServiceRequestManager,
+ IDataExplorerWidgetStorage chartStorage) throws IOException {
+ new PerformImportGenerator(exportConfiguration, ownerSid, extensionServiceRequestManager, chartStorage)
+ .generate(packageZipStream);
}
}
diff --git a/streampipes-data-export/src/main/java/org/apache/streampipes/export/dataimport/PerformImportGenerator.java b/streampipes-data-export/src/main/java/org/apache/streampipes/export/dataimport/PerformImportGenerator.java
index 0e4532deec..b9b63c2e67 100644
--- a/streampipes-data-export/src/main/java/org/apache/streampipes/export/dataimport/PerformImportGenerator.java
+++ b/streampipes-data-export/src/main/java/org/apache/streampipes/export/dataimport/PerformImportGenerator.java
@@ -40,6 +40,7 @@ import org.apache.streampipes.model.export.ExportItem;
import org.apache.streampipes.model.pipeline.Pipeline;
import org.apache.streampipes.resource.management.PermissionResourceManager;
import org.apache.streampipes.storage.api.core.INoSqlStorage;
+import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
import org.apache.streampipes.storage.management.StorageDispatcher;
import com.fasterxml.jackson.core.JsonProcessingException;
@@ -57,14 +58,17 @@ public class PerformImportGenerator extends ImportGenerator<Void> {
private final Set<PermissionInfo> permissionsToStore = new HashSet<>();
private final String ownerSid;
private final ExtensionServiceRequestManager extensionServiceRequestManager;
+ private final IDataExplorerWidgetStorage chartStorage;
public PerformImportGenerator(AssetExportConfiguration config,
String ownerSid,
- ExtensionServiceRequestManager extensionServiceRequestManager) {
+ ExtensionServiceRequestManager extensionServiceRequestManager,
+ IDataExplorerWidgetStorage chartStorage) {
this.config = config;
this.storage = StorageDispatcher.INSTANCE.getNoSqlStore();
this.ownerSid = ownerSid;
this.extensionServiceRequestManager = extensionServiceRequestManager;
+ this.chartStorage = chartStorage;
}
@Override
@@ -93,8 +97,9 @@ public class PerformImportGenerator extends ImportGenerator<Void> {
@Override
protected void handleChart(String document, String chartId) throws JsonProcessingException {
if (shouldStore(chartId, config.getDataViews())) {
- writeDocument(document, new ChartResolver());
- var chart = new ChartResolver().deserializeDocument(document);
+ var chartResolver = new ChartResolver(chartStorage);
+ writeDocument(document, chartResolver);
+ var chart = chartResolver.deserializeDocument(document);
permissionsToStore.add(new PermissionInfo(chart.getElementId(), DataExplorerWidgetModel.class));
}
}
diff --git a/streampipes-data-export/src/main/java/org/apache/streampipes/export/dataimport/PreviewImportGenerator.java b/streampipes-data-export/src/main/java/org/apache/streampipes/export/dataimport/PreviewImportGenerator.java
index de8a0c976c..d440467d8a 100644
--- a/streampipes-data-export/src/main/java/org/apache/streampipes/export/dataimport/PreviewImportGenerator.java
+++ b/streampipes-data-export/src/main/java/org/apache/streampipes/export/dataimport/PreviewImportGenerator.java
@@ -29,6 +29,7 @@ import org.apache.streampipes.export.resolver.PipelineResolver;
import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequestManager;
import org.apache.streampipes.model.export.AssetExportConfiguration;
import org.apache.streampipes.model.export.ExportItem;
+import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
@@ -43,11 +44,14 @@ public class PreviewImportGenerator extends ImportGenerator<AssetExportConfigura
private static final Logger LOG = LoggerFactory.getLogger(PreviewImportGenerator.class);
private final AssetExportConfiguration importConfig;
private final ExtensionServiceRequestManager extensionServiceRequestManager;
+ private final IDataExplorerWidgetStorage chartStorage;
- public PreviewImportGenerator(ExtensionServiceRequestManager extensionServiceRequestManager) {
+ public PreviewImportGenerator(ExtensionServiceRequestManager extensionServiceRequestManager,
+ IDataExplorerWidgetStorage chartStorage) {
super();
this.importConfig = new AssetExportConfiguration();
this.extensionServiceRequestManager = extensionServiceRequestManager;
+ this.chartStorage = chartStorage;
}
@@ -85,7 +89,7 @@ public class PreviewImportGenerator extends ImportGenerator<AssetExportConfigura
protected void handleChart(String document, String dataViewId) throws JsonProcessingException {
addExportItem(
dataViewId,
- new ChartResolver().readDocument(document).getBaseAppearanceConfig().get("widgetTitle").toString(),
+ new ChartResolver(chartStorage).readDocument(document).getBaseAppearanceConfig().get("widgetTitle").toString(),
importConfig::addDataView
);
}
diff --git a/streampipes-data-export/src/main/java/org/apache/streampipes/export/generator/ExportPackageGenerator.java b/streampipes-data-export/src/main/java/org/apache/streampipes/export/generator/ExportPackageGenerator.java
index 1bc2829977..99944160b7 100644
--- a/streampipes-data-export/src/main/java/org/apache/streampipes/export/generator/ExportPackageGenerator.java
+++ b/streampipes-data-export/src/main/java/org/apache/streampipes/export/generator/ExportPackageGenerator.java
@@ -35,6 +35,7 @@ import org.apache.streampipes.model.export.ExportConfiguration;
import org.apache.streampipes.model.export.ExportItem;
import org.apache.streampipes.model.export.StreamPipesApplicationPackage;
import org.apache.streampipes.serializers.json.JacksonSerializer;
+import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
import org.apache.streampipes.storage.management.StorageDispatcher;
import com.fasterxml.jackson.core.JsonProcessingException;
@@ -57,12 +58,15 @@ public class ExportPackageGenerator {
private final ExportConfiguration exportConfiguration;
private final ExtensionServiceRequestManager extensionServiceRequestManager;
- private ObjectMapper defaultMapper;
+ private final ObjectMapper defaultMapper;
+ private final IDataExplorerWidgetStorage chartStorage;
public ExportPackageGenerator(ExportConfiguration exportConfiguration,
- ExtensionServiceRequestManager extensionServiceRequestManager) {
+ ExtensionServiceRequestManager extensionServiceRequestManager,
+ IDataExplorerWidgetStorage chartStorage) {
this.exportConfiguration = exportConfiguration;
this.extensionServiceRequestManager = extensionServiceRequestManager;
+ this.chartStorage = chartStorage;
this.defaultMapper = JacksonSerializer.getObjectMapper(Map.of(
DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true,
SerializationFeature.INDENT_OUTPUT, false
@@ -107,14 +111,14 @@ public class ExportPackageGenerator {
new DashboardResolver(),
manifest::addDashboard);
var charts = resolver.getCharts(item.getResourceId());
- var chartResolver = new ChartResolver();
+ var chartResolver = new ChartResolver(chartStorage);
charts.forEach(widgetId -> addDoc(builder, widgetId, chartResolver, manifest::addDataViewWidget));
});
config.getDataViews().forEach(item -> {
addDoc(builder,
item,
- new ChartResolver(),
+ new ChartResolver(chartStorage),
manifest::addDataView);
});
diff --git a/streampipes-data-export/src/main/java/org/apache/streampipes/export/resolver/ChartResolver.java b/streampipes-data-export/src/main/java/org/apache/streampipes/export/resolver/ChartResolver.java
index 74e417ac5d..d26996f856 100644
--- a/streampipes-data-export/src/main/java/org/apache/streampipes/export/resolver/ChartResolver.java
+++ b/streampipes-data-export/src/main/java/org/apache/streampipes/export/resolver/ChartResolver.java
@@ -22,6 +22,7 @@ import org.apache.streampipes.model.datalake.DataExplorerWidgetModel;
import org.apache.streampipes.model.export.AssetExportConfiguration;
import org.apache.streampipes.model.export.ExportItem;
import org.apache.streampipes.serializers.json.JacksonSerializer;
+import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
@@ -30,9 +31,15 @@ import java.util.Map;
public class ChartResolver extends AbstractResolver<DataExplorerWidgetModel> {
+ private final IDataExplorerWidgetStorage chartStorage;
+
+ public ChartResolver(IDataExplorerWidgetStorage chartStorage) {
+ this.chartStorage = chartStorage;
+ }
+
@Override
public DataExplorerWidgetModel findDocument(String resourceId) {
- return getNoSqlStore().getDataExplorerWidgetStorage().getElementById(resourceId);
+ return chartStorage.getElementById(resourceId);
}
@Override
@@ -58,7 +65,7 @@ public class ChartResolver extends AbstractResolver<DataExplorerWidgetModel> {
@Override
public void writeDocument(String document, AssetExportConfiguration config) throws JsonProcessingException {
- getNoSqlStore().getDataExplorerWidgetStorage().persist(deserializeDocument(document));
+ chartStorage.persist(deserializeDocument(document));
}
@Override
@@ -70,7 +77,7 @@ public class ChartResolver extends AbstractResolver<DataExplorerWidgetModel> {
public void deleteDocument(String document) throws JsonProcessingException {
var chart = readDocument(document);
var resourceId = chart.getElementId();
- getNoSqlStore().getDataExplorerWidgetStorage().deleteElementById(resourceId);
+ chartStorage.deleteElementById(resourceId);
}
}
diff --git a/streampipes-extensions/streampipes-sinks-internal-jvm/src/main/java/org/apache/streampipes/sinks/internal/jvm/datalake/DataLakeSink.java b/streampipes-extensions/streampipes-sinks-internal-jvm/src/main/java/org/apache/streampipes/sinks/internal/jvm/datalake/DataLakeSink.java
index 40230d9e5a..f0e1812556 100644
--- a/streampipes-extensions/streampipes-sinks-internal-jvm/src/main/java/org/apache/streampipes/sinks/internal/jvm/datalake/DataLakeSink.java
+++ b/streampipes-extensions/streampipes-sinks-internal-jvm/src/main/java/org/apache/streampipes/sinks/internal/jvm/datalake/DataLakeSink.java
@@ -166,8 +166,9 @@ public class DataLakeSink implements IStreamPipesDataSink, SupportsRuntimeConfig
private RetentionTimeConfig getRetentionTime(String measureName, IStreamPipesClient client){
+ // TODO
IDataExplorerSchemaManagement dataExplorerSchemaManagement = new DataExplorerDispatcher().getDataExplorerManager()
- .getSchemaManagement();
+ .getSchemaManagement(null);
var originalMeasure = dataExplorerSchemaManagement.getExistingMeasureByName(measureName);
diff --git a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/pipeline/update/ChartSchemaUpdateCoordinator.java b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/pipeline/update/ChartSchemaUpdateCoordinator.java
index b7d2272f50..1e26ea6e20 100644
--- a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/pipeline/update/ChartSchemaUpdateCoordinator.java
+++ b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/pipeline/update/ChartSchemaUpdateCoordinator.java
@@ -27,7 +27,6 @@ import org.apache.streampipes.model.schema.EventProperty;
import org.apache.streampipes.model.schema.EventSchema;
import org.apache.streampipes.serializers.json.JacksonSerializer;
import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
-import org.apache.streampipes.storage.management.StorageDispatcher;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -56,11 +55,7 @@ public class ChartSchemaUpdateCoordinator {
private final IDataExplorerWidgetStorage widgetStorage;
private final ObjectMapper objectMapper;
- public ChartSchemaUpdateCoordinator() {
- this(StorageDispatcher.INSTANCE.getNoSqlStore().getDataExplorerWidgetStorage());
- }
-
- ChartSchemaUpdateCoordinator(IDataExplorerWidgetStorage widgetStorage) {
+ public ChartSchemaUpdateCoordinator(IDataExplorerWidgetStorage widgetStorage) {
this.widgetStorage = widgetStorage;
this.objectMapper = JacksonSerializer.getObjectMapper();
}
diff --git a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/pipeline/update/DataStreamUpdateManagement.java b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/pipeline/update/DataStreamUpdateManagement.java
index f4f51d2ee1..452b0e7678 100644
--- a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/pipeline/update/DataStreamUpdateManagement.java
+++ b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/pipeline/update/DataStreamUpdateManagement.java
@@ -31,9 +31,10 @@ public class DataStreamUpdateManagement {
private final DataStreamResourceManager dataStreamResourceManager;
private final PipelineUpdateCoordinator pipelineUpdateCoordinator;
- public DataStreamUpdateManagement(ExtensionServiceRequestManager requestManager) {
+ public DataStreamUpdateManagement(ExtensionServiceRequestManager requestManager,
+ ChartSchemaUpdateCoordinator chartSchemaUpdateCoordinator) {
this.dataStreamResourceManager = new SpResourceManager().manageDataStreams();
- this.pipelineUpdateCoordinator = new PipelineUpdateCoordinator(requestManager);
+ this.pipelineUpdateCoordinator = new PipelineUpdateCoordinator(requestManager, chartSchemaUpdateCoordinator);
}
public void updateDataStream(SpDataStream dataStream) {
diff --git a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/pipeline/update/MeasurementUpdateManagement.java b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/pipeline/update/MeasurementUpdateManagement.java
index 5d253a6738..e5cf7a078c 100644
--- a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/pipeline/update/MeasurementUpdateManagement.java
+++ b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/pipeline/update/MeasurementUpdateManagement.java
@@ -36,11 +36,7 @@ public class MeasurementUpdateManagement {
private final ChartSchemaUpdateCoordinator chartSchemaUpdateCoordinator;
- public MeasurementUpdateManagement() {
- this(new ChartSchemaUpdateCoordinator());
- }
-
- MeasurementUpdateManagement(ChartSchemaUpdateCoordinator chartSchemaUpdateCoordinator) {
+ public MeasurementUpdateManagement(ChartSchemaUpdateCoordinator chartSchemaUpdateCoordinator) {
this.chartSchemaUpdateCoordinator = chartSchemaUpdateCoordinator;
}
diff --git a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/pipeline/update/PipelineUpdateCoordinator.java b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/pipeline/update/PipelineUpdateCoordinator.java
index c71d241607..5a33381e50 100644
--- a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/pipeline/update/PipelineUpdateCoordinator.java
+++ b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/pipeline/update/PipelineUpdateCoordinator.java
@@ -52,11 +52,7 @@ public class PipelineUpdateCoordinator {
private final ExtensionServiceRequestManager requestManager;
private final ChartSchemaUpdateCoordinator chartSchemaUpdateCoordinator;
- public PipelineUpdateCoordinator(ExtensionServiceRequestManager requestManager) {
- this(requestManager, new ChartSchemaUpdateCoordinator());
- }
-
- PipelineUpdateCoordinator(ExtensionServiceRequestManager requestManager,
+ public PipelineUpdateCoordinator(ExtensionServiceRequestManager requestManager,
ChartSchemaUpdateCoordinator chartSchemaUpdateCoordinator) {
this.requestManager = requestManager;
this.chartSchemaUpdateCoordinator = chartSchemaUpdateCoordinator;
diff --git a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataExplorerResourceManager.java b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataExplorerResourceManager.java
index 2a5d2fc65d..f2ca5eff70 100644
--- a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataExplorerResourceManager.java
+++ b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataExplorerResourceManager.java
@@ -22,6 +22,7 @@ import org.apache.streampipes.model.dashboard.DashboardModel;
import org.apache.streampipes.model.dashboard.DashboardSummaryDto;
import org.apache.streampipes.model.datalake.DataExplorerWidgetModel;
import org.apache.streampipes.model.resource.ResourceSummaryDto;
+import org.apache.streampipes.storage.api.explorer.IDataExplorerDashboardStorage;
import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
import org.apache.streampipes.storage.api.explorer.IDataLakeMeasureStorage;
import org.apache.streampipes.storage.management.StorageDispatcher;
@@ -36,10 +37,20 @@ public class DataExplorerResourceManager extends CrudResourceManager<DashboardMo
private final IDataExplorerWidgetStorage widgetStorage;
private final IDataLakeMeasureStorage dataLakeMeasureStorage;
- public DataExplorerResourceManager() {
- super(StorageDispatcher.INSTANCE.getNoSqlStore().getDataExplorerDashboardStorage(), DashboardModel.class);
- this.widgetStorage = StorageDispatcher.INSTANCE.getNoSqlStore().getDataExplorerWidgetStorage();
- this.dataLakeMeasureStorage = StorageDispatcher.INSTANCE.getNoSqlStore().getDataLakeStorage();
+ public DataExplorerResourceManager(IDataExplorerWidgetStorage widgetStorage) {
+ this(
+ StorageDispatcher.INSTANCE.getNoSqlStore().getDataExplorerDashboardStorage(),
+ widgetStorage,
+ StorageDispatcher.INSTANCE.getNoSqlStore().getDataLakeStorage()
+ );
+ }
+
+ private DataExplorerResourceManager(IDataExplorerDashboardStorage dashboardStorage,
+ IDataExplorerWidgetStorage widgetStorage,
+ IDataLakeMeasureStorage dataLakeMeasureStorage) {
+ super(dashboardStorage, DashboardModel.class);
+ this.widgetStorage = widgetStorage;
+ this.dataLakeMeasureStorage = dataLakeMeasureStorage;
}
public ResourceSummaryDto<DashboardSummaryDto> getSummary(Authentication auth) {
diff --git a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/SpResourceManager.java b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/SpResourceManager.java
index 294f9ddb1b..4c17a82856 100644
--- a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/SpResourceManager.java
+++ b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/SpResourceManager.java
@@ -33,10 +33,6 @@ public class SpResourceManager {
return new AdapterDescriptionResourceManager();
}
- public DataExplorerResourceManager manageDataExplorer() {
- return new DataExplorerResourceManager();
- }
-
public DataExplorerWidgetResourceManager manageDataExplorerWidget(DataExplorerResourceManager dashboardManager,
IDataExplorerWidgetStorage db) {
return new DataExplorerWidgetResourceManager(dashboardManager, db);
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/ResetManagement.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/ResetManagement.java
index 61eaa3bbad..7d09e19c6a 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/ResetManagement.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/ResetManagement.java
@@ -29,12 +29,14 @@ import org.apache.streampipes.manager.file.FileManager;
import org.apache.streampipes.manager.pipeline.PipelineCacheManager;
import org.apache.streampipes.manager.pipeline.PipelineCanvasMetadataCacheManager;
import org.apache.streampipes.manager.pipeline.PipelineManager;
+import org.apache.streampipes.manager.pipeline.update.ChartSchemaUpdateCoordinator;
import org.apache.streampipes.model.connect.adapter.AdapterDescription;
import org.apache.streampipes.model.datalake.DataLakeMeasure;
import org.apache.streampipes.model.file.FileMetadata;
import org.apache.streampipes.model.pipeline.Pipeline;
import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.resource.management.UserResourceManager;
+import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
import org.apache.streampipes.storage.api.system.IExtensionsServiceStorage;
import org.apache.streampipes.storage.api.system.IGenericStorage;
import org.apache.streampipes.storage.management.StorageDispatcher;
@@ -51,6 +53,23 @@ public class ResetManagement {
// dependency between this package and streampipes-pipeline-management
// See in issue [STREAMPIPES-405]
+ private final IDataExplorerWidgetStorage widgetStorage;
+ private final WorkerRestClient workerRestClient;
+ private final IExtensionsServiceStorage extensionsServiceStorage;
+ private final ExtensionServiceRequestManager requestManager;
+ private final ChartSchemaUpdateCoordinator chartSchemaUpdateCoordinator;
+
+ public ResetManagement(IDataExplorerWidgetStorage widgetStorage,
+ WorkerRestClient workerRestClient,
+ IExtensionsServiceStorage extensionsServiceStorage,
+ ExtensionServiceRequestManager requestManager) {
+ this.widgetStorage = widgetStorage;
+ this.workerRestClient = workerRestClient;
+ this.extensionsServiceStorage = extensionsServiceStorage;
+ this.requestManager = requestManager;
+ this.chartSchemaUpdateCoordinator = new ChartSchemaUpdateCoordinator(widgetStorage);
+ }
+
private static final Logger logger = LoggerFactory.getLogger(ResetManagement.class);
/**
@@ -59,10 +78,7 @@ public class ResetManagement {
*
* @param username of the user to delte the resources
*/
- public static void reset(String username,
- WorkerRestClient workerRestClient,
- IExtensionsServiceStorage extensionsServiceStorage,
- ExtensionServiceRequestManager requestManager) {
+ public void reset(String username) {
logger.info("Start resetting the system");
setHideTutorialToFalse(username);
@@ -77,7 +93,7 @@ public class ResetManagement {
removeAllDataInDataLake();
- removeAllDataViewWidgets();
+ removeAllDataViewWidgets(widgetStorage);
removeAllDataViews();
@@ -90,16 +106,16 @@ public class ResetManagement {
logger.info("Resetting the system was completed");
}
- private static void setHideTutorialToFalse(String username) {
+ private void setHideTutorialToFalse(String username) {
UserResourceManager.setHideTutorial(username, true);
}
- private static void clearPipelineAssemblyCache(String username) {
+ private void clearPipelineAssemblyCache(String username) {
PipelineCacheManager.removeCachedPipeline(username);
PipelineCanvasMetadataCacheManager.removeCanvasMetadataFromCache(username);
}
- private static void stopAndDeleteAllPipelines(ExtensionServiceRequestManager requestManager) {
+ private void stopAndDeleteAllPipelines(ExtensionServiceRequestManager requestManager) {
List<Pipeline> allPipelines = PipelineManager.getAllPipelines();
allPipelines.forEach(pipeline -> {
PipelineManager.stopPipeline(pipeline.getPipelineId(), true, requestManager);
@@ -107,7 +123,7 @@ public class ResetManagement {
});
}
- private static void stopAndDeleteAllAdapters(WorkerRestClient workerRestClient,
+ private void stopAndDeleteAllAdapters(WorkerRestClient workerRestClient,
IExtensionsServiceStorage extensionsServiceStorage,
ExtensionServiceRequestManager requestManager) {
AdapterMasterManagement adapterMasterManagement = new AdapterMasterManagement(
@@ -131,16 +147,16 @@ public class ResetManagement {
});
}
- private static void deleteAllFiles() {
+ private void deleteAllFiles() {
var fileManager = new FileManager();
List<FileMetadata> allFiles = fileManager.getAllFiles();
allFiles.forEach(fileMetadata -> fileManager.deleteFile(fileMetadata.getFileId()));
}
- private static void removeAllDataInDataLake() {
+ private void removeAllDataInDataLake() {
var dataLakeMeasureManagement = new DataExplorerDispatcher()
.getDataExplorerManager()
- .getSchemaManagement();
+ .getSchemaManagement(chartSchemaUpdateCoordinator);
var dataExplorerQueryManagement = new DataExplorerDispatcher()
.getDataExplorerManager()
.getQueryManagement(dataLakeMeasureManagement);
@@ -154,15 +170,12 @@ public class ResetManagement {
});
}
- private static void removeAllDataViewWidgets() {
- var widgetStorage =
- StorageDispatcher.INSTANCE.getNoSqlStore()
- .getDataExplorerWidgetStorage();
+ private void removeAllDataViewWidgets(IDataExplorerWidgetStorage widgetStorage) {
widgetStorage.findAll()
.forEach(widget -> widgetStorage.deleteElementById(widget.getElementId()));
}
- private static void removeAllDataViews() {
+ private void removeAllDataViews() {
var dataLakeDashboardStorage =
StorageDispatcher.INSTANCE.getNoSqlStore()
.getDataExplorerDashboardStorage();
@@ -170,7 +183,7 @@ public class ResetManagement {
.forEach(dashboard -> dataLakeDashboardStorage.deleteElementById(dashboard.getElementId()));
}
- private static void removeAllAssets(String username) {
+ private void removeAllAssets(String username) {
IGenericStorage genericStorage = StorageDispatcher.INSTANCE.getNoSqlStore()
.getGenericStorage();
try {
@@ -182,7 +195,7 @@ public class ResetManagement {
}
}
- private static void removeAllPipelineTemplates() {
+ private void removeAllPipelineTemplates() {
var pipelineElementTemplateStorage = StorageDispatcher
.INSTANCE
.getNoSqlStore()
@@ -194,7 +207,7 @@ public class ResetManagement {
}
- private static void clearGenericStorage() {
+ private void clearGenericStorage() {
var appDocTypesToDelete = List.of(
"asset-management",
"asset-sites",
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineResource.java
index 1ccfa70fb3..f88a28c4ea 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineResource.java
@@ -24,6 +24,7 @@ import org.apache.streampipes.manager.execution.status.PipelineStatusManager;
import org.apache.streampipes.manager.matching.PipelineVerificationHandlerV2;
import org.apache.streampipes.manager.pipeline.PipelineManager;
import org.apache.streampipes.manager.pipeline.compact.CompactPipelineManagement;
+import org.apache.streampipes.manager.pipeline.update.ChartSchemaUpdateCoordinator;
import org.apache.streampipes.manager.pipeline.update.MeasurementUpdateManagement;
import org.apache.streampipes.manager.recommender.ElementRecommender;
import org.apache.streampipes.manager.storage.PipelineStorageService;
@@ -46,6 +47,7 @@ import org.apache.streampipes.resource.management.PipelineResourceManager;
import org.apache.streampipes.rest.core.base.impl.AbstractAuthGuardedRestResource;
import org.apache.streampipes.rest.shared.exception.SpMessageException;
import org.apache.streampipes.rest.shared.exception.SpNotificationException;
+import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
import org.apache.streampipes.storage.management.StorageDispatcher;
import com.google.gson.JsonSyntaxException;
@@ -89,14 +91,19 @@ public class PipelineResource extends AbstractAuthGuardedRestResource {
private final CompactPipelineManagement compactPipelineManagement;
private final ExtensionServiceRequestManager requestManager;
private final MeasurementUpdateManagement measurementUpdateManagement;
+ private final IDataExplorerWidgetStorage chartStorage;
- public PipelineResource(ExtensionServiceRequestManager requestManager) {
+ public PipelineResource(ExtensionServiceRequestManager requestManager,
+ IDataExplorerWidgetStorage chartStorage) {
this.compactPipelineManagement = new CompactPipelineManagement(
StorageDispatcher.INSTANCE.getNoSqlStore().getPipelineElementDescriptionStorage(),
requestManager
);
this.requestManager = requestManager;
- this.measurementUpdateManagement = new MeasurementUpdateManagement();
+ this.chartStorage = chartStorage;
+ this.measurementUpdateManagement = new MeasurementUpdateManagement(
+ new ChartSchemaUpdateCoordinator(chartStorage)
+ );
}
@GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/ResetResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/ResetResource.java
index 26e8431326..210f82595e 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/ResetResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/ResetResource.java
@@ -20,13 +20,13 @@ package org.apache.streampipes.rest.impl;
import org.apache.streampipes.connect.management.management.WorkerRestClient;
import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequestManager;
-import org.apache.streampipes.model.client.user.Principal;
import org.apache.streampipes.model.client.user.PrincipalType;
import org.apache.streampipes.model.message.Notifications;
import org.apache.streampipes.model.message.SuccessMessage;
import org.apache.streampipes.rest.ResetManagement;
import org.apache.streampipes.rest.core.base.impl.AbstractAuthGuardedRestResource;
import org.apache.streampipes.rest.security.AuthConstants;
+import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
import org.apache.streampipes.storage.api.system.IExtensionsServiceStorage;
import org.apache.streampipes.storage.management.StorageDispatcher;
@@ -47,30 +47,30 @@ import java.util.ArrayList;
@PreAuthorize(AuthConstants.IS_ADMIN_ROLE)
public class ResetResource extends AbstractAuthGuardedRestResource {
- private final WorkerRestClient workerRestClient;
- private final IExtensionsServiceStorage extensionsServiceStorage;
- private final ExtensionServiceRequestManager requestManager;
+ private final ResetManagement resetManagement;
public ResetResource(WorkerRestClient workerRestClient,
- ExtensionServiceRequestManager requestManager) {
- this.workerRestClient = workerRestClient;
- this.extensionsServiceStorage = StorageDispatcher.INSTANCE.getNoSqlStore().getExtensionsServiceStorage();
- this.requestManager = requestManager;
+ ExtensionServiceRequestManager requestManager,
+ IDataExplorerWidgetStorage widgetStorage) {
+ IExtensionsServiceStorage extensionsServiceStorage = StorageDispatcher.INSTANCE.getNoSqlStore().getExtensionsServiceStorage();
+ this.resetManagement = new ResetManagement(
+ widgetStorage, workerRestClient, extensionsServiceStorage, requestManager
+ );
}
@PostMapping(produces = MediaType.APPLICATION_JSON_VALUE)
@Operation(summary = "Resets StreamPipes instance")
public ResponseEntity<SuccessMessage> reset() {
- ResetManagement.reset(getAuthenticatedUsername(), workerRestClient, extensionsServiceStorage, requestManager);
+ resetManagement.reset(getAuthenticatedUsername());
var userStorage = getUserStorage();
// Delete all users other than current user (admin) and their resources
- var allUsers = new ArrayList<Principal>(userStorage.getAllUsers());
+ var allUsers = new ArrayList<>(userStorage.getAllUsers());
for (var user : allUsers) {
if (user.getPrincipalType() == PrincipalType.USER_ACCOUNT
&& !user.getPrincipalId().equals(getAuthenticatedUserSid())) {
- ResetManagement.reset(user.getUsername(), workerRestClient, extensionsServiceStorage, requestManager);
+ resetManagement.reset(user.getUsername());
userStorage.deleteUser(user.getPrincipalId());
}
}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/DataExportResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/DataExportResource.java
index f9d1b44905..e6a3fe9ce0 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/DataExportResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/DataExportResource.java
@@ -23,6 +23,7 @@ import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequestMana
import org.apache.streampipes.model.export.ExportConfiguration;
import org.apache.streampipes.rest.core.base.impl.AbstractAuthGuardedRestResource;
import org.apache.streampipes.rest.security.AuthConstants;
+import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
@@ -41,9 +42,12 @@ import java.util.List;
public class DataExportResource extends AbstractAuthGuardedRestResource {
private final ExtensionServiceRequestManager extensionServiceRequestManager;
+ private final IDataExplorerWidgetStorage chartStorage;
- public DataExportResource(ExtensionServiceRequestManager extensionServiceRequestManager) {
+ public DataExportResource(ExtensionServiceRequestManager extensionServiceRequestManager,
+ IDataExplorerWidgetStorage chartStorage) {
this.extensionServiceRequestManager = extensionServiceRequestManager;
+ this.chartStorage = chartStorage;
}
@PostMapping(
@@ -51,7 +55,7 @@ public class DataExportResource extends AbstractAuthGuardedRestResource {
consumes = MediaType.APPLICATION_JSON_VALUE,
produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<ExportConfiguration> getExportPreview(@RequestBody List<String> selectedAssetIds) {
- var exportConfig = ExportManager.getExportPreview(selectedAssetIds, extensionServiceRequestManager);
+ var exportConfig = ExportManager.getExportPreview(selectedAssetIds, extensionServiceRequestManager, chartStorage);
return ok(exportConfig);
}
@@ -60,7 +64,8 @@ public class DataExportResource extends AbstractAuthGuardedRestResource {
consumes = MediaType.APPLICATION_JSON_VALUE,
produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
public ResponseEntity<byte[]> download(@RequestBody ExportConfiguration exportConfiguration) throws IOException {
- var applicationPackage = ExportManager.getExportPackage(exportConfiguration, extensionServiceRequestManager);
+ var applicationPackage = ExportManager
+ .getExportPackage(exportConfiguration, extensionServiceRequestManager, chartStorage);
return ok(applicationPackage);
}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/DataImportResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/DataImportResource.java
index fff47a710c..baadde3df1 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/DataImportResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/DataImportResource.java
@@ -23,6 +23,7 @@ import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequestMana
import org.apache.streampipes.model.export.AssetExportConfiguration;
import org.apache.streampipes.rest.core.base.impl.AbstractAuthGuardedRestResource;
import org.apache.streampipes.rest.security.AuthConstants;
+import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -44,9 +45,12 @@ public class DataImportResource extends AbstractAuthGuardedRestResource {
private static final Logger LOG = LoggerFactory.getLogger(DataImportResource.class);
private final ExtensionServiceRequestManager extensionServiceRequestManager;
+ private final IDataExplorerWidgetStorage chartStorage;
- public DataImportResource(ExtensionServiceRequestManager extensionServiceRequestManager) {
+ public DataImportResource(ExtensionServiceRequestManager extensionServiceRequestManager,
+ IDataExplorerWidgetStorage chartStorage) {
this.extensionServiceRequestManager = extensionServiceRequestManager;
+ this.chartStorage = chartStorage;
}
@PostMapping(
@@ -55,7 +59,7 @@ public class DataImportResource extends AbstractAuthGuardedRestResource {
produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<AssetExportConfiguration> getImportPreview(@RequestPart("file_upload") MultipartFile fileDetail)
throws IOException {
- var importConfig = ImportManager.getImportPreview(fileDetail.getInputStream(), extensionServiceRequestManager);
+ var importConfig = ImportManager.getImportPreview(fileDetail.getInputStream(), extensionServiceRequestManager, chartStorage);
return ok(importConfig);
}
@@ -69,7 +73,8 @@ public class DataImportResource extends AbstractAuthGuardedRestResource {
fileDetail.getInputStream(),
exportConfiguration,
getAuthenticatedUserSid(),
- extensionServiceRequestManager
+ extensionServiceRequestManager,
+ chartStorage
);
return ok();
} catch (IOException e) {
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/connect/AdapterResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/connect/AdapterResource.java
index 689a739033..038e724b21 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/connect/AdapterResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/connect/AdapterResource.java
@@ -26,6 +26,7 @@ import org.apache.streampipes.connect.management.management.CompactAdapterManage
import org.apache.streampipes.connect.management.management.WorkerRestClient;
import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequestManager;
import org.apache.streampipes.manager.pipeline.PipelineManager;
+import org.apache.streampipes.manager.pipeline.update.ChartSchemaUpdateCoordinator;
import org.apache.streampipes.model.client.user.DefaultRole;
import org.apache.streampipes.model.client.user.Permission;
import org.apache.streampipes.model.connect.adapter.AdapterDescription;
@@ -45,6 +46,7 @@ import org.apache.streampipes.rest.event.AdapterDeletedEvent;
import org.apache.streampipes.rest.event.AdapterUpdatedEvent;
import org.apache.streampipes.rest.security.AuthConstants;
import org.apache.streampipes.rest.shared.constants.SpMediaType;
+import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
import org.apache.streampipes.storage.api.pipeline.IPipelineStorage;
import org.apache.streampipes.storage.management.StorageDispatcher;
@@ -79,16 +81,19 @@ public class AdapterResource extends AbstractAdapterResource<AdapterMasterManage
private static final Logger LOG = LoggerFactory.getLogger(AdapterResource.class);
private final ExtensionServiceRequestManager requestManager;
private final ApplicationEventPublisher eventPublisher;
+ private final ChartSchemaUpdateCoordinator chartSchemaUpdateCoordinator;
public AdapterResource(WorkerRestClient workerRestClient,
- ExtensionServiceRequestManager requestManager) {
- this(workerRestClient, requestManager, null);
+ ExtensionServiceRequestManager requestManager,
+ IDataExplorerWidgetStorage chartStorage) {
+ this(workerRestClient, requestManager, null, chartStorage);
}
@Autowired
public AdapterResource(WorkerRestClient workerRestClient,
ExtensionServiceRequestManager requestManager,
- ApplicationEventPublisher eventPublisher) {
+ ApplicationEventPublisher eventPublisher,
+ IDataExplorerWidgetStorage chartStorage) {
super(() -> new AdapterMasterManagement(
StorageDispatcher.INSTANCE.getNoSqlStore()
.getAdapterInstanceStorage(),
@@ -100,6 +105,7 @@ public class AdapterResource extends AbstractAdapterResource<AdapterMasterManage
requestManager));
this.requestManager = requestManager;
this.eventPublisher = eventPublisher;
+ this.chartSchemaUpdateCoordinator = new ChartSchemaUpdateCoordinator(chartStorage);
}
@PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE)
@@ -136,7 +142,7 @@ public class AdapterResource extends AbstractAdapterResource<AdapterMasterManage
@PutMapping(produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
@PreAuthorize("this.hasWriteAuthority() and hasPermission(#adapterDescription.correspondingDataStreamElementId, 'WRITE')")
public ResponseEntity<? extends Message> updateAdapter(@RequestBody AdapterDescription adapterDescription) {
- var updateManager = new AdapterUpdateManagement(managementService, requestManager);
+ var updateManager = new AdapterUpdateManagement(managementService, requestManager, chartSchemaUpdateCoordinator);
try {
updateManager.updateAdapter(adapterDescription);
publishEvent(new AdapterUpdatedEvent(adapterDescription));
@@ -152,7 +158,7 @@ public class AdapterResource extends AbstractAdapterResource<AdapterMasterManage
@PreAuthorize(AuthConstants.HAS_WRITE_ADAPTER_PRIVILEGE)
public ResponseEntity<List<PipelineUpdateInfo>> performPipelineMigrationPreflight(
@RequestBody AdapterDescription adapterDescription) {
- var updateManager = new AdapterUpdateManagement(managementService, requestManager);
+ var updateManager = new AdapterUpdateManagement(managementService, requestManager, chartSchemaUpdateCoordinator);
var migrations = updateManager.checkPipelineMigrations(adapterDescription);
return ok(migrations);
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/connect/CompactAdapterResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/connect/CompactAdapterResource.java
index cb52424c9b..ddff2a5ca4 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/connect/CompactAdapterResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/connect/CompactAdapterResource.java
@@ -30,6 +30,7 @@ import org.apache.streampipes.connect.management.management.WorkerRestClient;
import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequestManager;
import org.apache.streampipes.manager.execution.endpoint.ExtensionsServiceEndpointGenerator;
import org.apache.streampipes.manager.pipeline.compact.CompactPipelineManagement;
+import org.apache.streampipes.manager.pipeline.update.ChartSchemaUpdateCoordinator;
import org.apache.streampipes.model.connect.adapter.AdapterDescription;
import org.apache.streampipes.model.connect.adapter.compact.CompactAdapter;
import org.apache.streampipes.model.message.Notifications;
@@ -37,6 +38,7 @@ import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.rest.shared.constants.SpMediaType;
import org.apache.streampipes.rest.shared.exception.BadRequestException;
import org.apache.streampipes.rest.shared.exception.SpMessageException;
+import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
import org.apache.streampipes.storage.management.StorageDispatcher;
import org.slf4j.Logger;
@@ -62,7 +64,8 @@ public class CompactAdapterResource extends AbstractAdapterResource<AdapterMaste
private final ExtensionServiceRequestManager requestManager;
public CompactAdapterResource(WorkerRestClient workerRestClient,
- ExtensionServiceRequestManager requestManager) {
+ ExtensionServiceRequestManager requestManager,
+ IDataExplorerWidgetStorage chartStorage) {
super(() -> new AdapterMasterManagement(
StorageDispatcher.INSTANCE.getNoSqlStore()
.getAdapterInstanceStorage(),
@@ -81,7 +84,8 @@ public class CompactAdapterResource extends AbstractAdapterResource<AdapterMaste
this.compactAdapterManagement = new CompactAdapterManagement(
new AdapterGenerationSteps(guessManagement).getGenerators()
);
- this.adapterUpdateManagement = new AdapterUpdateManagement(managementService, requestManager);
+ var chartCoordinator = new ChartSchemaUpdateCoordinator(chartStorage);
+ this.adapterUpdateManagement = new AdapterUpdateManagement(managementService, requestManager, chartCoordinator);
}
@PostMapping(
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/DataLakeDashboardResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/DataLakeDashboardResource.java
index f940c21a0e..4e45709926 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/DataLakeDashboardResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/DataLakeDashboardResource.java
@@ -25,6 +25,7 @@ import org.apache.streampipes.model.dashboard.DashboardSummaryDto;
import org.apache.streampipes.model.resource.ResourceSummaryDto;
import org.apache.streampipes.resource.management.DataExplorerResourceManager;
import org.apache.streampipes.rest.core.base.impl.AbstractAuthGuardedRestResource;
+import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
import org.apache.streampipes.storage.api.user.IPermissionStorage;
import org.springframework.http.CacheControl;
@@ -51,9 +52,11 @@ import java.util.Objects;
public class DataLakeDashboardResource extends AbstractAuthGuardedRestResource {
private final IPermissionStorage permissionStorage;
+ private final IDataExplorerWidgetStorage chartStorage;
- public DataLakeDashboardResource() {
+ public DataLakeDashboardResource(IDataExplorerWidgetStorage chartStorage) {
this.permissionStorage = getNoSqlStorage().getPermissionStorage();
+ this.chartStorage = chartStorage;
}
@GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
@@ -119,7 +122,7 @@ public class DataLakeDashboardResource extends AbstractAuthGuardedRestResource {
private DataExplorerResourceManager getResourceManager() {
- return getSpResourceManager().manageDataExplorer();
+ return new DataExplorerResourceManager(chartStorage);
}
public boolean hasReadAuthority() {
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/AbstractDataLakeResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/AbstractDataLakeResource.java
index 87e3a8aa5b..b24717c1bd 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/AbstractDataLakeResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/AbstractDataLakeResource.java
@@ -19,6 +19,7 @@ package org.apache.streampipes.rest.impl.datalake;
import org.apache.streampipes.dataexplorer.api.IDataExplorerSchemaManagement;
import org.apache.streampipes.dataexplorer.management.DataExplorerDispatcher;
+import org.apache.streampipes.manager.pipeline.update.ChartSchemaUpdateCoordinator;
import org.apache.streampipes.model.client.user.DefaultPrivilege;
import org.apache.streampipes.resource.management.permission.SpPermissionEvaluator;
import org.apache.streampipes.rest.core.base.impl.AbstractAuthGuardedRestResource;
@@ -34,12 +35,12 @@ public class AbstractDataLakeResource extends AbstractAuthGuardedRestResource {
final IDataExplorerSchemaManagement dataLakeMeasureManagement;
private final IDataLakeMeasureStorage dataLakeMeasureStorage =
StorageDispatcher.INSTANCE.getNoSqlStore().getDataLakeStorage();
+ protected final ChartSchemaUpdateCoordinator chartSchemaUpdateCoordinator;
-
-
- public AbstractDataLakeResource() {
+ public AbstractDataLakeResource(ChartSchemaUpdateCoordinator chartSchemaUpdateCoordinator) {
+ this.chartSchemaUpdateCoordinator = chartSchemaUpdateCoordinator;
this.dataLakeMeasureManagement = new DataExplorerDispatcher().getDataExplorerManager()
- .getSchemaManagement();
+ .getSchemaManagement(chartSchemaUpdateCoordinator);
}
/**
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeMeasureResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeMeasureResource.java
index 5f94ed50c3..41d9b19993 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeMeasureResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeMeasureResource.java
@@ -19,11 +19,13 @@
package org.apache.streampipes.rest.impl.datalake;
import org.apache.streampipes.dataexplorer.management.DataExplorerDispatcher;
+import org.apache.streampipes.manager.pipeline.update.ChartSchemaUpdateCoordinator;
import org.apache.streampipes.model.datalake.DataLakeMeasure;
import org.apache.streampipes.model.datalake.DatasetSummaryDto;
import org.apache.streampipes.model.monitoring.SpLogMessage;
import org.apache.streampipes.model.resource.ResourceSummaryDto;
import org.apache.streampipes.resource.management.DataLakeMeasureResourceManager;
+import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
@@ -49,8 +51,8 @@ import java.util.Objects;
@RequestMapping("/api/v4/datalake/measure")
public class DataLakeMeasureResource extends AbstractDataLakeResource {
- public DataLakeMeasureResource() {
- super();
+ public DataLakeMeasureResource(IDataExplorerWidgetStorage chartStorage) {
+ super(new ChartSchemaUpdateCoordinator(chartStorage));
}
@GetMapping(path = "/summary", produces = MediaType.APPLICATION_JSON_VALUE)
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeResource.java
index df2ff38dee..1d6dd96d83 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeResource.java
@@ -23,6 +23,7 @@ import org.apache.streampipes.dataexplorer.api.IDataExplorerQueryManagement;
import org.apache.streampipes.dataexplorer.export.OutputFormat;
import org.apache.streampipes.dataexplorer.management.DataExplorerDispatcher;
import org.apache.streampipes.export.DataLakeExportManager;
+import org.apache.streampipes.manager.pipeline.update.ChartSchemaUpdateCoordinator;
import org.apache.streampipes.model.datalake.DataLakeMeasure;
import org.apache.streampipes.model.datalake.DataSeries;
import org.apache.streampipes.model.datalake.RetentionTimeConfig;
@@ -32,6 +33,7 @@ import org.apache.streampipes.model.message.Notifications;
import org.apache.streampipes.model.monitoring.SpLogMessage;
import org.apache.streampipes.rest.security.AuthConstants;
import org.apache.streampipes.rest.shared.exception.SpMessageException;
+import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
@@ -93,18 +95,14 @@ public class DataLakeResource extends AbstractDataLakeResource {
private static final Logger LOG = LoggerFactory.getLogger(DataLakeResource.class);
private final IDataExplorerQueryManagement dataExplorerQueryManagement;
- private static DataLakeExportManager dataLakeExportManager = new DataLakeExportManager();
+ private final DataLakeExportManager dataLakeExportManager;
- public DataLakeResource() {
- super();
+ public DataLakeResource(IDataExplorerWidgetStorage chartStorage) {
+ super(new ChartSchemaUpdateCoordinator(chartStorage));
this.dataExplorerQueryManagement = new DataExplorerDispatcher()
.getDataExplorerManager()
.getQueryManagement(this.dataLakeMeasureManagement);
- }
-
- public DataLakeResource(IDataExplorerQueryManagement dataExplorerQueryManagement) {
- super();
- this.dataExplorerQueryManagement = dataExplorerQueryManagement;
+ this.dataLakeExportManager = new DataLakeExportManager(this.dataLakeMeasureManagement, dataExplorerQueryManagement);
}
@DeleteMapping(path = "/measurements/{measurementName}")
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeWidgetResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeWidgetResource.java
index ca2ebe4222..0e8501d954 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeWidgetResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeWidgetResource.java
@@ -28,6 +28,7 @@ import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.rest.core.base.impl.AbstractAuthGuardedRestResource;
import org.apache.streampipes.rest.security.AuthConstants;
import org.apache.streampipes.rest.shared.exception.BadRequestException;
+import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
@@ -50,10 +51,10 @@ public class DataLakeWidgetResource extends AbstractAuthGuardedRestResource {
private final DataExplorerWidgetResourceManager resourceManager;
- public DataLakeWidgetResource() {
+ public DataLakeWidgetResource(IDataExplorerWidgetStorage dataExplorerWidgetStorage) {
this.resourceManager = new SpResourceManager().manageDataExplorerWidget(
- new DataExplorerResourceManager(),
- getNoSqlStorage().getDataExplorerWidgetStorage()
+ new DataExplorerResourceManager(dataExplorerWidgetStorage),
+ dataExplorerWidgetStorage
);
}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/KioskDashboardDataLakeResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/KioskDashboardDataLakeResource.java
index 35f82f08f4..ada7f5a0d8 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/KioskDashboardDataLakeResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/KioskDashboardDataLakeResource.java
@@ -21,6 +21,7 @@ package org.apache.streampipes.rest.impl.datalake;
import org.apache.streampipes.dataexplorer.api.IDataExplorerQueryManagement;
import org.apache.streampipes.dataexplorer.api.IDataExplorerSchemaManagement;
import org.apache.streampipes.dataexplorer.management.DataExplorerDispatcher;
+import org.apache.streampipes.manager.pipeline.update.ChartSchemaUpdateCoordinator;
import org.apache.streampipes.model.client.user.DefaultPrivilege;
import org.apache.streampipes.model.datalake.DataExplorerWidgetModel;
import org.apache.streampipes.model.datalake.SpQueryResult;
@@ -49,22 +50,19 @@ import java.util.Map;
public class KioskDashboardDataLakeResource extends AbstractAuthGuardedRestResource {
private final IDataExplorerQueryManagement dataExplorerQueryManagement;
- private final IDataExplorerSchemaManagement dataExplorerSchemaManagement;
private final IDataExplorerDashboardStorage dashboardStorage =
StorageDispatcher.INSTANCE.getNoSqlStore().getDataExplorerDashboardStorage();
private final IDataExplorerWidgetStorage dataExplorerWidgetStorage;
private final IPermissionStorage permissionStorage;
- public KioskDashboardDataLakeResource() {
- this.dataExplorerSchemaManagement = new DataExplorerDispatcher()
+ public KioskDashboardDataLakeResource(IDataExplorerWidgetStorage dataExplorerWidgetStorage) {
+ IDataExplorerSchemaManagement dataExplorerSchemaManagement = new DataExplorerDispatcher()
.getDataExplorerManager()
- .getSchemaManagement();
+ .getSchemaManagement(new ChartSchemaUpdateCoordinator(dataExplorerWidgetStorage));
this.dataExplorerQueryManagement = new DataExplorerDispatcher()
.getDataExplorerManager()
- .getQueryManagement(this.dataExplorerSchemaManagement);
- this.dataExplorerWidgetStorage = StorageDispatcher.INSTANCE
- .getNoSqlStore()
- .getDataExplorerWidgetStorage();
+ .getQueryManagement(dataExplorerSchemaManagement);
+ this.dataExplorerWidgetStorage = dataExplorerWidgetStorage;
this.permissionStorage = getNoSqlStorage().getPermissionStorage();
}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/importer/DataLakeImportResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/importer/DataLakeImportResource.java
index 7fde0ca48a..54a9840f3c 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/importer/DataLakeImportResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/importer/DataLakeImportResource.java
@@ -18,6 +18,7 @@
package org.apache.streampipes.rest.impl.datalake.importer;
+import org.apache.streampipes.manager.pipeline.update.ChartSchemaUpdateCoordinator;
import org.apache.streampipes.model.datalake.importer.CsvImportPreviewRequest;
import org.apache.streampipes.model.datalake.importer.CsvImportPreviewResult;
import org.apache.streampipes.model.datalake.importer.CsvImportRequest;
@@ -26,6 +27,7 @@ import org.apache.streampipes.model.datalake.importer.CsvImportSchemaValidationR
import org.apache.streampipes.model.datalake.importer.CsvImportSchemaValidationResult;
import org.apache.streampipes.model.datalake.importer.CsvImportTargetMode;
import org.apache.streampipes.rest.impl.datalake.AbstractDataLakeResource;
+import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
@@ -46,8 +48,8 @@ public class DataLakeImportResource extends AbstractDataLakeResource {
private final CsvDataLakeImportService importService;
- public DataLakeImportResource() {
- super();
+ public DataLakeImportResource(IDataExplorerWidgetStorage chartStorage) {
+ super(new ChartSchemaUpdateCoordinator(chartStorage));
this.importService = new CsvDataLakeImportService(getDataLakeMeasureManagement());
}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/pe/DataStreamResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/pe/DataStreamResource.java
index 3ed8bd5bcd..0ac52a394a 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/pe/DataStreamResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/pe/DataStreamResource.java
@@ -19,6 +19,7 @@
package org.apache.streampipes.rest.impl.pe;
import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequestManager;
+import org.apache.streampipes.manager.pipeline.update.ChartSchemaUpdateCoordinator;
import org.apache.streampipes.manager.pipeline.update.DataStreamUpdateManagement;
import org.apache.streampipes.model.SpDataStream;
import org.apache.streampipes.model.connect.adapter.PipelineUpdateInfo;
@@ -30,6 +31,7 @@ import org.apache.streampipes.rest.core.base.impl.AbstractAuthGuardedRestResourc
import org.apache.streampipes.rest.event.DataStreamDeletedEvent;
import org.apache.streampipes.rest.event.DataStreamUpdatedEvent;
import org.apache.streampipes.rest.security.AuthConstants;
+import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
import org.apache.http.client.HttpResponseException;
import org.springframework.context.ApplicationEventPublisher;
@@ -56,8 +58,11 @@ public class DataStreamResource extends AbstractAuthGuardedRestResource {
private final ApplicationEventPublisher eventPublisher;
public DataStreamResource(ExtensionServiceRequestManager requestManager,
- ApplicationEventPublisher eventPublisher) {
- this.dataStreamUpdateManagement = new DataStreamUpdateManagement(requestManager);
+ ApplicationEventPublisher eventPublisher,
+ IDataExplorerWidgetStorage chartStorage) {
+ this.dataStreamUpdateManagement = new DataStreamUpdateManagement(
+ requestManager,
+ new ChartSchemaUpdateCoordinator(chartStorage));
this.eventPublisher = eventPublisher;
}
diff --git a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/StreamPipesCoreApplication.java b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/StreamPipesCoreApplication.java
index 33e8726054..abf883b470 100644
--- a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/StreamPipesCoreApplication.java
+++ b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/StreamPipesCoreApplication.java
@@ -59,6 +59,7 @@ import org.apache.streampipes.service.core.migrations.AvailableMigrations;
import org.apache.streampipes.service.core.migrations.Migration;
import org.apache.streampipes.service.core.migrations.MigrationsHandler;
import org.apache.streampipes.service.core.storage.StorageApiConfiguration;
+import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
import org.apache.streampipes.storage.api.function.IFunctionStateStorage;
import org.apache.streampipes.storage.api.pipeline.IPipelineStorage;
import org.apache.streampipes.storage.api.system.IExtensionsServiceStorage;
@@ -114,6 +115,9 @@ public class StreamPipesCoreApplication extends StreamPipesServiceBase {
@Autowired
private WorkerRestClient workerRestClient;
+ @Autowired
+ protected IDataExplorerWidgetStorage chartStorage;
+
private final IExtensionsServiceStorage extensionsServiceStorage =
StorageDispatcher.INSTANCE.getNoSqlStore().getExtensionsServiceStorage();
@@ -237,7 +241,7 @@ public class StreamPipesCoreApplication extends StreamPipesServiceBase {
}
protected List<Migration> getMigrations() {
- return new AvailableMigrations().getAvailableMigrations();
+ return new AvailableMigrations(chartStorage).getAvailableMigrations();
}
private boolean isConfigured() {
diff --git a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/AvailableMigrations.java b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/AvailableMigrations.java
index ad093e185e..4c89b7e0be 100644
--- a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/AvailableMigrations.java
+++ b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/AvailableMigrations.java
@@ -39,19 +39,26 @@ import org.apache.streampipes.service.core.migrations.v099.RemoveInternalNotific
import org.apache.streampipes.service.core.migrations.v099.RemoveObsoletePrivilegesMigration;
import org.apache.streampipes.service.core.migrations.v099.UniqueDashboardIdMigration;
import org.apache.streampipes.service.core.migrations.v099.connect.MigrateAdaptersToUseScript;
+import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
import java.util.Arrays;
import java.util.List;
public class AvailableMigrations {
+ private final IDataExplorerWidgetStorage chartStorage;
+
+ public AvailableMigrations(IDataExplorerWidgetStorage chartStorage) {
+ this.chartStorage = chartStorage;
+ }
+
public List<Migration> getAvailableMigrations() {
return Arrays.asList(
new ModifyAssetLinksMigration(),
new ModifyAssetLinkTypesMigration(),
new AddDataLakeMeasureViewMigration(),
new AddDefaultExportProviderMigration(),
- new FixImportedPermissionsMigration(),
+ new FixImportedPermissionsMigration(chartStorage),
new AddAssetManagementViewMigration(),
new MoveAssetContentMigration(),
new CreateAssetPermissionMigration(),
diff --git a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v0980/FixImportedPermissionsMigration.java b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v0980/FixImportedPermissionsMigration.java
index 27e654f027..9fc98e05b0 100644
--- a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v0980/FixImportedPermissionsMigration.java
+++ b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v0980/FixImportedPermissionsMigration.java
@@ -20,6 +20,7 @@ package org.apache.streampipes.service.core.migrations.v0980;
import org.apache.streampipes.model.shared.api.Storable;
import org.apache.streampipes.service.core.migrations.Migration;
+import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
import org.apache.streampipes.storage.api.user.IPermissionStorage;
import org.apache.streampipes.storage.management.StorageDispatcher;
@@ -35,6 +36,12 @@ import java.util.List;
*/
public class FixImportedPermissionsMigration implements Migration {
+ private final IDataExplorerWidgetStorage chartStorage;
+
+ public FixImportedPermissionsMigration(IDataExplorerWidgetStorage chartStorage) {
+ this.chartStorage = chartStorage;
+ }
+
private static final Logger LOG = LoggerFactory.getLogger(FixImportedPermissionsMigration.class);
private final IPermissionStorage permissionStorage =
@@ -65,10 +72,7 @@ public class FixImportedPermissionsMigration implements Migration {
private void migrateChartsPermissions() {
LOG.debug("Start migrate permissions for charts");
- var dataExplorerWidgetStorage = StorageDispatcher.INSTANCE
- .getNoSqlStore()
- .getDataExplorerWidgetStorage();
- var charts = dataExplorerWidgetStorage.findAll();
+ var charts = chartStorage.findAll();
migrateResourcePermissions(charts);
LOG.debug("Finished migrate permissions for charts");
}
diff --git a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/scheduler/DataLakeScheduler.java b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/scheduler/DataLakeScheduler.java
index 229ea35eaf..3c2522234d 100644
--- a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/scheduler/DataLakeScheduler.java
+++ b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/scheduler/DataLakeScheduler.java
@@ -21,7 +21,9 @@ import org.apache.streampipes.commons.environment.Environments;
import org.apache.streampipes.dataexplorer.api.IDataExplorerSchemaManagement;
import org.apache.streampipes.dataexplorer.management.DataExplorerDispatcher;
import org.apache.streampipes.export.DataLakeExportManager;
+import org.apache.streampipes.manager.pipeline.update.ChartSchemaUpdateCoordinator;
import org.apache.streampipes.model.datalake.DataLakeMeasure;
+import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -35,12 +37,21 @@ import java.util.List;
@Configuration
public class DataLakeScheduler implements SchedulingConfigurer {
- private static final DataLakeExportManager dataLakeExportManager = new DataLakeExportManager();
- private static final Logger LOG = LoggerFactory.getLogger(DataLakeExportManager.class);
+ private final DataLakeExportManager dataLakeExportManager;
+ private static final Logger LOG = LoggerFactory.getLogger(DataLakeScheduler.class);
- private final IDataExplorerSchemaManagement dataExplorerSchemaManagement = new DataExplorerDispatcher()
+ private final IDataExplorerSchemaManagement dataExplorerSchemaManagement;
+
+ public DataLakeScheduler(IDataExplorerWidgetStorage chartStorage) {
+ var chartSchemaUpdateCoordinator = new ChartSchemaUpdateCoordinator(chartStorage);
+ dataExplorerSchemaManagement = new DataExplorerDispatcher()
.getDataExplorerManager()
- .getSchemaManagement();
+ .getSchemaManagement(chartSchemaUpdateCoordinator);
+ this.dataLakeExportManager = new DataLakeExportManager(
+ dataExplorerSchemaManagement,
+ new DataExplorerDispatcher().getDataExplorerManager()
+ .getQueryManagement(dataExplorerSchemaManagement));
+ }
public void cleanupMeasurements() {
LOG.info("Retention CRON Job triggered.");
@@ -72,4 +83,4 @@ public class DataLakeScheduler implements SchedulingConfigurer {
}
-}
\ No newline at end of file
+}
diff --git a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/storage/StorageApiConfiguration.java b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/storage/StorageApiConfiguration.java
index ae16f2e6ea..8945921de1 100644
--- a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/storage/StorageApiConfiguration.java
+++ b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/storage/StorageApiConfiguration.java
@@ -18,7 +18,9 @@
package org.apache.streampipes.service.core.storage;
+import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
import org.apache.streampipes.storage.api.function.IFunctionStateStorage;
+import org.apache.streampipes.storage.couchdb.impl.explorer.DataExplorerWidgetStorageImpl;
import org.apache.streampipes.storage.couchdb.impl.function.FunctionStateStorageImpl;
import org.springframework.context.annotation.Bean;
@@ -31,4 +33,9 @@ public class StorageApiConfiguration {
public IFunctionStateStorage functionStateStorage() {
return new FunctionStateStorageImpl();
}
+
+ @Bean
+ public IDataExplorerWidgetStorage dataExplorerWidgetStorage() {
+ return new DataExplorerWidgetStorageImpl();
+ }
}
diff --git a/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/core/INoSqlStorage.java b/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/core/INoSqlStorage.java
index 3d616f1449..de4ef4b597 100644
--- a/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/core/INoSqlStorage.java
+++ b/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/core/INoSqlStorage.java
@@ -19,7 +19,6 @@ package org.apache.streampipes.storage.api.core;
import org.apache.streampipes.storage.api.connect.IAdapterStorage;
import org.apache.streampipes.storage.api.explorer.IDataExplorerDashboardStorage;
-import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
import org.apache.streampipes.storage.api.explorer.IDataLakeMeasureStorage;
import org.apache.streampipes.storage.api.pipeline.ICompactPipelineTemplateStorage;
import org.apache.streampipes.storage.api.pipeline.IDataProcessorStorage;
@@ -69,8 +68,6 @@ public interface INoSqlStorage {
IDataExplorerDashboardStorage getDataExplorerDashboardStorage();
- IDataExplorerWidgetStorage getDataExplorerWidgetStorage();
-
IPipelineElementTemplateStorage getPipelineElementTemplateStorage();
IPipelineCanvasMetadataStorage getPipelineCanvasMetadataStorage();
diff --git a/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/CouchDbStorageManager.java b/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/CouchDbStorageManager.java
index b75019c472..6b964775b4 100644
--- a/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/CouchDbStorageManager.java
+++ b/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/CouchDbStorageManager.java
@@ -135,11 +135,6 @@ public class CouchDbStorageManager implements INoSqlStorage {
return new DataExplorerDashboardStorageImpl();
}
- @Override
- public IDataExplorerWidgetStorage getDataExplorerWidgetStorage() {
- return new DataExplorerWidgetStorageImpl();
- }
-
@Override
public IPipelineElementTemplateStorage getPipelineElementTemplateStorage() {
return new PipelineElementTemplateStorageImpl();
(streampipes) 02/04: Add initial cache version, provide resource management from DI
Posted by ri...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
dominikriemer pushed a commit to branch introduce-storage-cache
in repository https://gitbox.apache.org/repos/asf/streampipes.git
commit 07b2105a0c30d1f4ba47cdc800bb6a1328e3a0d8
Author: Dominik Riemer <do...@gmail.com>
AuthorDate: Thu Jun 18 16:24:23 2026 +0200
Add initial cache version, provide resource management from DI
---
.../management/compact/PersistPipelineHandler.java | 15 +-
.../management/AdapterMasterManagement.java | 21 +--
.../management/AdapterMigrationManager.java | 6 +-
.../management/AdapterUpdateManagement.java | 12 +-
.../management/WorkerAdministrationManagement.java | 11 +-
.../management/management/WorkerRestClient.java | 13 +-
.../management/AdapterMasterManagementTest.java | 11 +-
.../management/DataExplorerDispatcher.java | 1 -
.../streampipes/export/AssetLinkResolver.java | 21 ++-
.../apache/streampipes/export/ExportManager.java | 15 +-
.../apache/streampipes/export/ImportManager.java | 20 ++-
.../export/dataimport/PerformImportGenerator.java | 22 +--
.../export/dataimport/PreviewImportGenerator.java | 19 ++-
.../export/generator/ExportPackageGenerator.java | 20 ++-
.../export/resolver/AdapterResolver.java | 10 +-
.../streampipes/export/resolver/ChartResolver.java | 9 +-
.../export/resolver/PipelineResolver.java | 11 +-
.../health/monitoring/ExtensionHealthCheck.java | 13 +-
.../ExtensionInstanceAvailabilityCheck.java | 9 +-
.../health/monitoring/PipelineHealthCheck.java | 15 +-
.../health/monitoring/ServiceHealthCheck.java | 10 +-
.../api/extensions/ExtensionServiceRequests.java | 58 ++++---
.../execution/PipelineExecutionTaskFactory.java | 11 +-
.../manager/execution/PipelineExecutor.java | 11 +-
.../http/BasePipelineElementSubmitter.java | 8 +-
.../execution/http/DetachExtensionRequest.java | 8 +-
.../http/DetachPipelineElementSubmitter.java | 6 +-
.../execution/http/InvokeExtensionRequest.java | 11 +-
.../http/InvokePipelineElementSubmitter.java | 8 +-
.../http/PipelineElementExtensionRequest.java | 6 +-
.../manager/extensions/ExtensionItemInstaller.java | 16 +-
.../manager/function/FunctionManager.java | 8 +-
.../migration/AbstractMigrationManager.java | 11 +-
.../migration/PipelineElementMigrationManager.java | 8 +-
.../pipeline/ExtensionsServiceLogExecutor.java | 8 +-
.../manager/pipeline/PipelineManager.java | 66 ++++----
.../update/DataStreamUpdateManagement.java | 10 +-
.../pipeline/update/PipelineUpdateCoordinator.java | 21 ++-
.../manager/preview/PipelinePreview.java | 11 +-
.../manager/recommender/ElementRecommender.java | 15 +-
.../remote/ContainerProvidedOptionsHandler.java | 4 +-
.../manager/setup/AutoInstallation.java | 9 +-
.../manager/setup/ExtensionsInstallationTask.java | 9 +-
.../manager/setup/InstallationConfiguration.java | 7 +-
.../setup/PipelineElementInstallationStep.java | 8 +-
.../streampipes/manager/util/AuthTokenUtils.java | 22 +--
.../manager/verification/ElementVerifier.java | 15 +-
.../manager/verification/TypedElementVerifier.java | 11 +-
.../verification/extractor/TypeExtractor.java | 14 +-
.../update/PipelineUpdateCoordinatorTest.java | 6 +-
.../manager/verification/TypeExtractorTest.java | 12 +-
.../AbstractPipelineElementResourceManager.java | 11 +-
.../management/AbstractResourceManager.java | 3 +
.../AdapterDescriptionResourceManager.java | 4 +-
.../resource/management/CrudResourceManager.java | 12 +-
.../management/DataExplorerResourceManager.java | 11 +-
.../DataExplorerWidgetResourceManager.java | 5 +-
.../management/DataProcessorResourceManager.java | 4 +-
.../management/DataSinkResourceManager.java | 4 +-
.../management/DataStreamResourceManager.java | 9 +-
.../management/PermissionResourceManager.java | 4 +
.../management/PipelineResourceManager.java | 7 +-
.../resource/management/SpResourceManager.java | 52 ++++--
.../management/DataStreamResourceManagerTest.java | 5 +-
.../rest/core/base/impl/AbstractRestResource.java | 5 -
.../apache/streampipes/rest/ResetManagement.java | 35 ++--
.../rest/impl/AbstractMonitoringResource.java | 8 +-
.../rest/impl/AccountActivationResource.java | 9 +-
.../rest/impl/AdapterMonitoringResource.java | 8 +-
.../rest/impl/AssetManagementResource.java | 32 ++--
.../streampipes/rest/impl/Authentication.java | 12 +-
.../rest/impl/CompactPipelineResource.java | 13 +-
.../streampipes/rest/impl/PipelineMonitoring.java | 8 +-
.../streampipes/rest/impl/PipelineResource.java | 45 +++--
.../streampipes/rest/impl/ResetResource.java | 16 +-
.../rest/impl/RestorePasswordResource.java | 11 +-
.../rest/impl/admin/DataExportResource.java | 21 ++-
.../rest/impl/admin/DataImportResource.java | 21 ++-
.../impl/admin/ExtensionsInstallationResource.java | 33 +++-
.../rest/impl/admin/MigrationResource.java | 12 +-
.../rest/impl/admin/PermissionResource.java | 14 +-
.../rest/impl/connect/AdapterResource.java | 48 ++++--
.../rest/impl/connect/CompactAdapterResource.java | 25 ++-
.../impl/dashboard/DataLakeDashboardResource.java | 32 ++--
.../impl/datalake/DataLakeMeasureResource.java | 15 +-
.../rest/impl/datalake/DataLakeWidgetResource.java | 14 +-
.../datalake/KioskDashboardDataLakeResource.java | 5 +-
.../rest/impl/pe/DataProcessorResource.java | 23 ++-
.../streampipes/rest/impl/pe/DataSinkResource.java | 22 ++-
.../rest/impl/pe/DataStreamResource.java | 32 ++--
.../rest/impl/runtime/PipelinePreviewResource.java | 12 +-
streampipes-service-core/pom.xml | 8 +
.../streampipes/service/core/PostStartupTask.java | 21 +--
.../service/core/StreamPipesCoreApplication.java | 37 ++--
.../ExtensionServiceRequestConfiguration.java | 14 +-
.../core/migrations/AvailableMigrations.java | 14 +-
.../v0980/FixImportedPermissionsMigration.java | 9 +-
.../v099/CreateAssetPermissionMigration.java | 6 +-
.../v099/CreateDatasetPermissionMigration.java | 6 +-
.../v099/RemoveDuplicatedAssetPermissions.java | 7 +-
.../storage/CachedDataExplorerWidgetStorage.java | 188 +++++++++++++++++++++
.../core/storage/StorageApiConfiguration.java | 17 +-
.../src/main/resources/application.properties | 3 +
.../CachedDataExplorerWidgetStorageTest.java | 150 ++++++++++++++++
.../storage/couchdb/CouchDbStorageManager.java | 2 -
105 files changed, 1307 insertions(+), 539 deletions(-)
diff --git a/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/compact/PersistPipelineHandler.java b/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/compact/PersistPipelineHandler.java
index 2956e6acca..b6ac18b6c7 100644
--- a/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/compact/PersistPipelineHandler.java
+++ b/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/compact/PersistPipelineHandler.java
@@ -45,14 +45,17 @@ import static org.apache.streampipes.manager.template.instances.PersistDataLakeP
public class PersistPipelineHandler {
private final ICompactPipelineTemplateStorage templateStorage;
- private final CompactPipelineManagement pipelineManagement;
+ private final CompactPipelineManagement compactPipelineManagement;
+ private final PipelineManager pipelineManager;
private final String authenticatedUserSid;
public PersistPipelineHandler(ICompactPipelineTemplateStorage templateStorage,
- CompactPipelineManagement pipelineManagement,
+ CompactPipelineManagement compactPipelineManagement,
+ PipelineManager pipelineManager,
String authenticatedUserSid) {
this.templateStorage = templateStorage;
- this.pipelineManagement = pipelineManagement;
+ this.compactPipelineManagement = compactPipelineManagement;
+ this.pipelineManager = pipelineManager;
this.authenticatedUserSid = authenticatedUserSid;
}
@@ -67,11 +70,11 @@ public class PersistPipelineHandler {
makeTemplateConfig(adapterDescription, template.getPipeline()),
new CreateOptions(false, true)
);
- var pipelineGenerationResult = pipelineManagement.makePipeline(compactPipeline);
+ var pipelineGenerationResult = compactPipelineManagement.makePipeline(compactPipeline);
if (pipelineGenerationResult.allPipelineElementsValid()) {
- String pipelineId = PipelineManager.addPipeline(authenticatedUserSid, pipelineGenerationResult.pipeline());
+ String pipelineId = pipelineManager.addPipeline(authenticatedUserSid, pipelineGenerationResult.pipeline());
if (compactPipeline.createOptions().start()) {
- return PipelineManager.startPipeline(pipelineId, requestManager);
+ return pipelineManager.startPipeline(pipelineId, requestManager);
}
}
}
diff --git a/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/AdapterMasterManagement.java b/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/AdapterMasterManagement.java
index 3c7bc74be5..33b0c3b5cb 100644
--- a/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/AdapterMasterManagement.java
+++ b/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/AdapterMasterManagement.java
@@ -29,8 +29,7 @@ import org.apache.streampipes.manager.verification.TypedElementVerifier;
import org.apache.streampipes.model.SpDataStream;
import org.apache.streampipes.model.connect.adapter.AdapterDescription;
import org.apache.streampipes.model.util.ElementIdGenerator;
-import org.apache.streampipes.resource.management.AdapterResourceManager;
-import org.apache.streampipes.resource.management.DataStreamResourceManager;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.storage.api.connect.IAdapterStorage;
import org.apache.streampipes.storage.api.system.IExtensionsServiceStorage;
import org.apache.streampipes.storage.management.StorageDispatcher;
@@ -53,15 +52,13 @@ public class AdapterMasterManagement {
private final IAdapterStorage adapterInstanceStorage;
private final IExtensionsServiceStorage extensionsServiceStorage;
private final AdapterMetrics adapterMetrics;
- private final AdapterResourceManager adapterResourceManager;
- private final DataStreamResourceManager dataStreamResourceManager;
private final WorkerRestClient workerRestClient;
private final ExtensionServiceRequestManager requestManager;
+ private final SpResourceManager resourceManager;
public AdapterMasterManagement(IAdapterStorage adapterInstanceStorage,
- AdapterResourceManager adapterResourceManager,
- DataStreamResourceManager dataStreamResourceManager,
+ SpResourceManager resourceManager,
AdapterMetrics adapterMetrics,
WorkerRestClient workerRestClient,
IExtensionsServiceStorage extensionsServiceStorage,
@@ -69,8 +66,7 @@ public class AdapterMasterManagement {
this.adapterInstanceStorage = adapterInstanceStorage;
this.extensionsServiceStorage = extensionsServiceStorage;
this.adapterMetrics = adapterMetrics;
- this.adapterResourceManager = adapterResourceManager;
- this.dataStreamResourceManager = dataStreamResourceManager;
+ this.resourceManager = resourceManager;
this.workerRestClient = workerRestClient;
this.requestManager = requestManager;
}
@@ -89,7 +85,7 @@ public class AdapterMasterManagement {
var eventGrounding = GroundingUtils.createEventGrounding();
adapterDescription.setEventGrounding(eventGrounding);
- this.adapterResourceManager.encryptAndCreate(adapterDescription);
+ this.resourceManager.manageAdapters().encryptAndCreate(adapterDescription);
// Stream is only created if the adpater is successfully stored
createDataStreamForAdapter(adapterDescription, adapterId, dataStreamElementId, principalSid);
@@ -131,12 +127,12 @@ public class AdapterMasterManagement {
AdapterDescription adapter = adapterInstanceStorage.getElementById(elementId);
// Delete adapter
- adapterResourceManager.delete(elementId);
+ this.resourceManager.manageAdapters().delete(elementId);
ExtensionsLogProvider.INSTANCE.remove(elementId);
LOG.info("Successfully deleted adapter: " + elementId);
// Delete data stream
- this.dataStreamResourceManager.delete(adapter.getCorrespondingDataStreamElementId());
+ this.resourceManager.manageDataStreams().delete(adapter.getCorrespondingDataStreamElementId());
LOG.info("Successfully deleted data stream: "
+ adapter.getCorrespondingDataStreamElementId());
} finally {
@@ -228,7 +224,8 @@ public class AdapterMasterManagement {
storageApi::storeDataStream,
storageApi::update,
SpServiceUrlProvider.DATA_STREAM,
- requestManager
+ requestManager,
+ resourceManager.managePermissions()
);
verifier.verifyAndAdd(principalSid, false);
}
diff --git a/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/AdapterMigrationManager.java b/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/AdapterMigrationManager.java
index f4738ff8f0..69f4ece820 100644
--- a/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/AdapterMigrationManager.java
+++ b/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/AdapterMigrationManager.java
@@ -25,6 +25,7 @@ import org.apache.streampipes.manager.migration.IMigrationHandler;
import org.apache.streampipes.model.extensions.svcdiscovery.SpServiceRegistration;
import org.apache.streampipes.model.extensions.svcdiscovery.SpServiceTagPrefix;
import org.apache.streampipes.model.migration.ModelMigratorConfig;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.storage.api.connect.IAdapterStorage;
import org.apache.commons.lang3.StringUtils;
@@ -44,8 +45,9 @@ public class AdapterMigrationManager extends AbstractMigrationManager implements
public AdapterMigrationManager(IAdapterStorage adapterStorage,
IAdapterStorage adapterDescriptionStorage,
WorkerRestClient workerRestClient,
- ExtensionServiceRequestManager extensionServiceRequestManager) {
- super(extensionServiceRequestManager);
+ ExtensionServiceRequestManager extensionServiceRequestManager,
+ SpResourceManager resourceManager) {
+ super(extensionServiceRequestManager, resourceManager);
this.adapterStorage = adapterStorage;
this.adapterDescriptionStorage = adapterDescriptionStorage;
this.workerRestClient = workerRestClient;
diff --git a/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/AdapterUpdateManagement.java b/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/AdapterUpdateManagement.java
index 094272aa00..01811ced18 100644
--- a/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/AdapterUpdateManagement.java
+++ b/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/AdapterUpdateManagement.java
@@ -19,8 +19,6 @@
package org.apache.streampipes.connect.management.management;
import org.apache.streampipes.commons.exceptions.connect.AdapterException;
-import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequestManager;
-import org.apache.streampipes.manager.pipeline.update.ChartSchemaUpdateCoordinator;
import org.apache.streampipes.manager.pipeline.update.PipelineUpdateCoordinator;
import org.apache.streampipes.model.SpDataStream;
import org.apache.streampipes.model.connect.adapter.AdapterDescription;
@@ -39,12 +37,12 @@ public class AdapterUpdateManagement {
private final PipelineUpdateCoordinator pipelineUpdateCoordinator;
public AdapterUpdateManagement(AdapterMasterManagement adapterMasterManagement,
- ExtensionServiceRequestManager requestManager,
- ChartSchemaUpdateCoordinator chartSchemaUpdateCoordinator) {
+ PipelineUpdateCoordinator pipelineUpdateCoordinator,
+ SpResourceManager resourceManager) {
this.adapterMasterManagement = adapterMasterManagement;
- this.adapterResourceManager = new SpResourceManager().manageAdapters();
- this.dataStreamResourceManager = new SpResourceManager().manageDataStreams();
- this.pipelineUpdateCoordinator = new PipelineUpdateCoordinator(requestManager, chartSchemaUpdateCoordinator);
+ this.adapterResourceManager = resourceManager.manageAdapters();
+ this.dataStreamResourceManager = resourceManager.manageDataStreams();
+ this.pipelineUpdateCoordinator = pipelineUpdateCoordinator;
}
public void updateAdapter(AdapterDescription ad)
diff --git a/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/WorkerAdministrationManagement.java b/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/WorkerAdministrationManagement.java
index 9e4750bc26..63e23fd51c 100644
--- a/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/WorkerAdministrationManagement.java
+++ b/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/WorkerAdministrationManagement.java
@@ -24,6 +24,7 @@ import org.apache.streampipes.manager.assets.AssetManager;
import org.apache.streampipes.model.connect.adapter.AdapterDescription;
import org.apache.streampipes.model.extensions.svcdiscovery.SpServiceTag;
import org.apache.streampipes.resource.management.PermissionResourceManager;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.resource.management.UserResourceManager;
import org.apache.streampipes.storage.api.connect.IAdapterStorage;
import org.apache.streampipes.storage.api.user.IPermissionStorage;
@@ -47,14 +48,12 @@ public class WorkerAdministrationManagement {
public WorkerAdministrationManagement(
IAdapterStorage adapterDescriptionStorage,
- IPermissionStorage permissionStorage,
- UserResourceManager userResourceManager,
- PermissionResourceManager permissionResourceManager,
+ SpResourceManager resourceManager,
ExtensionServiceRequestManager requestManager) {
this.adapterDescriptionStorage = adapterDescriptionStorage;
- this.userResourceManager = userResourceManager;
- this.permissionStorage = permissionStorage;
- this.permissionResourceManager = permissionResourceManager;
+ this.userResourceManager = resourceManager.manageUsers();
+ this.permissionStorage = resourceManager.managePermissions().getDb();
+ this.permissionResourceManager = resourceManager.managePermissions();
this.requestManager = requestManager;
}
diff --git a/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/WorkerRestClient.java b/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/WorkerRestClient.java
index 249f0ffe99..36da51e319 100644
--- a/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/WorkerRestClient.java
+++ b/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/WorkerRestClient.java
@@ -31,6 +31,7 @@ import org.apache.streampipes.model.extensions.svcdiscovery.SpServiceRegistratio
import org.apache.streampipes.model.runtime.RuntimeOptionsRequest;
import org.apache.streampipes.model.runtime.RuntimeOptionsResponse;
import org.apache.streampipes.model.util.Cloner;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.resource.management.secret.SecretProvider;
import org.apache.streampipes.serializers.json.JacksonSerializer;
import org.apache.streampipes.storage.api.connect.IAdapterStorage;
@@ -52,9 +53,12 @@ public class WorkerRestClient {
private static final Logger LOG = LoggerFactory.getLogger(WorkerRestClient.class);
private final ExtensionServiceRequestManager requestManager;
+ private final SpResourceManager resourceManager;
- public WorkerRestClient(ExtensionServiceRequestManager requestManager) {
+ public WorkerRestClient(ExtensionServiceRequestManager requestManager,
+ SpResourceManager resourceManager) {
this.requestManager = requestManager;
+ this.resourceManager = resourceManager;
}
public void invokeStreamAdapter(SpServiceRegistration service,
@@ -95,7 +99,7 @@ public class WorkerRestClient {
String adapterDescription = JacksonSerializer.getObjectMapper().writeValueAsString(ad);
var response =
- triggerPost(requestTarget, ad.getCorrespondingDataStreamElementId(), adapterDescription);
+ triggerPost(requestTarget, ad.getCorrespondingDataStreamElementId(), adapterDescription, resourceManager);
var responseString = response.responseBody();
if (response.statusCode() != HttpStatus.SC_OK) {
@@ -118,9 +122,10 @@ public class WorkerRestClient {
private ExtensionServiceOperationResult triggerPost(ExtensionServiceRequestTarget requestTarget,
String elementId,
- String payload) throws IOException {
+ String payload,
+ SpResourceManager resourceManager) throws IOException {
return requestManager.request(
- ExtensionServiceRequests.adapterStateChange(requestTarget, elementId, payload)
+ ExtensionServiceRequests.adapterStateChange(requestTarget, elementId, payload, resourceManager)
);
}
diff --git a/streampipes-connect-management/src/test/java/org/apache/streampipes/connect/management/management/AdapterMasterManagementTest.java b/streampipes-connect-management/src/test/java/org/apache/streampipes/connect/management/management/AdapterMasterManagementTest.java
index 2360b66f23..2e28cb80ab 100644
--- a/streampipes-connect-management/src/test/java/org/apache/streampipes/connect/management/management/AdapterMasterManagementTest.java
+++ b/streampipes-connect-management/src/test/java/org/apache/streampipes/connect/management/management/AdapterMasterManagementTest.java
@@ -22,7 +22,7 @@ import org.apache.streampipes.commons.exceptions.connect.AdapterException;
import org.apache.streampipes.commons.prometheus.adapter.AdapterMetricsManager;
import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequestManager;
import org.apache.streampipes.model.connect.adapter.AdapterDescription;
-import org.apache.streampipes.resource.management.AdapterResourceManager;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.storage.api.system.IExtensionsServiceStorage;
import org.apache.streampipes.storage.couchdb.impl.connect.AdapterInstanceStorageImpl;
@@ -40,7 +40,7 @@ public class AdapterMasterManagementTest {
@Test
public void getAdapter_FailNull() {
var adapterStorage = mock(AdapterInstanceStorageImpl.class);
- var resourceManager = mock(AdapterResourceManager.class);
+ var resourceManager = mock(SpResourceManager.class);
var workerRestClient = mock(WorkerRestClient.class);
var serviceStorage = mock(IExtensionsServiceStorage.class);
var requestManager = mock(ExtensionServiceRequestManager.class);
@@ -50,7 +50,6 @@ public class AdapterMasterManagementTest {
new AdapterMasterManagement(
adapterStorage,
resourceManager,
- null,
AdapterMetricsManager.INSTANCE.getAdapterMetrics(),
workerRestClient,
serviceStorage,
@@ -64,7 +63,7 @@ public class AdapterMasterManagementTest {
public void getAdapter_Fail() {
var adapterDescriptions = List.of(new AdapterDescription());
var adapterStorage = mock(AdapterInstanceStorageImpl.class);
- var resourceManager = mock(AdapterResourceManager.class);
+ var resourceManager = mock(SpResourceManager.class);
var workerRestClient = mock(WorkerRestClient.class);
var serviceStorage = mock(IExtensionsServiceStorage.class);
var requestManager = mock(ExtensionServiceRequestManager.class);
@@ -74,7 +73,6 @@ public class AdapterMasterManagementTest {
new AdapterMasterManagement(
adapterStorage,
resourceManager,
- null,
AdapterMetricsManager.INSTANCE.getAdapterMetrics(),
workerRestClient,
serviceStorage,
@@ -88,7 +86,7 @@ public class AdapterMasterManagementTest {
public void getAllAdapters_Success() {
var adapterDescriptions = List.of(new AdapterDescription());
var adapterStorage = mock(AdapterInstanceStorageImpl.class);
- var resourceManager = mock(AdapterResourceManager.class);
+ var resourceManager = mock(SpResourceManager.class);
var workerRestClient = mock(WorkerRestClient.class);
var serviceStorage = mock(IExtensionsServiceStorage.class);
var requestManager = mock(ExtensionServiceRequestManager.class);
@@ -98,7 +96,6 @@ public class AdapterMasterManagementTest {
new AdapterMasterManagement(
adapterStorage,
resourceManager,
- null,
AdapterMetricsManager.INSTANCE.getAdapterMetrics(),
workerRestClient,
serviceStorage,
diff --git a/streampipes-data-explorer-management/src/main/java/org/apache/streampipes/dataexplorer/management/DataExplorerDispatcher.java b/streampipes-data-explorer-management/src/main/java/org/apache/streampipes/dataexplorer/management/DataExplorerDispatcher.java
index 10b810134f..8614c15b57 100644
--- a/streampipes-data-explorer-management/src/main/java/org/apache/streampipes/dataexplorer/management/DataExplorerDispatcher.java
+++ b/streampipes-data-explorer-management/src/main/java/org/apache/streampipes/dataexplorer/management/DataExplorerDispatcher.java
@@ -22,7 +22,6 @@ import org.apache.streampipes.commons.environment.Environments;
import org.apache.streampipes.dataexplorer.api.IDataExplorerManager;
import org.apache.streampipes.dataexplorer.influx.DataExplorerManagerInflux;
import org.apache.streampipes.dataexplorer.iotdb.DataExplorerManagerIotDb;
-import org.apache.streampipes.manager.pipeline.update.ChartSchemaUpdateCoordinator;
public class DataExplorerDispatcher {
diff --git a/streampipes-data-export/src/main/java/org/apache/streampipes/export/AssetLinkResolver.java b/streampipes-data-export/src/main/java/org/apache/streampipes/export/AssetLinkResolver.java
index 708e680938..58ab4a210b 100644
--- a/streampipes-data-export/src/main/java/org/apache/streampipes/export/AssetLinkResolver.java
+++ b/streampipes-data-export/src/main/java/org/apache/streampipes/export/AssetLinkResolver.java
@@ -27,11 +27,12 @@ import org.apache.streampipes.export.resolver.FileResolver;
import org.apache.streampipes.export.resolver.MeasurementResolver;
import org.apache.streampipes.export.resolver.PipelineResolver;
import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequestManager;
+import org.apache.streampipes.manager.pipeline.PipelineManager;
import org.apache.streampipes.model.assets.AssetLink;
import org.apache.streampipes.model.assets.SpAssetModel;
import org.apache.streampipes.model.export.AssetExportConfiguration;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.serializers.json.JacksonSerializer;
-import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
import org.apache.streampipes.storage.management.StorageDispatcher;
import com.fasterxml.jackson.databind.DeserializationFeature;
@@ -52,18 +53,21 @@ public class AssetLinkResolver {
private final String assetId;
private final ObjectMapper mapper;
private final ExtensionServiceRequestManager extensionServiceRequestManager;
- private final IDataExplorerWidgetStorage chartStorage;
+ private final PipelineManager pipelineManager;
+ private final SpResourceManager resourceManager;
public AssetLinkResolver(String assetId,
ExtensionServiceRequestManager extensionServiceRequestManager,
- IDataExplorerWidgetStorage chartStorage) {
+ SpResourceManager resourceManager,
+ PipelineManager pipelineManager) {
this.assetId = assetId;
this.extensionServiceRequestManager = extensionServiceRequestManager;
- this.chartStorage = chartStorage;
this.mapper = JacksonSerializer.getObjectMapper(Map.of(
DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true,
SerializationFeature.INDENT_OUTPUT, false
));
+ this.pipelineManager = pipelineManager;
+ this.resourceManager = resourceManager;
}
public AssetExportConfiguration resolveResources() {
@@ -74,14 +78,17 @@ public class AssetLinkResolver {
var exportConfig = new AssetExportConfiguration();
exportConfig.setAssetId(this.assetId);
exportConfig.setAssetName(asset.getAssetName());
- exportConfig.setAdapters(new AdapterResolver(extensionServiceRequestManager)
+ exportConfig.setAdapters(new AdapterResolver(
+ extensionServiceRequestManager,
+ resourceManager
+ )
.resolve(getLinks(assetLinks, ResolvableAssetLinks.ADAPTER)));
- exportConfig.setDataViews(new ChartResolver(chartStorage)
+ exportConfig.setDataViews(new ChartResolver(resourceManager)
.resolve(getLinks(assetLinks, ResolvableAssetLinks.CHART)));
exportConfig.setDashboards(new DashboardResolver().resolve(getLinks(assetLinks, ResolvableAssetLinks.DASHBOARD)));
exportConfig.setDataSources(
new DataSourceResolver().resolve(getLinks(assetLinks, ResolvableAssetLinks.DATA_SOURCE)));
- exportConfig.setPipelines(new PipelineResolver(extensionServiceRequestManager)
+ exportConfig.setPipelines(new PipelineResolver(extensionServiceRequestManager, pipelineManager)
.resolve(getLinks(assetLinks, ResolvableAssetLinks.PIPELINE)));
exportConfig.setDataLakeMeasures(
new MeasurementResolver().resolve(getLinks(assetLinks, ResolvableAssetLinks.MEASUREMENT)));
diff --git a/streampipes-data-export/src/main/java/org/apache/streampipes/export/ExportManager.java b/streampipes-data-export/src/main/java/org/apache/streampipes/export/ExportManager.java
index 4254ee693a..50789c7add 100644
--- a/streampipes-data-export/src/main/java/org/apache/streampipes/export/ExportManager.java
+++ b/streampipes-data-export/src/main/java/org/apache/streampipes/export/ExportManager.java
@@ -20,8 +20,9 @@ package org.apache.streampipes.export;
import org.apache.streampipes.export.generator.ExportPackageGenerator;
import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequestManager;
+import org.apache.streampipes.manager.pipeline.PipelineManager;
import org.apache.streampipes.model.export.ExportConfiguration;
-import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
+import org.apache.streampipes.resource.management.SpResourceManager;
import java.io.IOException;
import java.util.List;
@@ -31,11 +32,13 @@ public class ExportManager {
public static ExportConfiguration getExportPreview(List<String> selectedAssetIds,
ExtensionServiceRequestManager extensionServiceRequestManager,
- IDataExplorerWidgetStorage chartStorage) {
+ SpResourceManager resourceManager,
+ PipelineManager pipelineManager) {
var exportConfig = new ExportConfiguration();
var assetExportConfigurations = selectedAssetIds
.stream()
- .map(assetId -> new AssetLinkResolver(assetId, extensionServiceRequestManager, chartStorage)
+ .map(assetId -> new AssetLinkResolver(
+ assetId, extensionServiceRequestManager, resourceManager, pipelineManager)
.resolveResources())
.collect(Collectors.toList());
@@ -46,8 +49,10 @@ public class ExportManager {
public static byte[] getExportPackage(ExportConfiguration exportConfiguration,
ExtensionServiceRequestManager extensionServiceRequestManager,
- IDataExplorerWidgetStorage chartStorage) throws IOException {
- return new ExportPackageGenerator(exportConfiguration, extensionServiceRequestManager, chartStorage)
+ SpResourceManager resourceManager,
+ PipelineManager pipelineManager) throws IOException {
+ return new ExportPackageGenerator(
+ exportConfiguration, extensionServiceRequestManager, resourceManager, pipelineManager)
.generateExportPackage();
}
diff --git a/streampipes-data-export/src/main/java/org/apache/streampipes/export/ImportManager.java b/streampipes-data-export/src/main/java/org/apache/streampipes/export/ImportManager.java
index 7802525cd4..760fd653c8 100644
--- a/streampipes-data-export/src/main/java/org/apache/streampipes/export/ImportManager.java
+++ b/streampipes-data-export/src/main/java/org/apache/streampipes/export/ImportManager.java
@@ -21,8 +21,9 @@ package org.apache.streampipes.export;
import org.apache.streampipes.export.dataimport.PerformImportGenerator;
import org.apache.streampipes.export.dataimport.PreviewImportGenerator;
import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequestManager;
+import org.apache.streampipes.manager.pipeline.PipelineManager;
import org.apache.streampipes.model.export.AssetExportConfiguration;
-import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
+import org.apache.streampipes.resource.management.SpResourceManager;
import java.io.IOException;
import java.io.InputStream;
@@ -31,17 +32,26 @@ public class ImportManager {
public static AssetExportConfiguration getImportPreview(InputStream packageZipStream,
ExtensionServiceRequestManager extensionServiceRequestManager,
- IDataExplorerWidgetStorage chartStorage)
+ SpResourceManager resourceManager,
+ PipelineManager pipelineManager)
throws IOException {
- return new PreviewImportGenerator(extensionServiceRequestManager, chartStorage).generate(packageZipStream);
+ return new PreviewImportGenerator(extensionServiceRequestManager, resourceManager, pipelineManager)
+ .generate(packageZipStream);
}
public static void performImport(InputStream packageZipStream,
AssetExportConfiguration exportConfiguration,
String ownerSid,
ExtensionServiceRequestManager extensionServiceRequestManager,
- IDataExplorerWidgetStorage chartStorage) throws IOException {
- new PerformImportGenerator(exportConfiguration, ownerSid, extensionServiceRequestManager, chartStorage)
+ SpResourceManager resourceManager,
+ PipelineManager pipelineManager) throws IOException {
+ new PerformImportGenerator(
+ exportConfiguration,
+ ownerSid,
+ extensionServiceRequestManager,
+ resourceManager,
+ pipelineManager
+ )
.generate(packageZipStream);
}
}
diff --git a/streampipes-data-export/src/main/java/org/apache/streampipes/export/dataimport/PerformImportGenerator.java b/streampipes-data-export/src/main/java/org/apache/streampipes/export/dataimport/PerformImportGenerator.java
index b9b63c2e67..9dba50354f 100644
--- a/streampipes-data-export/src/main/java/org/apache/streampipes/export/dataimport/PerformImportGenerator.java
+++ b/streampipes-data-export/src/main/java/org/apache/streampipes/export/dataimport/PerformImportGenerator.java
@@ -30,6 +30,7 @@ import org.apache.streampipes.export.resolver.MeasurementResolver;
import org.apache.streampipes.export.resolver.PipelineResolver;
import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequestManager;
import org.apache.streampipes.manager.file.FileHandler;
+import org.apache.streampipes.manager.pipeline.PipelineManager;
import org.apache.streampipes.model.SpDataStream;
import org.apache.streampipes.model.assets.SpAssetModel;
import org.apache.streampipes.model.dashboard.DashboardModel;
@@ -38,9 +39,8 @@ import org.apache.streampipes.model.datalake.DataLakeMeasure;
import org.apache.streampipes.model.export.AssetExportConfiguration;
import org.apache.streampipes.model.export.ExportItem;
import org.apache.streampipes.model.pipeline.Pipeline;
-import org.apache.streampipes.resource.management.PermissionResourceManager;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.storage.api.core.INoSqlStorage;
-import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
import org.apache.streampipes.storage.management.StorageDispatcher;
import com.fasterxml.jackson.core.JsonProcessingException;
@@ -58,17 +58,20 @@ public class PerformImportGenerator extends ImportGenerator<Void> {
private final Set<PermissionInfo> permissionsToStore = new HashSet<>();
private final String ownerSid;
private final ExtensionServiceRequestManager extensionServiceRequestManager;
- private final IDataExplorerWidgetStorage chartStorage;
+ private final PipelineManager pipelineManager;
+ private final SpResourceManager resourceManager;
public PerformImportGenerator(AssetExportConfiguration config,
String ownerSid,
ExtensionServiceRequestManager extensionServiceRequestManager,
- IDataExplorerWidgetStorage chartStorage) {
+ SpResourceManager resourceManager,
+ PipelineManager pipelineManager) {
this.config = config;
this.storage = StorageDispatcher.INSTANCE.getNoSqlStore();
this.ownerSid = ownerSid;
this.extensionServiceRequestManager = extensionServiceRequestManager;
- this.chartStorage = chartStorage;
+ this.resourceManager = resourceManager;
+ this.pipelineManager = pipelineManager;
}
@Override
@@ -89,7 +92,7 @@ public class PerformImportGenerator extends ImportGenerator<Void> {
@Override
protected void handleAdapter(String document, String adapterId) throws JsonProcessingException {
if (shouldStore(adapterId, config.getAdapters())) {
- writeDocument(document, new AdapterResolver(extensionServiceRequestManager));
+ writeDocument(document, new AdapterResolver(extensionServiceRequestManager, resourceManager));
// adapters do not have permissions associated
}
}
@@ -97,7 +100,7 @@ public class PerformImportGenerator extends ImportGenerator<Void> {
@Override
protected void handleChart(String document, String chartId) throws JsonProcessingException {
if (shouldStore(chartId, config.getDataViews())) {
- var chartResolver = new ChartResolver(chartStorage);
+ var chartResolver = new ChartResolver(resourceManager);
writeDocument(document, chartResolver);
var chart = chartResolver.deserializeDocument(document);
permissionsToStore.add(new PermissionInfo(chart.getElementId(), DataExplorerWidgetModel.class));
@@ -125,7 +128,7 @@ public class PerformImportGenerator extends ImportGenerator<Void> {
@Override
protected void handlePipeline(String document, String pipelineId) throws JsonProcessingException {
if (shouldStore(pipelineId, config.getPipelines())) {
- writeDocument(document, new PipelineResolver(extensionServiceRequestManager));
+ writeDocument(document, new PipelineResolver(extensionServiceRequestManager, pipelineManager));
permissionsToStore.add(new PermissionInfo(pipelineId, Pipeline.class));
}
}
@@ -172,9 +175,8 @@ public class PerformImportGenerator extends ImportGenerator<Void> {
@Override
protected void afterResourcesCreated() {
- var resourceManager = new PermissionResourceManager();
this.permissionsToStore
- .forEach(info -> resourceManager.createDefault(
+ .forEach(info -> resourceManager.managePermissions().createDefault(
info.getInstanceId(),
info.getInstanceClass(),
this.ownerSid,
diff --git a/streampipes-data-export/src/main/java/org/apache/streampipes/export/dataimport/PreviewImportGenerator.java b/streampipes-data-export/src/main/java/org/apache/streampipes/export/dataimport/PreviewImportGenerator.java
index d440467d8a..5b96a03f45 100644
--- a/streampipes-data-export/src/main/java/org/apache/streampipes/export/dataimport/PreviewImportGenerator.java
+++ b/streampipes-data-export/src/main/java/org/apache/streampipes/export/dataimport/PreviewImportGenerator.java
@@ -27,9 +27,10 @@ import org.apache.streampipes.export.resolver.FileResolver;
import org.apache.streampipes.export.resolver.MeasurementResolver;
import org.apache.streampipes.export.resolver.PipelineResolver;
import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequestManager;
+import org.apache.streampipes.manager.pipeline.PipelineManager;
import org.apache.streampipes.model.export.AssetExportConfiguration;
import org.apache.streampipes.model.export.ExportItem;
-import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
+import org.apache.streampipes.resource.management.SpResourceManager;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
@@ -44,14 +45,17 @@ public class PreviewImportGenerator extends ImportGenerator<AssetExportConfigura
private static final Logger LOG = LoggerFactory.getLogger(PreviewImportGenerator.class);
private final AssetExportConfiguration importConfig;
private final ExtensionServiceRequestManager extensionServiceRequestManager;
- private final IDataExplorerWidgetStorage chartStorage;
+ private final PipelineManager pipelineManager;
+ private final SpResourceManager resourceManager;
public PreviewImportGenerator(ExtensionServiceRequestManager extensionServiceRequestManager,
- IDataExplorerWidgetStorage chartStorage) {
+ SpResourceManager resourceManager,
+ PipelineManager pipelineManager) {
super();
this.importConfig = new AssetExportConfiguration();
this.extensionServiceRequestManager = extensionServiceRequestManager;
- this.chartStorage = chartStorage;
+ this.pipelineManager = pipelineManager;
+ this.resourceManager = resourceManager;
}
@@ -77,7 +81,8 @@ public class PreviewImportGenerator extends ImportGenerator<AssetExportConfigura
try {
addExportItem(
adapterId,
- new AdapterResolver(extensionServiceRequestManager).readDocument(document).getName(),
+ new AdapterResolver(extensionServiceRequestManager, resourceManager)
+ .readDocument(document).getName(),
importConfig::addAdapter
);
} catch (IllegalArgumentException e) {
@@ -89,7 +94,7 @@ public class PreviewImportGenerator extends ImportGenerator<AssetExportConfigura
protected void handleChart(String document, String dataViewId) throws JsonProcessingException {
addExportItem(
dataViewId,
- new ChartResolver(chartStorage).readDocument(document).getBaseAppearanceConfig().get("widgetTitle").toString(),
+ new ChartResolver(resourceManager).readDocument(document).getBaseAppearanceConfig().get("widgetTitle").toString(),
importConfig::addDataView
);
}
@@ -106,7 +111,7 @@ public class PreviewImportGenerator extends ImportGenerator<AssetExportConfigura
@Override
protected void handlePipeline(String document, String pipelineId) throws JsonProcessingException {
- addExportItem(pipelineId, new PipelineResolver(extensionServiceRequestManager)
+ addExportItem(pipelineId, new PipelineResolver(extensionServiceRequestManager, pipelineManager)
.readDocument(document).getName(), importConfig::addPipeline);
}
diff --git a/streampipes-data-export/src/main/java/org/apache/streampipes/export/generator/ExportPackageGenerator.java b/streampipes-data-export/src/main/java/org/apache/streampipes/export/generator/ExportPackageGenerator.java
index 99944160b7..8806b4b371 100644
--- a/streampipes-data-export/src/main/java/org/apache/streampipes/export/generator/ExportPackageGenerator.java
+++ b/streampipes-data-export/src/main/java/org/apache/streampipes/export/generator/ExportPackageGenerator.java
@@ -30,12 +30,13 @@ import org.apache.streampipes.export.resolver.MeasurementResolver;
import org.apache.streampipes.export.resolver.PipelineResolver;
import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequestManager;
import org.apache.streampipes.manager.file.FileManager;
+import org.apache.streampipes.manager.pipeline.PipelineManager;
import org.apache.streampipes.model.export.AssetExportConfiguration;
import org.apache.streampipes.model.export.ExportConfiguration;
import org.apache.streampipes.model.export.ExportItem;
import org.apache.streampipes.model.export.StreamPipesApplicationPackage;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.serializers.json.JacksonSerializer;
-import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
import org.apache.streampipes.storage.management.StorageDispatcher;
import com.fasterxml.jackson.core.JsonProcessingException;
@@ -59,14 +60,17 @@ public class ExportPackageGenerator {
private final ExportConfiguration exportConfiguration;
private final ExtensionServiceRequestManager extensionServiceRequestManager;
private final ObjectMapper defaultMapper;
- private final IDataExplorerWidgetStorage chartStorage;
+ private final PipelineManager pipelineManager;
+ private final SpResourceManager resourceManager;
public ExportPackageGenerator(ExportConfiguration exportConfiguration,
ExtensionServiceRequestManager extensionServiceRequestManager,
- IDataExplorerWidgetStorage chartStorage) {
+ SpResourceManager resourceManager,
+ PipelineManager pipelineManager) {
this.exportConfiguration = exportConfiguration;
this.extensionServiceRequestManager = extensionServiceRequestManager;
- this.chartStorage = chartStorage;
+ this.pipelineManager = pipelineManager;
+ this.resourceManager = resourceManager;
this.defaultMapper = JacksonSerializer.getObjectMapper(Map.of(
DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true,
SerializationFeature.INDENT_OUTPUT, false
@@ -86,7 +90,7 @@ public class ExportPackageGenerator {
this.exportConfiguration.getAssetExportConfiguration().forEach(config -> {
config.getAdapters().forEach(item -> addDoc(builder,
item,
- new AdapterResolver(extensionServiceRequestManager),
+ new AdapterResolver(extensionServiceRequestManager, resourceManager),
manifest::addAdapter));
config.getDataSources().forEach(item -> addDoc(builder,
@@ -101,7 +105,7 @@ public class ExportPackageGenerator {
config.getPipelines().forEach(item -> addDoc(builder,
item,
- new PipelineResolver(extensionServiceRequestManager),
+ new PipelineResolver(extensionServiceRequestManager, pipelineManager),
manifest::addPipeline));
config.getDashboards().forEach(item -> {
@@ -111,14 +115,14 @@ public class ExportPackageGenerator {
new DashboardResolver(),
manifest::addDashboard);
var charts = resolver.getCharts(item.getResourceId());
- var chartResolver = new ChartResolver(chartStorage);
+ var chartResolver = new ChartResolver(resourceManager);
charts.forEach(widgetId -> addDoc(builder, widgetId, chartResolver, manifest::addDataViewWidget));
});
config.getDataViews().forEach(item -> {
addDoc(builder,
item,
- new ChartResolver(chartStorage),
+ new ChartResolver(resourceManager),
manifest::addDataView);
});
diff --git a/streampipes-data-export/src/main/java/org/apache/streampipes/export/resolver/AdapterResolver.java b/streampipes-data-export/src/main/java/org/apache/streampipes/export/resolver/AdapterResolver.java
index 5e52b3562f..7874d51c3e 100644
--- a/streampipes-data-export/src/main/java/org/apache/streampipes/export/resolver/AdapterResolver.java
+++ b/streampipes-data-export/src/main/java/org/apache/streampipes/export/resolver/AdapterResolver.java
@@ -38,9 +38,12 @@ public class AdapterResolver extends AbstractResolver<AdapterDescription> {
private static final Logger LOG = LoggerFactory.getLogger(AdapterResolver.class);
private final ExtensionServiceRequestManager extensionServiceRequestManager;
+ private final SpResourceManager resourceManager;
- public AdapterResolver(ExtensionServiceRequestManager extensionServiceRequestManager) {
+ public AdapterResolver(ExtensionServiceRequestManager extensionServiceRequestManager,
+ SpResourceManager resourceManager) {
this.extensionServiceRequestManager = extensionServiceRequestManager;
+ this.resourceManager = resourceManager;
}
@Override
@@ -94,10 +97,9 @@ public class AdapterResolver extends AbstractResolver<AdapterDescription> {
try {
new AdapterMasterManagement(
getNoSqlStore().getAdapterInstanceStorage(),
- new SpResourceManager().manageAdapters(),
- new SpResourceManager().manageDataStreams(),
+ resourceManager,
AdapterMetricsManager.INSTANCE.getAdapterMetrics(),
- new WorkerRestClient(extensionServiceRequestManager),
+ new WorkerRestClient(extensionServiceRequestManager, resourceManager),
getNoSqlStore().getExtensionsServiceStorage(),
extensionServiceRequestManager
).stopStreamAdapter(resourceId, true);
diff --git a/streampipes-data-export/src/main/java/org/apache/streampipes/export/resolver/ChartResolver.java b/streampipes-data-export/src/main/java/org/apache/streampipes/export/resolver/ChartResolver.java
index d26996f856..5b68b746ce 100644
--- a/streampipes-data-export/src/main/java/org/apache/streampipes/export/resolver/ChartResolver.java
+++ b/streampipes-data-export/src/main/java/org/apache/streampipes/export/resolver/ChartResolver.java
@@ -21,8 +21,9 @@ package org.apache.streampipes.export.resolver;
import org.apache.streampipes.model.datalake.DataExplorerWidgetModel;
import org.apache.streampipes.model.export.AssetExportConfiguration;
import org.apache.streampipes.model.export.ExportItem;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.serializers.json.JacksonSerializer;
-import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
+import org.apache.streampipes.storage.api.core.CRUDStorage;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
@@ -31,10 +32,10 @@ import java.util.Map;
public class ChartResolver extends AbstractResolver<DataExplorerWidgetModel> {
- private final IDataExplorerWidgetStorage chartStorage;
+ private final CRUDStorage<DataExplorerWidgetModel> chartStorage;
- public ChartResolver(IDataExplorerWidgetStorage chartStorage) {
- this.chartStorage = chartStorage;
+ public ChartResolver(SpResourceManager resourceManager) {
+ this.chartStorage = resourceManager.manageCharts().getDb();
}
@Override
diff --git a/streampipes-data-export/src/main/java/org/apache/streampipes/export/resolver/PipelineResolver.java b/streampipes-data-export/src/main/java/org/apache/streampipes/export/resolver/PipelineResolver.java
index 528f8b81cc..a11d79f912 100644
--- a/streampipes-data-export/src/main/java/org/apache/streampipes/export/resolver/PipelineResolver.java
+++ b/streampipes-data-export/src/main/java/org/apache/streampipes/export/resolver/PipelineResolver.java
@@ -33,14 +33,17 @@ import java.util.stream.Collectors;
public class PipelineResolver extends AbstractResolver<Pipeline> {
private final ExtensionServiceRequestManager requestManager;
+ private final PipelineManager pipelineManager;
- public PipelineResolver(ExtensionServiceRequestManager requestManager) {
+ public PipelineResolver(ExtensionServiceRequestManager requestManager,
+ PipelineManager pipelineManager) {
this.requestManager = requestManager;
+ this.pipelineManager = pipelineManager;
}
@Override
public Pipeline findDocument(String resourceId) {
- return getNoSqlStore().getPipelineStorageAPI().getElementById(resourceId);
+ return pipelineManager.getPipeline(resourceId);
}
@Override
@@ -99,10 +102,10 @@ public class PipelineResolver extends AbstractResolver<Pipeline> {
public void deleteDocument(String document) throws JsonProcessingException {
var pipeline = readDocument(document);
var resourceId = pipeline.getElementId();
- var storedPipeline = PipelineManager.getPipeline(resourceId);
+ var storedPipeline = pipelineManager.getPipeline(resourceId);
if (storedPipeline != null) {
if (storedPipeline.isRunning()) {
- PipelineManager.stopPipeline(resourceId, true, requestManager);
+ pipelineManager.stopPipeline(resourceId, true, requestManager);
}
getNoSqlStore().getPipelineStorageAPI().deleteElementById(resourceId);
}
diff --git a/streampipes-health-monitoring/src/main/java/org/apache/streampipes/health/monitoring/ExtensionHealthCheck.java b/streampipes-health-monitoring/src/main/java/org/apache/streampipes/health/monitoring/ExtensionHealthCheck.java
index 5ce5e80673..77cce0a29a 100644
--- a/streampipes-health-monitoring/src/main/java/org/apache/streampipes/health/monitoring/ExtensionHealthCheck.java
+++ b/streampipes-health-monitoring/src/main/java/org/apache/streampipes/health/monitoring/ExtensionHealthCheck.java
@@ -21,6 +21,7 @@ package org.apache.streampipes.health.monitoring;
import org.apache.streampipes.health.monitoring.model.HealthCheckData;
import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequestManager;
import org.apache.streampipes.model.health.ExtensionInstanceHealth;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.storage.api.system.IExtensionsServiceStorage;
import org.slf4j.Logger;
@@ -35,13 +36,16 @@ public class ExtensionHealthCheck implements Runnable {
private final ResourceProvider resourceProvider;
private final ExtensionServiceRequestManager extensionRequestManager;
private final IExtensionsServiceStorage extensionsServiceStorage;
+ private final SpResourceManager resourceManager;
public ExtensionHealthCheck(ResourceProvider resourceProvider,
IExtensionsServiceStorage extensionsServiceStorage,
- ExtensionServiceRequestManager extensionRequestManager) {
+ ExtensionServiceRequestManager extensionRequestManager,
+ SpResourceManager resourceManager) {
this.resourceProvider = resourceProvider;
this.extensionsServiceStorage = extensionsServiceStorage;
this.extensionRequestManager = extensionRequestManager;
+ this.resourceManager = resourceManager;
}
@Override
@@ -54,12 +58,13 @@ public class ExtensionHealthCheck implements Runnable {
activeCoreInstances.keySet().forEach(serviceId -> {
activeExtensionInstances.put(
serviceId,
- new ExtensionInstanceAvailabilityCheck(extensionsServiceStorage, serviceId, extensionRequestManager).checkRunningInstances()
- );
+ new ExtensionInstanceAvailabilityCheck(
+ extensionsServiceStorage, serviceId, extensionRequestManager, resourceManager
+ ).checkRunningInstances());
});
var healthCheckData = new HealthCheckData(resourceProvider, activeResources, activeCoreInstances, activeExtensionInstances);
- new PipelineHealthCheck(healthCheckData, extensionRequestManager).runCheck();
+ new PipelineHealthCheck(healthCheckData, extensionRequestManager, resourceProvider, resourceManager).runCheck();
new AdapterHealthCheck(healthCheckData).runCheck();
} catch (Exception e) {
LOG.warn("An unhandled error occurred while running health check.", e);
diff --git a/streampipes-health-monitoring/src/main/java/org/apache/streampipes/health/monitoring/ExtensionInstanceAvailabilityCheck.java b/streampipes-health-monitoring/src/main/java/org/apache/streampipes/health/monitoring/ExtensionInstanceAvailabilityCheck.java
index 0f7a3a003a..5966344be6 100644
--- a/streampipes-health-monitoring/src/main/java/org/apache/streampipes/health/monitoring/ExtensionInstanceAvailabilityCheck.java
+++ b/streampipes-health-monitoring/src/main/java/org/apache/streampipes/health/monitoring/ExtensionInstanceAvailabilityCheck.java
@@ -23,6 +23,7 @@ import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequestTarg
import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequests;
import org.apache.streampipes.model.extensions.svcdiscovery.SpServiceRegistration;
import org.apache.streampipes.model.health.ExtensionInstanceHealth;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.serializers.json.JacksonSerializer;
import org.apache.streampipes.storage.api.system.IExtensionsServiceStorage;
@@ -40,13 +41,16 @@ public class ExtensionInstanceAvailabilityCheck {
private final IExtensionsServiceStorage extensionsServiceStorage;
private final String serviceId;
private final ExtensionServiceRequestManager extensionRequestManager;
+ private final SpResourceManager resourceManager;
public ExtensionInstanceAvailabilityCheck(IExtensionsServiceStorage extensionsServiceStorage,
String serviceId,
- ExtensionServiceRequestManager extensionRequestManager) {
+ ExtensionServiceRequestManager extensionRequestManager,
+ SpResourceManager resourceManager) {
this.extensionsServiceStorage = extensionsServiceStorage;
this.serviceId = serviceId;
this.extensionRequestManager = extensionRequestManager;
+ this.resourceManager = resourceManager;
}
public ExtensionInstanceHealth checkRunningInstances() {
@@ -59,7 +63,8 @@ public class ExtensionInstanceAvailabilityCheck {
return new ExtensionInstanceHealth(Set.of(), Set.of());
} else {
var response = extensionRequestManager.request(
- ExtensionServiceRequests.extensionInstanceHealth(makeRequestTarget(service.get()))
+ ExtensionServiceRequests
+ .extensionInstanceHealth(makeRequestTarget(service.get()), resourceManager)
);
if (response.statusCode() != 200) {
return new ExtensionInstanceHealth(Set.of(), Set.of());
diff --git a/streampipes-health-monitoring/src/main/java/org/apache/streampipes/health/monitoring/PipelineHealthCheck.java b/streampipes-health-monitoring/src/main/java/org/apache/streampipes/health/monitoring/PipelineHealthCheck.java
index 9c0f655e9a..0aebbd81c3 100644
--- a/streampipes-health-monitoring/src/main/java/org/apache/streampipes/health/monitoring/PipelineHealthCheck.java
+++ b/streampipes-health-monitoring/src/main/java/org/apache/streampipes/health/monitoring/PipelineHealthCheck.java
@@ -31,6 +31,7 @@ import org.apache.streampipes.model.graph.DataProcessorInvocation;
import org.apache.streampipes.model.graph.DataSinkInvocation;
import org.apache.streampipes.model.pipeline.Pipeline;
import org.apache.streampipes.model.pipeline.PipelineHealthStatus;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.resource.management.secret.SecretDecrypter;
import org.apache.streampipes.resource.management.secret.SecretEncrypter;
import org.apache.streampipes.resource.management.secret.SecretService;
@@ -47,8 +48,6 @@ import java.util.Objects;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Stream;
-import static org.apache.streampipes.manager.pipeline.PipelineManager.getPipeline;
-
public class PipelineHealthCheck {
private static final Logger LOG = LoggerFactory.getLogger(PipelineHealthCheck.class);
@@ -59,11 +58,17 @@ public class PipelineHealthCheck {
private final HealthCheckData healthCheckData;
private final ExtensionServiceRequestManager requestManager;
+ private final ResourceProvider resourceProvider;
+ private final SpResourceManager resourceManager;
public PipelineHealthCheck(HealthCheckData healthCheckData,
- ExtensionServiceRequestManager requestManager) {
+ ExtensionServiceRequestManager requestManager,
+ ResourceProvider resourceProvider,
+ SpResourceManager resourceManager) {
this.healthCheckData = healthCheckData;
this.requestManager = requestManager;
+ this.resourceProvider = resourceProvider;
+ this.resourceManager = resourceManager;
}
public void runCheck() {
@@ -127,7 +132,7 @@ public class PipelineHealthCheck {
new SecretService(new SecretDecrypter()).apply(pipelineElement);
pipelineElement.setSelectedEndpointUrl(service.getServiceUrl());
pipelineElement.setSelectedServiceId(service.getSvcId());
- success = new InvokeExtensionRequest(requestManager)
+ success = new InvokeExtensionRequest(requestManager, resourceManager)
.execute(pipelineElement, pipeline.getPipelineId()).isSuccess();
new SecretService(new SecretEncrypter()).apply(pipelineElement);
} catch (NoServiceEndpointsAvailableException e) {
@@ -151,7 +156,7 @@ public class PipelineHealthCheck {
}
});
if (shouldUpdatePipeline.get()) {
- var currentPipeline = getPipeline(pipeline.getPipelineId());
+ var currentPipeline = resourceProvider.pipelineStorage().getElementById(pipeline.getPipelineId());
if (!failedInstances.isEmpty()) {
currentPipeline.setHealthStatus(PipelineHealthStatus.FAILURE);
pipelinesStats.failedIncrease();
diff --git a/streampipes-health-monitoring/src/main/java/org/apache/streampipes/health/monitoring/ServiceHealthCheck.java b/streampipes-health-monitoring/src/main/java/org/apache/streampipes/health/monitoring/ServiceHealthCheck.java
index ecc6bca663..e3571cebed 100644
--- a/streampipes-health-monitoring/src/main/java/org/apache/streampipes/health/monitoring/ServiceHealthCheck.java
+++ b/streampipes-health-monitoring/src/main/java/org/apache/streampipes/health/monitoring/ServiceHealthCheck.java
@@ -27,6 +27,7 @@ import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequestTarg
import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequests;
import org.apache.streampipes.model.extensions.svcdiscovery.SpServiceRegistration;
import org.apache.streampipes.model.extensions.svcdiscovery.SpServiceStatus;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.storage.api.system.IExtensionsServiceStorage;
import org.apache.http.HttpStatus;
@@ -46,13 +47,16 @@ public class ServiceHealthCheck implements Runnable {
private final int maxUnhealthyDurationBeforeRemovalMs;
private final List<SpServiceRegistration> needDeletedServices = new ArrayList<>();
+ private final SpResourceManager resourceManager;
public ServiceHealthCheck(IExtensionsServiceStorage storage,
- ExtensionServiceRequestManager extensionRequestManager) {
+ ExtensionServiceRequestManager extensionRequestManager,
+ SpResourceManager resourceManager) {
this.extensionRequestManager = extensionRequestManager;
this.serviceRegistrationManager = new ServiceRegistrationManager(storage);
this.maxUnhealthyDurationBeforeRemovalMs = Environments.getEnvironment()
.getUnhealthyTimeBeforeServiceDeletionInMillis().getValueOrDefault();
+ this.resourceManager = resourceManager;
}
@Override
@@ -77,7 +81,9 @@ public class ServiceHealthCheck implements Runnable {
var requestTarget = makeHealthCheckRequestTarget(service);
try {
- var response = extensionRequestManager.request(ExtensionServiceRequests.serviceHealth(requestTarget));
+ var response = extensionRequestManager.request(
+ ExtensionServiceRequests.serviceHealth(requestTarget, resourceManager)
+ );
if (response.statusCode() != HttpStatus.SC_OK) {
processUnhealthyService(service);
} else {
diff --git a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/api/extensions/ExtensionServiceRequests.java b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/api/extensions/ExtensionServiceRequests.java
index 313139d094..65aafe6dfe 100644
--- a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/api/extensions/ExtensionServiceRequests.java
+++ b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/api/extensions/ExtensionServiceRequests.java
@@ -46,30 +46,36 @@ public final class ExtensionServiceRequests {
return ExtensionServiceRequest.delete(target, authToken);
}
- public static ExtensionServiceRequest containerProvidedOptions(ExtensionServiceRequestTarget target, String payload) {
- return post(target, payload, AuthTokenUtils.getAuthTokenForCurrentUser());
+ public static ExtensionServiceRequest containerProvidedOptions(ExtensionServiceRequestTarget target,
+ String payload,
+ String authToken) {
+ return post(target, payload, authToken);
}
public static ExtensionServiceRequest migration(ExtensionServiceRequestTarget target, String payload) {
return post(target, payload, AuthTokenUtils.getAuthTokenForCurrentUser());
}
- public static ExtensionServiceRequest descriptionUpdate(ExtensionServiceRequestTarget target) {
- return get(target, serviceAdminToken());
+ public static ExtensionServiceRequest descriptionUpdate(ExtensionServiceRequestTarget target,
+ SpResourceManager resourceManager) {
+ return get(target, serviceAdminToken(resourceManager));
}
- public static ExtensionServiceRequest extensionDescription(ExtensionServiceRequestTarget target) {
- return get(target, serviceAdminToken());
+ public static ExtensionServiceRequest extensionDescription(ExtensionServiceRequestTarget target,
+ SpResourceManager resourceManager) {
+ return get(target, serviceAdminToken(resourceManager));
}
- public static ExtensionServiceRequest functionStop(ExtensionServiceRequestTarget target) {
- return post(target, null, serviceAdminToken());
+ public static ExtensionServiceRequest functionStop(ExtensionServiceRequestTarget target,
+ SpResourceManager resourceManager) {
+ return post(target, null, serviceAdminToken(resourceManager));
}
public static ExtensionServiceRequest adapterStateChange(ExtensionServiceRequestTarget target,
String elementId,
- String payload) {
- return post(target, payload, AuthTokenUtils.getAuthToken(elementId));
+ String payload,
+ SpResourceManager resourceManager) {
+ return post(target, payload, AuthTokenUtils.getAuthToken(elementId, resourceManager));
}
public static ExtensionServiceRequest runtimeOptions(ExtensionServiceRequestTarget target, String payload) {
@@ -80,27 +86,31 @@ public final class ExtensionServiceRequests {
return post(target, payload, AuthTokenUtils.getAuthTokenForCurrentUser());
}
- public static ExtensionServiceRequest extensionInstanceHealth(ExtensionServiceRequestTarget target) {
- return get(target, serviceAdminToken());
+ public static ExtensionServiceRequest extensionInstanceHealth(ExtensionServiceRequestTarget target,
+ SpResourceManager resourceManager) {
+ return get(target, serviceAdminToken(resourceManager));
}
- public static ExtensionServiceRequest serviceHealth(ExtensionServiceRequestTarget target) {
- return get(target, serviceAdminToken());
+ public static ExtensionServiceRequest serviceHealth(ExtensionServiceRequestTarget target,
+ SpResourceManager resourceManager) {
+ return get(target, serviceAdminToken(resourceManager));
}
- public static ExtensionServiceRequest serviceLoad(ExtensionServiceRequestTarget target) {
- return get(target, serviceAdminToken());
+ public static ExtensionServiceRequest serviceLoad(ExtensionServiceRequestTarget target,
+ SpResourceManager resourceManager) {
+ return get(target, serviceAdminToken(resourceManager));
}
public static ExtensionServiceRequest pipelineElementInvocation(ExtensionServiceRequestTarget target,
- String pipelineId,
- String payload) {
- return post(target, payload, AuthTokenUtils.getAuthToken(pipelineId));
+ String payload,
+ String authToken) {
+ return post(target, payload, authToken);
}
public static ExtensionServiceRequest pipelineElementDetach(ExtensionServiceRequestTarget target,
- String pipelineId) {
- return delete(target, AuthTokenUtils.getAuthToken(pipelineId));
+ String pipelineId,
+ SpResourceManager resourceManager) {
+ return delete(target, AuthTokenUtils.getAuthToken(pipelineId, resourceManager));
}
public static ExtensionServiceRequest pipelineElementAssets(ExtensionServiceRequestTarget target) {
@@ -127,7 +137,9 @@ public final class ExtensionServiceRequests {
return post(target, payload, null);
}
- private static String serviceAdminToken() {
- return AuthTokenUtils.getAuthTokenForUser(new SpResourceManager().manageUsers().getServiceAdmin().getPrincipalId());
+ private static String serviceAdminToken(SpResourceManager resourceManager) {
+ return AuthTokenUtils.getAuthTokenForUser(
+ resourceManager.manageUsers().getServiceAdmin().getPrincipalId(),
+ resourceManager.manageUsers());
}
}
diff --git a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/PipelineExecutionTaskFactory.java b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/PipelineExecutionTaskFactory.java
index 7cb9fa9c87..13e3fc7bfd 100644
--- a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/PipelineExecutionTaskFactory.java
+++ b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/PipelineExecutionTaskFactory.java
@@ -30,6 +30,7 @@ import org.apache.streampipes.manager.execution.task.SubmitRequestTask;
import org.apache.streampipes.manager.execution.task.UpdateGroupIdTask;
import org.apache.streampipes.model.message.PipelineStatusMessageType;
import org.apache.streampipes.model.pipeline.Pipeline;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.resource.management.secret.SecretProvider;
import java.util.List;
@@ -37,12 +38,13 @@ import java.util.List;
public class PipelineExecutionTaskFactory {
public static List<PipelineExecutionTask> makeStartPipelineTasks(Pipeline pipeline,
- ExtensionServiceRequestManager requestManager) {
+ ExtensionServiceRequestManager requestManager,
+ SpResourceManager resourceManager) {
return List.of(
new UpdateGroupIdTask(),
new SecretEncryptionTask(SecretProvider.getDecryptionService()),
new DiscoverEndpointsTask(),
- new SubmitRequestTask(new InvokePipelineElementSubmitter(pipeline, requestManager)),
+ new SubmitRequestTask(new InvokePipelineElementSubmitter(pipeline, requestManager, resourceManager)),
new SecretEncryptionTask(SecretProvider.getEncryptionService()),
new AfterInvocationTask(PipelineStatusMessageType.PIPELINE_STARTED),
new StorePipelineStatusTask(true, false)
@@ -51,9 +53,10 @@ public class PipelineExecutionTaskFactory {
public static List<PipelineExecutionTask> makeStopPipelineTasks(Pipeline pipeline,
boolean forceStop,
- ExtensionServiceRequestManager requestManager) {
+ ExtensionServiceRequestManager requestManager,
+ SpResourceManager resourceManager) {
return List.of(
- new SubmitRequestTask(new DetachPipelineElementSubmitter(pipeline, requestManager)),
+ new SubmitRequestTask(new DetachPipelineElementSubmitter(pipeline, requestManager, resourceManager)),
new AfterInvocationTask(PipelineStatusMessageType.PIPELINE_STOPPED),
new StorePipelineStatusTask(false, forceStop)
);
diff --git a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/PipelineExecutor.java b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/PipelineExecutor.java
index 38778cdfbd..6c6c46dce8 100644
--- a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/PipelineExecutor.java
+++ b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/PipelineExecutor.java
@@ -22,6 +22,7 @@ import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequestMana
import org.apache.streampipes.manager.execution.task.PipelineExecutionTask;
import org.apache.streampipes.model.pipeline.Pipeline;
import org.apache.streampipes.model.pipeline.PipelineOperationStatus;
+import org.apache.streampipes.resource.management.SpResourceManager;
import java.util.List;
@@ -29,19 +30,23 @@ public class PipelineExecutor {
private final Pipeline pipeline;
private final ExtensionServiceRequestManager requestManager;
+ private final SpResourceManager resourceManager;
public PipelineExecutor(Pipeline pipeline,
- ExtensionServiceRequestManager requestManager) {
+ ExtensionServiceRequestManager requestManager,
+ SpResourceManager resourceManager) {
this.pipeline = pipeline;
this.requestManager = requestManager;
+ this.resourceManager = resourceManager;
}
public PipelineOperationStatus startPipeline() {
- return executeOperation(PipelineExecutionTaskFactory.makeStartPipelineTasks(pipeline, requestManager));
+ return executeOperation(PipelineExecutionTaskFactory.makeStartPipelineTasks(pipeline, requestManager, resourceManager));
}
public PipelineOperationStatus stopPipeline(boolean forceStop) {
- return executeOperation(PipelineExecutionTaskFactory.makeStopPipelineTasks(pipeline, forceStop, requestManager));
+ return executeOperation(PipelineExecutionTaskFactory
+ .makeStopPipelineTasks(pipeline, forceStop, requestManager, resourceManager));
}
private PipelineOperationStatus executeOperation(List<PipelineExecutionTask> executionTasks) {
diff --git a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/http/BasePipelineElementSubmitter.java b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/http/BasePipelineElementSubmitter.java
index 1914d9c755..7c4740c81a 100644
--- a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/http/BasePipelineElementSubmitter.java
+++ b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/http/BasePipelineElementSubmitter.java
@@ -23,6 +23,7 @@ import org.apache.streampipes.model.base.InvocableStreamPipesEntity;
import org.apache.streampipes.model.pipeline.Pipeline;
import org.apache.streampipes.model.pipeline.PipelineElementStatus;
import org.apache.streampipes.model.pipeline.PipelineOperationStatus;
+import org.apache.streampipes.resource.management.SpResourceManager;
import java.util.List;
@@ -33,13 +34,16 @@ public abstract class BasePipelineElementSubmitter {
protected final PipelineOperationStatus status;
protected final ExtensionServiceRequestManager requestManager;
+ protected final SpResourceManager resourceManager;
public BasePipelineElementSubmitter(Pipeline pipeline,
- ExtensionServiceRequestManager requestManager) {
+ ExtensionServiceRequestManager requestManager,
+ SpResourceManager resourceManager) {
this.pipelineId = pipeline.getPipelineId();
this.pipelineName = pipeline.getName();
this.status = new PipelineOperationStatus(pipelineId, pipelineName);
this.requestManager = requestManager;
+ this.resourceManager = resourceManager;
}
public PipelineOperationStatus submit(List<InvocableStreamPipesEntity> processorsAndSinks) {
@@ -67,7 +71,7 @@ public abstract class BasePipelineElementSubmitter {
}
protected PipelineElementStatus performDetach(InvocableStreamPipesEntity pipelineElement) {
- return new DetachExtensionRequest(requestManager).execute(pipelineElement, this.pipelineId);
+ return new DetachExtensionRequest(requestManager, resourceManager).execute(pipelineElement, this.pipelineId);
}
protected abstract PipelineElementStatus submitElement(InvocableStreamPipesEntity pipelineElement);
diff --git a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/http/DetachExtensionRequest.java b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/http/DetachExtensionRequest.java
index b90fbc5a4d..a9aee6fd2f 100644
--- a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/http/DetachExtensionRequest.java
+++ b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/http/DetachExtensionRequest.java
@@ -25,6 +25,7 @@ import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequestTarg
import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequests;
import org.apache.streampipes.manager.execution.endpoint.ExtensionsServiceEndpointUtils;
import org.apache.streampipes.model.base.InvocableStreamPipesEntity;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -36,8 +37,9 @@ public class DetachExtensionRequest extends PipelineElementExtensionRequest {
private static final Logger LOG = LoggerFactory.getLogger(DetachExtensionRequest.class);
- public DetachExtensionRequest(ExtensionServiceRequestManager requestManager) {
- super(requestManager);
+ public DetachExtensionRequest(ExtensionServiceRequestManager requestManager,
+ SpResourceManager resourceManager) {
+ super(requestManager, resourceManager);
}
@Override
@@ -54,7 +56,7 @@ public class DetachExtensionRequest extends PipelineElementExtensionRequest {
instanceId
);
return requestManager().request(
- ExtensionServiceRequests.pipelineElementDetach(requestTarget, pipelineId)
+ ExtensionServiceRequests.pipelineElementDetach(requestTarget, pipelineId, resourceManager)
);
}
diff --git a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/http/DetachPipelineElementSubmitter.java b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/http/DetachPipelineElementSubmitter.java
index 97a51706ed..5718a9d7b3 100644
--- a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/http/DetachPipelineElementSubmitter.java
+++ b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/http/DetachPipelineElementSubmitter.java
@@ -22,14 +22,16 @@ import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequestMana
import org.apache.streampipes.model.base.InvocableStreamPipesEntity;
import org.apache.streampipes.model.pipeline.Pipeline;
import org.apache.streampipes.model.pipeline.PipelineElementStatus;
+import org.apache.streampipes.resource.management.SpResourceManager;
import java.util.List;
public class DetachPipelineElementSubmitter extends BasePipelineElementSubmitter {
public DetachPipelineElementSubmitter(Pipeline pipeline,
- ExtensionServiceRequestManager requestManager) {
- super(pipeline, requestManager);
+ ExtensionServiceRequestManager requestManager,
+ SpResourceManager resourceManager) {
+ super(pipeline, requestManager, resourceManager);
}
@Override
diff --git a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/http/InvokeExtensionRequest.java b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/http/InvokeExtensionRequest.java
index f2baf6fc07..96a7023683 100644
--- a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/http/InvokeExtensionRequest.java
+++ b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/http/InvokeExtensionRequest.java
@@ -23,8 +23,10 @@ import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequestMana
import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequestTargets;
import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequests;
import org.apache.streampipes.manager.execution.endpoint.ExtensionsServiceEndpointUtils;
+import org.apache.streampipes.manager.util.AuthTokenUtils;
import org.apache.streampipes.model.api.EndpointSelectable;
import org.apache.streampipes.model.base.InvocableStreamPipesEntity;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.serializers.json.JacksonSerializer;
import com.fasterxml.jackson.core.JsonProcessingException;
@@ -37,8 +39,9 @@ public class InvokeExtensionRequest extends PipelineElementExtensionRequest {
private static final Logger LOG = LoggerFactory.getLogger(InvokeExtensionRequest.class);
- public InvokeExtensionRequest(ExtensionServiceRequestManager requestManager) {
- super(requestManager);
+ public InvokeExtensionRequest(ExtensionServiceRequestManager requestManager,
+ SpResourceManager resourceManager) {
+ super(requestManager, resourceManager);
}
@Override
@@ -52,8 +55,10 @@ public class InvokeExtensionRequest extends PipelineElementExtensionRequest {
provider,
pipelineElement.getAppId()
);
+ var authToken = AuthTokenUtils.getAuthToken(pipelineId, resourceManager);
return requestManager().request(
- ExtensionServiceRequests.pipelineElementInvocation(requestTarget, pipelineId, toJson(pipelineElement))
+ ExtensionServiceRequests
+ .pipelineElementInvocation(requestTarget, toJson(pipelineElement), authToken)
);
}
diff --git a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/http/InvokePipelineElementSubmitter.java b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/http/InvokePipelineElementSubmitter.java
index 6ce44ef8d9..f8e57cc83f 100644
--- a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/http/InvokePipelineElementSubmitter.java
+++ b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/http/InvokePipelineElementSubmitter.java
@@ -23,6 +23,7 @@ import org.apache.streampipes.model.base.InvocableStreamPipesEntity;
import org.apache.streampipes.model.pipeline.Pipeline;
import org.apache.streampipes.model.pipeline.PipelineElementStatus;
import org.apache.streampipes.model.pipeline.PipelineOperationStatus;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -35,13 +36,14 @@ public class InvokePipelineElementSubmitter extends BasePipelineElementSubmitter
private static final Logger LOG = LoggerFactory.getLogger(InvokePipelineElementSubmitter.class);
public InvokePipelineElementSubmitter(Pipeline pipeline,
- ExtensionServiceRequestManager requestManager) {
- super(pipeline, requestManager);
+ ExtensionServiceRequestManager requestManager,
+ SpResourceManager resourceManager) {
+ super(pipeline, requestManager, resourceManager);
}
@Override
protected PipelineElementStatus submitElement(InvocableStreamPipesEntity pipelineElement) {
- return new InvokeExtensionRequest(requestManager).execute(pipelineElement, this.pipelineId);
+ return new InvokeExtensionRequest(requestManager, resourceManager).execute(pipelineElement, this.pipelineId);
}
@Override
diff --git a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/http/PipelineElementExtensionRequest.java b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/http/PipelineElementExtensionRequest.java
index 6592a1a9be..081a07bb7e 100644
--- a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/http/PipelineElementExtensionRequest.java
+++ b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/http/PipelineElementExtensionRequest.java
@@ -23,6 +23,7 @@ import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequestMana
import org.apache.streampipes.model.api.EndpointSelectable;
import org.apache.streampipes.model.base.InvocableStreamPipesEntity;
import org.apache.streampipes.model.pipeline.PipelineElementStatus;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.serializers.json.JacksonSerializer;
import com.google.gson.JsonSyntaxException;
@@ -32,9 +33,12 @@ import java.io.IOException;
public abstract class PipelineElementExtensionRequest {
private final ExtensionServiceRequestManager requestManager;
+ protected final SpResourceManager resourceManager;
- public PipelineElementExtensionRequest(ExtensionServiceRequestManager requestManager) {
+ public PipelineElementExtensionRequest(ExtensionServiceRequestManager requestManager,
+ SpResourceManager resourceManager) {
this.requestManager = requestManager;
+ this.resourceManager = resourceManager;
}
public PipelineElementStatus execute(InvocableStreamPipesEntity pipelineElement,
diff --git a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/extensions/ExtensionItemInstaller.java b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/extensions/ExtensionItemInstaller.java
index 5a1b05b9dd..0420bebe86 100644
--- a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/extensions/ExtensionItemInstaller.java
+++ b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/extensions/ExtensionItemInstaller.java
@@ -26,6 +26,7 @@ import org.apache.streampipes.manager.verification.extractor.TypeExtractor;
import org.apache.streampipes.model.extensions.ExtensionItemInstallationRequest;
import org.apache.streampipes.model.extensions.svcdiscovery.SpServiceRegistration;
import org.apache.streampipes.model.message.Message;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.svcdiscovery.api.model.SpServiceUrlProvider;
import java.io.IOException;
@@ -34,24 +35,29 @@ public class ExtensionItemInstaller {
private final ExtensionServiceRequestManager requestManager;
private final SpServiceRegistration service;
+ private final SpResourceManager resourceManager;
public ExtensionItemInstaller(SpServiceRegistration service,
- ExtensionServiceRequestManager requestManager) {
+ ExtensionServiceRequestManager requestManager,
+ SpResourceManager resourceManager) {
this.requestManager = requestManager;
this.service = service;
+ this.resourceManager = resourceManager;
}
public Message installExtension(ExtensionItemInstallationRequest req,
String principalSid) throws IOException, SepaParseException {
var requestTarget = getDescriptionRequestTarget(req);
var description = fetchDescription(requestTarget);
- return new TypeExtractor(description, requestManager).getTypeVerifier().verifyAndAdd(principalSid, req.publicElement());
+ return new TypeExtractor(description, requestManager,
+ resourceManager.managePermissions()).getTypeVerifier().verifyAndAdd(principalSid, req.publicElement());
}
public Message updateExtension(ExtensionItemInstallationRequest req) throws IOException, SepaParseException {
var requestTarget = getDescriptionRequestTarget(req);
var description = fetchDescription(requestTarget);
- return new TypeExtractor(description, requestManager).getTypeVerifier().verifyAndUpdate();
+ return new TypeExtractor(description, requestManager,
+ resourceManager.managePermissions()).getTypeVerifier().verifyAndUpdate();
}
private ExtensionServiceRequestTarget getDescriptionRequestTarget(ExtensionItemInstallationRequest req) {
@@ -63,6 +69,8 @@ public class ExtensionItemInstaller {
}
private String fetchDescription(ExtensionServiceRequestTarget requestTarget) throws IOException {
- return requestManager.request(ExtensionServiceRequests.extensionDescription(requestTarget)).responseBody();
+ return requestManager.request(
+ ExtensionServiceRequests.extensionDescription(requestTarget, resourceManager)
+ ).responseBody();
}
}
diff --git a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/function/FunctionManager.java b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/function/FunctionManager.java
index 9194141095..776c8a91a6 100644
--- a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/function/FunctionManager.java
+++ b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/function/FunctionManager.java
@@ -24,6 +24,7 @@ import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequests;
import org.apache.streampipes.model.extensions.svcdiscovery.SpServiceRegistration;
import org.apache.streampipes.model.function.FunctionState;
import org.apache.streampipes.model.function.FunctionsShutdownResponse;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.serializers.json.JacksonSerializer;
import org.apache.streampipes.storage.api.function.IFunctionStateStorage;
import org.apache.streampipes.storage.management.StorageDispatcher;
@@ -38,9 +39,12 @@ public class FunctionManager {
private static final Logger LOG = LoggerFactory.getLogger(FunctionManager.class);
private final ExtensionServiceRequestManager requestManager;
+ private final SpResourceManager resourceManager;
- public FunctionManager(ExtensionServiceRequestManager requestManager) {
+ public FunctionManager(ExtensionServiceRequestManager requestManager,
+ SpResourceManager resourceManager) {
this.requestManager = requestManager;
+ this.resourceManager = resourceManager;
}
public void stopAllFunctionsAndPersistState(IFunctionStateStorage functionStateStorage) {
@@ -60,7 +64,7 @@ public class FunctionManager {
try {
LOG.info("Triggering function stop at {}", requestTarget.baseUrl());
- var response = requestManager.request(ExtensionServiceRequests.functionStop(requestTarget));
+ var response = requestManager.request(ExtensionServiceRequests.functionStop(requestTarget, resourceManager));
int statusCode = response.statusCode();
if (statusCode >= 200 && statusCode < 300) {
diff --git a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/migration/AbstractMigrationManager.java b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/migration/AbstractMigrationManager.java
index 51ff8fd4c3..6edbf49142 100644
--- a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/migration/AbstractMigrationManager.java
+++ b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/migration/AbstractMigrationManager.java
@@ -31,6 +31,7 @@ import org.apache.streampipes.model.extensions.svcdiscovery.SpServiceTagPrefix;
import org.apache.streampipes.model.message.Notification;
import org.apache.streampipes.model.migration.MigrationResult;
import org.apache.streampipes.model.migration.ModelMigratorConfig;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.serializers.json.JacksonSerializer;
import com.fasterxml.jackson.core.JsonProcessingException;
@@ -50,9 +51,12 @@ public abstract class AbstractMigrationManager {
private static final Logger LOG = LoggerFactory.getLogger(AbstractMigrationManager.class);
protected final ExtensionServiceRequestManager requestManager;
+ protected final SpResourceManager resourceManager;
- protected AbstractMigrationManager(ExtensionServiceRequestManager requestManager) {
+ protected AbstractMigrationManager(ExtensionServiceRequestManager requestManager,
+ SpResourceManager resourceManager) {
this.requestManager = requestManager;
+ this.resourceManager = resourceManager;
}
/**
@@ -151,9 +155,10 @@ public abstract class AbstractMigrationManager {
try {
var entityPayload = requestManager
- .request(ExtensionServiceRequests.descriptionUpdate(requestTarget))
+ .request(ExtensionServiceRequests.descriptionUpdate(requestTarget, resourceManager))
.responseBody();
- var updateResult = new TypeExtractor(entityPayload, requestManager).getTypeVerifier().verifyAndUpdate();
+ var updateResult = new TypeExtractor(entityPayload, requestManager, resourceManager.managePermissions())
+ .getTypeVerifier().verifyAndUpdate();
if (!updateResult.isSuccess()) {
LOG.error(
"Updating the pipeline element description failed: {}",
diff --git a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/migration/PipelineElementMigrationManager.java b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/migration/PipelineElementMigrationManager.java
index 15b7bef432..83bfba1019 100644
--- a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/migration/PipelineElementMigrationManager.java
+++ b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/migration/PipelineElementMigrationManager.java
@@ -33,6 +33,7 @@ import org.apache.streampipes.model.migration.ModelMigratorConfig;
import org.apache.streampipes.model.pipeline.Pipeline;
import org.apache.streampipes.model.pipeline.PipelineHealthStatus;
import org.apache.streampipes.model.staticproperty.StaticProperty;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.storage.api.pipeline.IDataProcessorStorage;
import org.apache.streampipes.storage.api.pipeline.IDataSinkStorage;
import org.apache.streampipes.storage.api.pipeline.IPipelineStorage;
@@ -59,8 +60,9 @@ public class PipelineElementMigrationManager extends AbstractMigrationManager im
public PipelineElementMigrationManager(IPipelineStorage pipelineStorage,
IDataProcessorStorage dataProcessorStorage,
IDataSinkStorage dataSinkStorage,
- ExtensionServiceRequestManager extensionServiceRequestManager) {
- super(extensionServiceRequestManager);
+ ExtensionServiceRequestManager extensionServiceRequestManager,
+ SpResourceManager resourceManager) {
+ super(extensionServiceRequestManager, resourceManager);
this.pipelineStorage = pipelineStorage;
this.dataProcessorStorage = dataProcessorStorage;
this.dataSinkStorage = dataSinkStorage;
@@ -181,7 +183,7 @@ public class PipelineElementMigrationManager extends AbstractMigrationManager im
public void stopPipeline(Pipeline pipeline) {
- var pipelineExecutor = new PipelineExecutor(pipeline, requestManager);
+ var pipelineExecutor = new PipelineExecutor(pipeline, requestManager, resourceManager);
var pipelineStopResult = pipelineExecutor.stopPipeline(true);
if (pipelineStopResult.isSuccess()) {
diff --git a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/pipeline/ExtensionsServiceLogExecutor.java b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/pipeline/ExtensionsServiceLogExecutor.java
index e11f0f2552..bd6d525a1d 100644
--- a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/pipeline/ExtensionsServiceLogExecutor.java
+++ b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/pipeline/ExtensionsServiceLogExecutor.java
@@ -31,6 +31,7 @@ import org.apache.streampipes.model.extensions.svcdiscovery.SpServiceRegistratio
import org.apache.streampipes.model.graph.DataProcessorInvocation;
import org.apache.streampipes.model.graph.DataSinkInvocation;
import org.apache.streampipes.model.monitoring.SpEndpointMonitoringInfo;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.serializers.json.JacksonSerializer;
import org.apache.streampipes.svcdiscovery.SpServiceDiscovery;
import org.apache.streampipes.svcdiscovery.api.model.DefaultSpServiceTypes;
@@ -52,9 +53,12 @@ public class ExtensionsServiceLogExecutor implements Runnable {
private static final PipelineFlowStats pipelineFlowStats = new PipelineFlowStats();
private final ExtensionServiceRequestManager extensionRequestManager;
+ private final SpResourceManager resourceManager;
- public ExtensionsServiceLogExecutor(ExtensionServiceRequestManager extensionRequestManager) {
+ public ExtensionsServiceLogExecutor(ExtensionServiceRequestManager extensionRequestManager,
+ SpResourceManager resourceManager) {
this.extensionRequestManager = Objects.requireNonNull(extensionRequestManager);
+ this.resourceManager = resourceManager;
}
public void run() {
@@ -68,7 +72,7 @@ public class ExtensionsServiceLogExecutor implements Runnable {
serviceEndpoints.forEach(serviceEndpoint -> {
try {
var target = ExtensionServiceRequestTargets.serviceHealth(serviceEndpoint, LOG_PATH);
- var response = extensionRequestManager.request(ExtensionServiceRequests.serviceHealth(target));
+ var response = extensionRequestManager.request(ExtensionServiceRequests.serviceHealth(target, resourceManager));
if (!response.isSuccess()) {
LOG.info("Could not fetch log info from endpoint {} (status {})",
diff --git a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/pipeline/PipelineManager.java b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/pipeline/PipelineManager.java
index 23bbfec454..25ae6ac130 100644
--- a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/pipeline/PipelineManager.java
+++ b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/pipeline/PipelineManager.java
@@ -29,9 +29,8 @@ import org.apache.streampipes.model.pipeline.Pipeline;
import org.apache.streampipes.model.pipeline.PipelineHealthStatus;
import org.apache.streampipes.model.pipeline.PipelineOperationStatus;
import org.apache.streampipes.resource.management.CrudResourceManager;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.storage.api.pipeline.IPipelineStorage;
-import org.apache.streampipes.storage.api.user.IPermissionStorage;
-import org.apache.streampipes.storage.management.StorageDispatcher;
import java.util.ArrayList;
import java.util.Date;
@@ -42,15 +41,22 @@ import java.util.stream.Stream;
public class PipelineManager {
+ private final SpResourceManager resourceManager;
+ private final IPipelineStorage pipelineStorage;
+
+ public PipelineManager(IPipelineStorage pipelineStorage,
+ SpResourceManager resourceManager) {
+ this.pipelineStorage = pipelineStorage;
+ this.resourceManager = resourceManager;
+ }
+
/**
* Returns all pipelines
*
* @return all pipelines
*/
- public static List<Pipeline> getAllPipelines() {
- return StorageDispatcher.INSTANCE.getNoSqlStore()
- .getPipelineStorageAPI()
- .findAll();
+ public List<Pipeline> getAllPipelines() {
+ return pipelineStorage.findAll();
}
/**
@@ -59,8 +65,8 @@ public class PipelineManager {
* @param pipelineId id of pipeline
* @return pipeline resulting pipeline with given id
*/
- public static Pipeline getPipeline(String pipelineId) {
- return getPipelineStorage().getElementById(pipelineId);
+ public Pipeline getPipeline(String pipelineId) {
+ return pipelineStorage.getElementById(pipelineId);
}
/**
@@ -70,7 +76,7 @@ public class PipelineManager {
* @param pipeline to be added
* @return pipelineId of the stored pipeline
*/
- public static String addPipeline(
+ public String addPipeline(
String principalSid,
Pipeline pipeline
) {
@@ -82,7 +88,7 @@ public class PipelineManager {
new PipelineStorageService(pipeline).addPipeline();
Permission permission = new PermissionManager().makePermission(pipeline, principalSid);
- getPermissionStorage().persist(permission);
+ resourceManager.managePermissions().create(permission);
return pipelineId;
}
@@ -93,10 +99,10 @@ public class PipelineManager {
* @param pipelineId of pipeline to be started
* @return pipeline status of the start operation
*/
- public static PipelineOperationStatus startPipeline(String pipelineId,
+ public PipelineOperationStatus startPipeline(String pipelineId,
ExtensionServiceRequestManager requestManager) {
Pipeline pipeline = getPipeline(pipelineId);
- return new PipelineExecutor(pipeline, requestManager).startPipeline();
+ return new PipelineExecutor(pipeline, requestManager, resourceManager).startPipeline();
}
/**
@@ -108,14 +114,14 @@ public class PipelineManager {
* containers could be reached
* @return pipeline status of the start operation
*/
- public static PipelineOperationStatus stopPipeline(
+ public PipelineOperationStatus stopPipeline(
String pipelineId,
boolean forceStop,
ExtensionServiceRequestManager requestManager
) {
Pipeline pipeline = getPipeline(pipelineId);
- return new PipelineExecutor(pipeline, requestManager).stopPipeline(forceStop);
+ return new PipelineExecutor(pipeline, requestManager, resourceManager).stopPipeline(forceStop);
}
/**
@@ -123,8 +129,10 @@ public class PipelineManager {
*
* @param pipelineId of pipeline to be deleted
*/
- public static void deletePipeline(String pipelineId) {
- var pipelineCrudResourceManager = new CrudResourceManager<>(getPipelineStorage(), Pipeline.class);
+ public void deletePipeline(String pipelineId) {
+ var pipelineCrudResourceManager = new CrudResourceManager<>(
+ pipelineStorage, Pipeline.class, resourceManager.managePermissions()
+ );
var pipeline = getPipeline(pipelineId);
if (Objects.nonNull(pipeline)) {
@@ -132,16 +140,14 @@ public class PipelineManager {
}
}
- public static List<PipelineOperationStatus> stopAllPipelines(boolean forceStop,
+ public List<PipelineOperationStatus> stopAllPipelines(boolean forceStop,
ExtensionServiceRequestManager requestManager) {
List<PipelineOperationStatus> status = new ArrayList<>();
- List<Pipeline> pipelines = StorageDispatcher.INSTANCE.getNoSqlStore()
- .getPipelineStorageAPI()
- .findAll();
+ List<Pipeline> pipelines = pipelineStorage.findAll();
pipelines.forEach(p -> {
if (p.isRunning()) {
- status.add(new PipelineExecutor(p, requestManager).stopPipeline(forceStop));
+ status.add(new PipelineExecutor(p, requestManager, resourceManager).stopPipeline(forceStop));
}
});
return status;
@@ -153,8 +159,8 @@ public class PipelineManager {
* @param elementId the id of the processing Element
* @return all pipelines containing the element
*/
- public static List<Pipeline> getPipelinesContainingElements(String elementId) {
- return PipelineManager.getAllPipelines()
+ public List<Pipeline> getPipelinesContainingElements(String elementId) {
+ return getAllPipelines()
.stream()
.filter(pipeline -> mergePipelineElement(pipeline)
.anyMatch(el -> el.getElementId()
@@ -162,7 +168,7 @@ public class PipelineManager {
.collect(Collectors.toList());
}
- private static Stream<? extends NamedStreamPipesEntity> mergePipelineElement(Pipeline pipeline) {
+ private Stream<? extends NamedStreamPipesEntity> mergePipelineElement(Pipeline pipeline) {
return Stream.concat(
Stream.concat(
pipeline.getStreams()
@@ -175,7 +181,7 @@ public class PipelineManager {
);
}
- private static void preparePipelineBasics(
+ private void preparePipelineBasics(
String username,
Pipeline pipeline,
String pipelineId
@@ -190,14 +196,4 @@ public class PipelineManager {
pipeline.getActions()
.forEach(action -> action.setCorrespondingUser(username));
}
-
- private static IPipelineStorage getPipelineStorage() {
- return StorageDispatcher.INSTANCE.getNoSqlStore()
- .getPipelineStorageAPI();
- }
-
- private static IPermissionStorage getPermissionStorage() {
- return StorageDispatcher.INSTANCE.getNoSqlStore()
- .getPermissionStorage();
- }
}
diff --git a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/pipeline/update/DataStreamUpdateManagement.java b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/pipeline/update/DataStreamUpdateManagement.java
index 452b0e7678..a6454d78b4 100644
--- a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/pipeline/update/DataStreamUpdateManagement.java
+++ b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/pipeline/update/DataStreamUpdateManagement.java
@@ -18,11 +18,9 @@
package org.apache.streampipes.manager.pipeline.update;
-import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequestManager;
import org.apache.streampipes.model.SpDataStream;
import org.apache.streampipes.model.connect.adapter.PipelineUpdateInfo;
import org.apache.streampipes.resource.management.DataStreamResourceManager;
-import org.apache.streampipes.resource.management.SpResourceManager;
import java.util.List;
@@ -31,10 +29,10 @@ public class DataStreamUpdateManagement {
private final DataStreamResourceManager dataStreamResourceManager;
private final PipelineUpdateCoordinator pipelineUpdateCoordinator;
- public DataStreamUpdateManagement(ExtensionServiceRequestManager requestManager,
- ChartSchemaUpdateCoordinator chartSchemaUpdateCoordinator) {
- this.dataStreamResourceManager = new SpResourceManager().manageDataStreams();
- this.pipelineUpdateCoordinator = new PipelineUpdateCoordinator(requestManager, chartSchemaUpdateCoordinator);
+ public DataStreamUpdateManagement(PipelineUpdateCoordinator pipelineUpdateCoordinator,
+ DataStreamResourceManager dataStreamResourceManager) {
+ this.dataStreamResourceManager = dataStreamResourceManager;
+ this.pipelineUpdateCoordinator = pipelineUpdateCoordinator;
}
public void updateDataStream(SpDataStream dataStream) {
diff --git a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/pipeline/update/PipelineUpdateCoordinator.java b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/pipeline/update/PipelineUpdateCoordinator.java
index 5a33381e50..46878ffa23 100644
--- a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/pipeline/update/PipelineUpdateCoordinator.java
+++ b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/pipeline/update/PipelineUpdateCoordinator.java
@@ -33,6 +33,7 @@ import org.apache.streampipes.model.pipeline.Pipeline;
import org.apache.streampipes.model.pipeline.PipelineElementValidationInfo;
import org.apache.streampipes.model.pipeline.PipelineHealthStatus;
import org.apache.streampipes.model.schema.EventSchema;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.storage.management.StorageDispatcher;
import org.slf4j.Logger;
@@ -51,11 +52,17 @@ public class PipelineUpdateCoordinator {
private final ExtensionServiceRequestManager requestManager;
private final ChartSchemaUpdateCoordinator chartSchemaUpdateCoordinator;
+ private final PipelineManager pipelineManager;
+ private final SpResourceManager resourceManager;
public PipelineUpdateCoordinator(ExtensionServiceRequestManager requestManager,
- ChartSchemaUpdateCoordinator chartSchemaUpdateCoordinator) {
+ SpResourceManager resourceManager,
+ ChartSchemaUpdateCoordinator chartSchemaUpdateCoordinator,
+ PipelineManager pipelineManager) {
this.requestManager = requestManager;
+ this.resourceManager = resourceManager;
this.chartSchemaUpdateCoordinator = chartSchemaUpdateCoordinator;
+ this.pipelineManager = pipelineManager;
}
public void updatePipelines(SpDataStream dataStream) {
@@ -96,15 +103,15 @@ public class PipelineUpdateCoordinator {
String updatedStreamName,
EventSchema updatedEventSchema,
String notificationType) {
- var affectedPipelines = PipelineManager.getPipelinesContainingElements(affectedElementId);
+ var affectedPipelines = pipelineManager.getPipelinesContainingElements(affectedElementId);
affectedPipelines.forEach(pipeline -> {
var shouldRestartPipeline = pipeline.isRunning();
if (shouldRestartPipeline) {
- new PipelineExecutor(pipeline, requestManager).stopPipeline(true);
+ new PipelineExecutor(pipeline, requestManager, resourceManager).stopPipeline(true);
}
- var storedPipeline = PipelineManager.getPipeline(pipeline.getPipelineId());
+ var storedPipeline = pipelineManager.getPipeline(pipeline.getPipelineId());
var updatedPipeline = updatePipeline(storedPipeline, affectedElementId, updatedStreamName, updatedEventSchema);
try {
@@ -132,7 +139,9 @@ public class PipelineUpdateCoordinator {
StorageDispatcher.INSTANCE.getNoSqlStore().getPipelineStorageAPI().updateElement(modifiedPipeline);
if (shouldRestartPipeline && canAutoMigrate) {
- new PipelineExecutor(PipelineManager.getPipeline(pipeline.getPipelineId()), requestManager).startPipeline();
+ new PipelineExecutor(
+ pipelineManager.getPipeline(pipeline.getPipelineId()), requestManager, resourceManager
+ ).startPipeline();
}
} catch (Exception e) {
LOG.error("Could not update pipeline {}", updatedPipeline.getName(), e);
@@ -143,7 +152,7 @@ public class PipelineUpdateCoordinator {
private List<PipelineUpdateInfo> checkPipelineMigrations(String affectedElementId,
String updatedStreamName,
EventSchema updatedEventSchema) {
- var affectedPipelines = PipelineManager.getPipelinesContainingElements(affectedElementId);
+ var affectedPipelines = pipelineManager.getPipelinesContainingElements(affectedElementId);
var pipelineUpdateInfos = new ArrayList<PipelineUpdateInfo>();
affectedPipelines.forEach(pipeline -> {
diff --git a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/preview/PipelinePreview.java b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/preview/PipelinePreview.java
index 68d089c236..e59fd27559 100644
--- a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/preview/PipelinePreview.java
+++ b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/preview/PipelinePreview.java
@@ -31,6 +31,7 @@ import org.apache.streampipes.model.extensions.svcdiscovery.SpServiceRegistratio
import org.apache.streampipes.model.graph.DataProcessorInvocation;
import org.apache.streampipes.model.pipeline.Pipeline;
import org.apache.streampipes.model.preview.PipelinePreviewModel;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
@@ -49,6 +50,12 @@ public class PipelinePreview {
private static final Logger LOG = LoggerFactory.getLogger(PipelinePreview.class);
+ private final SpResourceManager resourceManager;
+
+ public PipelinePreview(SpResourceManager resourceManager) {
+ this.resourceManager = resourceManager;
+ }
+
public PipelinePreviewModel initiatePreview(Pipeline pipeline,
ExtensionServiceRequestManager requestManager) {
String previewId = generatePreviewId();
@@ -146,7 +153,7 @@ public class PipelinePreview {
var service = findSelectedService(g);
g.setSelectedEndpointUrl(service.getServiceUrl());
g.setSelectedServiceId(service.getSvcId());
- new InvokeExtensionRequest(requestManager).execute(g, null);
+ new InvokeExtensionRequest(requestManager, resourceManager).execute(g, null);
} catch (NoServiceEndpointsAvailableException e) {
LOG.warn("No endpoint found for pipeline element {}", g.getAppId());
}
@@ -156,7 +163,7 @@ public class PipelinePreview {
private void detachGraphs(List<InvocableStreamPipesEntity> graphs,
ExtensionServiceRequestManager requestManager) {
graphs.forEach(g -> {
- new DetachExtensionRequest(requestManager).execute(g, null);
+ new DetachExtensionRequest(requestManager, resourceManager).execute(g, null);
});
}
diff --git a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/recommender/ElementRecommender.java b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/recommender/ElementRecommender.java
index 25c12130a7..e428dd03c6 100644
--- a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/recommender/ElementRecommender.java
+++ b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/recommender/ElementRecommender.java
@@ -31,7 +31,8 @@ import org.apache.streampipes.model.pipeline.Pipeline;
import org.apache.streampipes.model.pipeline.PipelineElementRecommendation;
import org.apache.streampipes.model.pipeline.PipelineElementRecommendationMessage;
import org.apache.streampipes.model.pipeline.PipelineModification;
-import org.apache.streampipes.resource.management.SpResourceManager;
+import org.apache.streampipes.resource.management.DataProcessorResourceManager;
+import org.apache.streampipes.resource.management.DataSinkResourceManager;
import org.apache.streampipes.storage.api.pipeline.IPipelineElementDescriptionStorage;
import org.apache.streampipes.storage.management.StorageDispatcher;
@@ -51,14 +52,20 @@ public class ElementRecommender {
private final String baseRecDomId;
private final PipelineElementRecommendationMessage recommendationMessage;
private final ExtensionServiceRequestManager requestManager;
+ private final DataProcessorResourceManager dataProcessorResourceManager;
+ private final DataSinkResourceManager dataSinkResourceManager;
public ElementRecommender(Pipeline partialPipeline,
String baseRecDomId,
- ExtensionServiceRequestManager requestManager) {
+ ExtensionServiceRequestManager requestManager,
+ DataProcessorResourceManager dataProcessorResourceManager,
+ DataSinkResourceManager dataSinkResourceManager) {
this.pipeline = partialPipeline;
this.baseRecDomId = baseRecDomId;
this.requestManager = requestManager;
this.recommendationMessage = new PipelineElementRecommendationMessage();
+ this.dataProcessorResourceManager = dataProcessorResourceManager;
+ this.dataSinkResourceManager = dataSinkResourceManager;
}
public PipelineElementRecommendationMessage findRecommendedElements() throws NoSuitableSepasAvailableException {
@@ -88,7 +95,7 @@ public class ElementRecommender {
}
private List<ConsumableStreamPipesEntity> getAllDataProcessors() {
- List<String> userObjects = new SpResourceManager().manageDataProcessors().findAllIdsOnly();
+ List<String> userObjects = dataProcessorResourceManager.findAllIdsOnly();
return getNoSqlStore()
.getAllDataProcessors()
.stream()
@@ -99,7 +106,7 @@ public class ElementRecommender {
private List<ConsumableStreamPipesEntity> getAllDataSinks() {
- List<String> userObjects = new SpResourceManager().manageDataSinks().findAllIdsOnly();
+ List<String> userObjects = dataSinkResourceManager.findAllIdsOnly();
return getNoSqlStore()
.getAllDataSinks()
.stream()
diff --git a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/remote/ContainerProvidedOptionsHandler.java b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/remote/ContainerProvidedOptionsHandler.java
index b170d1c843..88b531524a 100644
--- a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/remote/ContainerProvidedOptionsHandler.java
+++ b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/remote/ContainerProvidedOptionsHandler.java
@@ -24,6 +24,7 @@ import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequestTarg
import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequests;
import org.apache.streampipes.manager.execution.endpoint.ExtensionsServiceEndpointGenerator;
import org.apache.streampipes.manager.execution.endpoint.ExtensionsServiceEndpointUtils;
+import org.apache.streampipes.manager.util.AuthTokenUtils;
import org.apache.streampipes.model.runtime.RuntimeOptionsRequest;
import org.apache.streampipes.model.runtime.RuntimeOptionsResponse;
import org.apache.streampipes.serializers.json.JacksonSerializer;
@@ -47,8 +48,9 @@ public class ContainerProvidedOptionsHandler {
try {
var payload = JacksonSerializer.getObjectMapper().writeValueAsString(request);
var requestTarget = getEndpointRequestTarget(request.getAppId());
+ var authToken = AuthTokenUtils.getAuthTokenForCurrentUser();
var response = extensionRequestManager.request(
- ExtensionServiceRequests.containerProvidedOptions(requestTarget, payload)
+ ExtensionServiceRequests.containerProvidedOptions(requestTarget, payload, authToken)
);
return handleResponse(response.responseBody());
} catch (Exception e) {
diff --git a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/setup/AutoInstallation.java b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/setup/AutoInstallation.java
index 0cea95bf8d..df7de44532 100644
--- a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/setup/AutoInstallation.java
+++ b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/setup/AutoInstallation.java
@@ -22,6 +22,7 @@ import org.apache.streampipes.commons.environment.Environments;
import org.apache.streampipes.commons.environment.variable.StringEnvironmentVariable;
import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequestManager;
import org.apache.streampipes.model.client.setup.InitialSettings;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -40,10 +41,13 @@ public class AutoInstallation implements BackgroundTaskNotifier {
private final AtomicInteger errorCount = new AtomicInteger();
private int numberOfBackgroundSteps = 0;
private int executedBackgroundSteps = 0;
+ private final SpResourceManager resourceManager;
- public AutoInstallation(ExtensionServiceRequestManager extensionServiceRequestManager) {
+ public AutoInstallation(ExtensionServiceRequestManager extensionServiceRequestManager,
+ SpResourceManager resourceManager) {
this.env = Environments.getEnvironment();
this.extensionServiceRequestManager = extensionServiceRequestManager;
+ this.resourceManager = resourceManager;
}
public void startAutoInstallation() {
@@ -53,7 +57,8 @@ public class AutoInstallation implements BackgroundTaskNotifier {
List<Runnable> backgroundSteps = InstallationConfiguration.getBackgroundInstallationSteps(
settings,
this,
- extensionServiceRequestManager
+ extensionServiceRequestManager,
+ resourceManager
);
numberOfBackgroundSteps = backgroundSteps.size();
diff --git a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/setup/ExtensionsInstallationTask.java b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/setup/ExtensionsInstallationTask.java
index 2027f4a500..b6123381a1 100644
--- a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/setup/ExtensionsInstallationTask.java
+++ b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/setup/ExtensionsInstallationTask.java
@@ -22,6 +22,7 @@ import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequestMana
import org.apache.streampipes.manager.extensions.AvailableExtensionsProvider;
import org.apache.streampipes.model.client.setup.InitialSettings;
import org.apache.streampipes.model.extensions.ExtensionItemDescription;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.storage.api.core.INoSqlStorage;
import org.slf4j.Logger;
@@ -43,15 +44,18 @@ public class ExtensionsInstallationTask implements Runnable {
private final BackgroundTaskNotifier callback;
private final INoSqlStorage storage;
private final ExtensionServiceRequestManager extensionServiceRequestManager;
+ private final SpResourceManager resourceManager;
public ExtensionsInstallationTask(InitialSettings settings,
INoSqlStorage storage,
BackgroundTaskNotifier callback,
- ExtensionServiceRequestManager extensionServiceRequestManager) {
+ ExtensionServiceRequestManager extensionServiceRequestManager,
+ SpResourceManager resourceManager) {
this.settings = settings;
this.storage = storage;
this.callback = callback;
this.extensionServiceRequestManager = extensionServiceRequestManager;
+ this.resourceManager = resourceManager;
}
@Override
@@ -81,7 +85,8 @@ public class ExtensionsInstallationTask implements Runnable {
steps.add(new PipelineElementInstallationStep(
extensionItem,
settings.getInitialAdminUserSid(),
- extensionServiceRequestManager)
+ extensionServiceRequestManager,
+ resourceManager)
);
}
diff --git a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/setup/InstallationConfiguration.java b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/setup/InstallationConfiguration.java
index af4baa93c6..f6ce2eb6c1 100644
--- a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/setup/InstallationConfiguration.java
+++ b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/setup/InstallationConfiguration.java
@@ -20,6 +20,7 @@ package org.apache.streampipes.manager.setup;
import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequestManager;
import org.apache.streampipes.model.client.setup.InitialSettings;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.storage.management.StorageDispatcher;
import java.util.ArrayList;
@@ -44,12 +45,14 @@ public class InstallationConfiguration {
public static List<Runnable> getBackgroundInstallationSteps(InitialSettings settings,
BackgroundTaskNotifier callback,
- ExtensionServiceRequestManager extensionServiceRequestManager) {
+ ExtensionServiceRequestManager extensionServiceRequestManager,
+ SpResourceManager resourceManager) {
return List.of(new ExtensionsInstallationTask(
settings,
StorageDispatcher.INSTANCE.getNoSqlStore(),
callback,
- extensionServiceRequestManager
+ extensionServiceRequestManager,
+ resourceManager
));
}
}
diff --git a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/setup/PipelineElementInstallationStep.java b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/setup/PipelineElementInstallationStep.java
index bbfad91b6b..11a4374ae4 100644
--- a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/setup/PipelineElementInstallationStep.java
+++ b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/setup/PipelineElementInstallationStep.java
@@ -24,6 +24,7 @@ import org.apache.streampipes.manager.execution.endpoint.ExtensionsServiceEndpoi
import org.apache.streampipes.manager.extensions.ExtensionItemInstaller;
import org.apache.streampipes.model.extensions.ExtensionItemDescription;
import org.apache.streampipes.model.extensions.ExtensionItemInstallationRequest;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.svcdiscovery.api.model.SpServiceUrlProvider;
import java.io.IOException;
@@ -34,14 +35,17 @@ public class PipelineElementInstallationStep extends InstallationStep {
private final ExtensionItemDescription extensionItem;
private final String principalSid;
private final ExtensionServiceRequestManager extensionServiceRequestManager;
+ private final SpResourceManager resourceManager;
public PipelineElementInstallationStep(ExtensionItemDescription extensionItem,
String principalSid,
- ExtensionServiceRequestManager extensionServiceRequestManager) {
+ ExtensionServiceRequestManager extensionServiceRequestManager,
+ SpResourceManager resourceManager) {
this.extensionItem = extensionItem;
this.principalSid = principalSid;
this.extensionServiceRequestManager = extensionServiceRequestManager;
+ this.resourceManager = resourceManager;
}
@Override
@@ -53,7 +57,7 @@ public class PipelineElementInstallationStep extends InstallationStep {
SpServiceUrlProvider.valueOf(installationReq.serviceTagPrefix().name()),
Set.of()
);
- new ExtensionItemInstaller(service, extensionServiceRequestManager)
+ new ExtensionItemInstaller(service, extensionServiceRequestManager, resourceManager)
.installExtension(installationReq, principalSid);
logSuccess(getTitle());
} catch (SepaParseException | IOException | NoServiceEndpointsAvailableException e) {
diff --git a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/util/AuthTokenUtils.java b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/util/AuthTokenUtils.java
index 12c88359be..8ba2b4387a 100644
--- a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/util/AuthTokenUtils.java
+++ b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/util/AuthTokenUtils.java
@@ -20,7 +20,9 @@ package org.apache.streampipes.manager.util;
import org.apache.streampipes.model.client.user.Permission;
import org.apache.streampipes.model.client.user.Principal;
+import org.apache.streampipes.resource.management.PermissionResourceManager;
import org.apache.streampipes.resource.management.SpResourceManager;
+import org.apache.streampipes.resource.management.UserResourceManager;
import org.apache.streampipes.user.management.jwt.JwtTokenProvider;
import org.springframework.security.core.Authentication;
@@ -33,22 +35,22 @@ public class AuthTokenUtils {
return makeBearerToken(new JwtTokenProvider().createToken(auth));
}
- public static String getAuthToken(String resourceId) {
+ public static String getAuthToken(String resourceId,
+ SpResourceManager resourceManager) {
if (SecurityContextHolder.getContext().getAuthentication() != null) {
- Authentication auth = SecurityContextHolder.getContext().getAuthentication();
- return makeBearerToken(new JwtTokenProvider().createToken(auth));
+ return getAuthTokenForCurrentUser();
} else {
if (resourceId != null) {
- String ownerSid = getOwnerSid(resourceId);
- return getAuthTokenForUser(ownerSid);
+ String ownerSid = getOwnerSid(resourceId, resourceManager.managePermissions());
+ return getAuthTokenForUser(ownerSid, resourceManager.manageUsers());
} else {
throw new IllegalArgumentException("No authenticated user found to associate with request");
}
}
}
- public static String getAuthTokenForUser(String ownerSid) {
- Principal correspondingUser = new SpResourceManager().manageUsers().getPrincipalById(ownerSid);
+ public static String getAuthTokenForUser(String ownerSid, UserResourceManager userResourceManager) {
+ Principal correspondingUser = userResourceManager.getPrincipalById(ownerSid);
return getAuthTokenForUser(correspondingUser);
}
@@ -60,10 +62,8 @@ public class AuthTokenUtils {
return "Bearer " + token;
}
- private static String getOwnerSid(String resourceId) {
- return new SpResourceManager()
- .managePermissions()
- .findForObjectId(resourceId)
+ private static String getOwnerSid(String resourceId, PermissionResourceManager permissionResourceManager) {
+ return permissionResourceManager.findForObjectId(resourceId)
.stream()
.findFirst()
.map(Permission::getOwnerSid)
diff --git a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/verification/ElementVerifier.java b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/verification/ElementVerifier.java
index 4b080f8b67..d23540ddf5 100644
--- a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/verification/ElementVerifier.java
+++ b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/verification/ElementVerifier.java
@@ -28,7 +28,7 @@ import org.apache.streampipes.model.message.Message;
import org.apache.streampipes.model.message.Notification;
import org.apache.streampipes.model.message.NotificationType;
import org.apache.streampipes.model.message.SuccessMessage;
-import org.apache.streampipes.resource.management.SpResourceManager;
+import org.apache.streampipes.resource.management.PermissionResourceManager;
import org.apache.streampipes.serializers.json.JacksonSerializer;
import org.apache.streampipes.storage.api.pipeline.IPipelineElementDescriptionStorage;
@@ -51,24 +51,30 @@ public abstract class ElementVerifier<T extends NamedStreamPipesEntity> {
protected T elementDescription;
protected final IPipelineElementDescriptionStorage storageApi;
+ private final PermissionResourceManager permissionResourceManager;
public ElementVerifier(
String graphData,
Class<T> elementClass,
- IPipelineElementDescriptionStorage storageApi
+ IPipelineElementDescriptionStorage storageApi,
+ PermissionResourceManager permissionResourceManager
) {
this.elementClass = elementClass;
this.graphData = graphData;
this.storageApi = storageApi;
this.shouldTransform = true;
+ this.permissionResourceManager = permissionResourceManager;
}
- public ElementVerifier(T elementDescription, IPipelineElementDescriptionStorage storageApi) {
+ public ElementVerifier(T elementDescription,
+ IPipelineElementDescriptionStorage storageApi,
+ PermissionResourceManager permissionResourceManager) {
this.elementDescription = elementDescription;
this.storageApi = storageApi;
this.graphData = null;
this.elementClass = null;
this.shouldTransform = false;
+ this.permissionResourceManager = permissionResourceManager;
}
protected abstract StorageState store();
@@ -177,7 +183,6 @@ public abstract class ElementVerifier<T extends NamedStreamPipesEntity> {
}
protected void storeNewObjectPermission(Permission permission) {
- new SpResourceManager().managePermissions()
- .create(permission);
+ permissionResourceManager.create(permission);
}
}
diff --git a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/verification/TypedElementVerifier.java b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/verification/TypedElementVerifier.java
index 2692f818fd..0a553bba42 100644
--- a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/verification/TypedElementVerifier.java
+++ b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/verification/TypedElementVerifier.java
@@ -22,6 +22,7 @@ import org.apache.streampipes.commons.exceptions.NoServiceEndpointsAvailableExce
import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequestManager;
import org.apache.streampipes.manager.assets.AssetManager;
import org.apache.streampipes.model.base.NamedStreamPipesEntity;
+import org.apache.streampipes.resource.management.PermissionResourceManager;
import org.apache.streampipes.storage.api.pipeline.IPipelineElementDescriptionStorage;
import org.apache.streampipes.svcdiscovery.api.model.SpServiceUrlProvider;
@@ -45,9 +46,10 @@ public class TypedElementVerifier<T extends NamedStreamPipesEntity> extends Elem
Consumer<T> storeOperation,
Consumer<T> updateOperation,
SpServiceUrlProvider serviceUrlProvider,
- ExtensionServiceRequestManager requestManager
+ ExtensionServiceRequestManager requestManager,
+ PermissionResourceManager permissionResourceManager
) {
- super(graphData, elementClass, storageApi);
+ super(graphData, elementClass, storageApi, permissionResourceManager);
this.existsChecker = existsChecker;
this.storeOperation = storeOperation;
this.updateOperation = updateOperation;
@@ -62,9 +64,10 @@ public class TypedElementVerifier<T extends NamedStreamPipesEntity> extends Elem
Consumer<T> storeOperation,
Consumer<T> updateOperation,
SpServiceUrlProvider serviceUrlProvider,
- ExtensionServiceRequestManager requestManager
+ ExtensionServiceRequestManager requestManager,
+ PermissionResourceManager permissionResourceManager
) {
- super(elementDescription, storageApi);
+ super(elementDescription, storageApi, permissionResourceManager);
this.existsChecker = existsChecker;
this.storeOperation = storeOperation;
this.updateOperation = updateOperation;
diff --git a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/verification/extractor/TypeExtractor.java b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/verification/extractor/TypeExtractor.java
index 75bac0838f..7a0863bf2f 100644
--- a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/verification/extractor/TypeExtractor.java
+++ b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/verification/extractor/TypeExtractor.java
@@ -27,6 +27,7 @@ import org.apache.streampipes.model.base.NamedStreamPipesEntity;
import org.apache.streampipes.model.connect.adapter.AdapterDescription;
import org.apache.streampipes.model.graph.DataProcessorDescription;
import org.apache.streampipes.model.graph.DataSinkDescription;
+import org.apache.streampipes.resource.management.PermissionResourceManager;
import org.apache.streampipes.serializers.json.JacksonSerializer;
import org.apache.streampipes.storage.api.pipeline.IPipelineElementDescriptionStorage;
import org.apache.streampipes.storage.management.StorageDispatcher;
@@ -49,20 +50,24 @@ public class TypeExtractor {
private final String extensionElementDescription;
private final IPipelineElementDescriptionStorage storageApi;
private final ExtensionServiceRequestManager requestManager;
+ private final PermissionResourceManager permissionResourceManager;
public TypeExtractor(String extensionElementDescription,
- ExtensionServiceRequestManager requestManager) {
- this(extensionElementDescription, defaultStorageApi(), requestManager);
+ ExtensionServiceRequestManager requestManager,
+ PermissionResourceManager permissionResourceManager) {
+ this(extensionElementDescription, defaultStorageApi(), requestManager, permissionResourceManager);
}
public TypeExtractor(
String extensionElementDescription,
IPipelineElementDescriptionStorage storageApi,
- ExtensionServiceRequestManager requestManager
+ ExtensionServiceRequestManager requestManager,
+ PermissionResourceManager permissionResourceManager
) {
this.extensionElementDescription = extensionElementDescription;
this.storageApi = storageApi;
this.requestManager = requestManager;
+ this.permissionResourceManager = permissionResourceManager;
}
public ElementVerifier<?> getTypeVerifier() throws SepaParseException {
@@ -134,7 +139,8 @@ public class TypeExtractor {
storeOperation,
updateOperation,
serviceUrlProvider,
- requestManager
+ requestManager,
+ permissionResourceManager
);
}
diff --git a/streampipes-pipeline-management/src/test/java/org/apache/streampipes/manager/pipeline/update/PipelineUpdateCoordinatorTest.java b/streampipes-pipeline-management/src/test/java/org/apache/streampipes/manager/pipeline/update/PipelineUpdateCoordinatorTest.java
index 53198ea66a..22ac557411 100644
--- a/streampipes-pipeline-management/src/test/java/org/apache/streampipes/manager/pipeline/update/PipelineUpdateCoordinatorTest.java
+++ b/streampipes-pipeline-management/src/test/java/org/apache/streampipes/manager/pipeline/update/PipelineUpdateCoordinatorTest.java
@@ -38,6 +38,7 @@ import org.apache.streampipes.model.pipeline.PipelineModificationResult;
import org.apache.streampipes.model.schema.EventPropertyPrimitive;
import org.apache.streampipes.model.schema.EventSchema;
import org.apache.streampipes.model.schema.PropertyScope;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.storage.api.core.INoSqlStorage;
import org.apache.streampipes.storage.api.pipeline.IPipelineStorage;
import org.apache.streampipes.storage.couchdb.CouchDbStorageManager;
@@ -71,7 +72,10 @@ class PipelineUpdateCoordinatorTest {
void updatePipelines_ShouldRestartRunningPipelinesForDataStreamUpdates() {
var requestManager = mock(ExtensionServiceRequestManager.class);
var chartSchemaUpdateCoordinator = mock(ChartSchemaUpdateCoordinator.class);
- var coordinator = new PipelineUpdateCoordinator(requestManager, chartSchemaUpdateCoordinator);
+ var resourceManager = mock(SpResourceManager.class);
+ var pipelineManager = mock(PipelineManager.class);
+ var coordinator = new PipelineUpdateCoordinator(
+ requestManager, resourceManager, chartSchemaUpdateCoordinator, pipelineManager);
var dataStream = makeDataStream("stream-1", "Updated stream");
var affectedPipeline = makePipeline("pipeline-1", "Pipeline", true, "stream-1", "Old stream");
var storedPipeline = makePipeline("pipeline-1", "Pipeline", true, "stream-1", "Old stream");
diff --git a/streampipes-pipeline-management/src/test/java/org/apache/streampipes/manager/verification/TypeExtractorTest.java b/streampipes-pipeline-management/src/test/java/org/apache/streampipes/manager/verification/TypeExtractorTest.java
index 781733a4da..0cc7c0eaa4 100644
--- a/streampipes-pipeline-management/src/test/java/org/apache/streampipes/manager/verification/TypeExtractorTest.java
+++ b/streampipes-pipeline-management/src/test/java/org/apache/streampipes/manager/verification/TypeExtractorTest.java
@@ -50,7 +50,7 @@ public class TypeExtractorTest {
@Test
public void verifyAndUpdateDataStream() throws SepaParseException {
- var message = new TypeExtractor(payload(SpDataStream.class), storageApi, requestManager)
+ var message = new TypeExtractor(payload(SpDataStream.class), storageApi, requestManager, null)
.getTypeVerifier()
.verifyAndUpdate();
@@ -60,7 +60,7 @@ public class TypeExtractorTest {
@Test
public void verifyAndUpdateDataProcessor() throws SepaParseException {
- var message = new TypeExtractor(payload(DataProcessorDescription.class), storageApi, requestManager)
+ var message = new TypeExtractor(payload(DataProcessorDescription.class), storageApi, requestManager, null)
.getTypeVerifier()
.verifyAndUpdate();
@@ -70,7 +70,7 @@ public class TypeExtractorTest {
@Test
public void verifyAndUpdateDataSink() throws SepaParseException {
- var message = new TypeExtractor(payload(DataSinkDescription.class), storageApi, requestManager)
+ var message = new TypeExtractor(payload(DataSinkDescription.class), storageApi, requestManager, null)
.getTypeVerifier()
.verifyAndUpdate();
@@ -80,7 +80,7 @@ public class TypeExtractorTest {
@Test
public void verifyAndUpdateAdapter() throws SepaParseException {
- var message = new TypeExtractor(payload(AdapterDescription.class), storageApi, requestManager)
+ var message = new TypeExtractor(payload(AdapterDescription.class), storageApi, requestManager, null)
.getTypeVerifier()
.verifyAndUpdate();
@@ -90,7 +90,7 @@ public class TypeExtractorTest {
@Test
public void verifyAndUpdateWithoutNameOrIcon_onlyContainsStorageSuccessNotification() throws SepaParseException {
- var message = new TypeExtractor(payload(DataProcessorDescription.class), storageApi, requestManager)
+ var message = new TypeExtractor(payload(DataProcessorDescription.class), storageApi, requestManager, null)
.getTypeVerifier()
.verifyAndUpdate();
@@ -103,7 +103,7 @@ public class TypeExtractorTest {
assertThrows(
SepaParseException.class,
() -> new TypeExtractor(
- "{\"name\":\"test\"}", storageApi, requestManager).getTypeVerifier()
+ "{\"name\":\"test\"}", storageApi, requestManager, null).getTypeVerifier()
);
}
diff --git a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/AbstractPipelineElementResourceManager.java b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/AbstractPipelineElementResourceManager.java
index 34a8448dd2..2e4ee34f18 100644
--- a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/AbstractPipelineElementResourceManager.java
+++ b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/AbstractPipelineElementResourceManager.java
@@ -29,8 +29,12 @@ import java.util.stream.Collectors;
public abstract class AbstractPipelineElementResourceManager<T extends CRUDStorage<W>,
W extends NamedStreamPipesEntity, X> extends AbstractResourceManager<T> {
- public AbstractPipelineElementResourceManager(T db) {
+ protected final PermissionResourceManager permissionResourceManager;
+
+ public AbstractPipelineElementResourceManager(T db,
+ PermissionResourceManager permissionResourceManager) {
super(db);
+ this.permissionResourceManager = permissionResourceManager;
}
public List<W> findAll() {
@@ -82,9 +86,8 @@ public abstract class AbstractPipelineElementResourceManager<T extends CRUDStora
}
private void deleteAssetsAndPermissions(W description) {
- SpResourceManager manager = new SpResourceManager();
- List<Permission> permissions = manager.managePermissions().findForObjectId(description.getElementId());
- permissions.forEach(permission -> manager.managePermissions().delete(permission));
+ List<Permission> permissions = permissionResourceManager.findForObjectId(description.getElementId());
+ permissions.forEach(permissionResourceManager::delete);
}
protected abstract X toInvocation(W description);
diff --git a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/AbstractResourceManager.java b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/AbstractResourceManager.java
index 837f3bec70..4d41310e52 100644
--- a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/AbstractResourceManager.java
+++ b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/AbstractResourceManager.java
@@ -25,4 +25,7 @@ public class AbstractResourceManager<T> {
this.db = db;
}
+ public T getDb() {
+ return db;
+ }
}
diff --git a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/AdapterDescriptionResourceManager.java b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/AdapterDescriptionResourceManager.java
index 04c6ecaa22..db2df6411e 100644
--- a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/AdapterDescriptionResourceManager.java
+++ b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/AdapterDescriptionResourceManager.java
@@ -25,8 +25,8 @@ import org.apache.streampipes.storage.management.StorageDispatcher;
public class AdapterDescriptionResourceManager
extends AbstractPipelineElementResourceManager<IAdapterStorage, AdapterDescription, AdapterDescription> {
- public AdapterDescriptionResourceManager() {
- super(StorageDispatcher.INSTANCE.getNoSqlStore().getAdapterDescriptionStorage());
+ public AdapterDescriptionResourceManager(PermissionResourceManager permissionResourceManager) {
+ super(StorageDispatcher.INSTANCE.getNoSqlStore().getAdapterDescriptionStorage(), permissionResourceManager);
}
@Override
diff --git a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/CrudResourceManager.java b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/CrudResourceManager.java
index b4e9782173..8951bbb6ad 100644
--- a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/CrudResourceManager.java
+++ b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/CrudResourceManager.java
@@ -30,12 +30,15 @@ public class CrudResourceManager<T extends Storable>
private final Class<T> elementClass;
protected final SpPermissionEvaluator permissionEvaluator;
+ protected final PermissionResourceManager permissionResourceManager;
public CrudResourceManager(CRUDStorage<T> db,
- Class<T> elementClass) {
+ Class<T> elementClass,
+ PermissionResourceManager permissionResourceManager) {
super(db);
this.elementClass = elementClass;
this.permissionEvaluator = new SpPermissionEvaluator();
+ this.permissionResourceManager = permissionResourceManager;
}
public List<T> findAll() {
@@ -57,7 +60,7 @@ public class CrudResourceManager<T extends Storable>
element.setElementId(ElementIdGenerator.makeElementId(elementClass));
}
db.persist(element);
- new PermissionResourceManager().createDefault(element.getElementId(), elementClass, principalSid,
+ permissionResourceManager.createDefault(element.getElementId(), elementClass, principalSid,
false);
return find(element.getElementId());
}
@@ -67,8 +70,7 @@ public class CrudResourceManager<T extends Storable>
}
private void deletePermissions(String elementId) {
- PermissionResourceManager manager = new PermissionResourceManager();
- List<Permission> permissions = manager.findForObjectId(elementId);
- permissions.forEach(manager::delete);
+ List<Permission> permissions = permissionResourceManager.findForObjectId(elementId);
+ permissions.forEach(permissionResourceManager::delete);
}
}
diff --git a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataExplorerResourceManager.java b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataExplorerResourceManager.java
index f2ca5eff70..b19170aa1d 100644
--- a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataExplorerResourceManager.java
+++ b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataExplorerResourceManager.java
@@ -37,18 +37,21 @@ public class DataExplorerResourceManager extends CrudResourceManager<DashboardMo
private final IDataExplorerWidgetStorage widgetStorage;
private final IDataLakeMeasureStorage dataLakeMeasureStorage;
- public DataExplorerResourceManager(IDataExplorerWidgetStorage widgetStorage) {
+ public DataExplorerResourceManager(IDataExplorerWidgetStorage widgetStorage,
+ PermissionResourceManager permissionResourceManager) {
this(
StorageDispatcher.INSTANCE.getNoSqlStore().getDataExplorerDashboardStorage(),
widgetStorage,
- StorageDispatcher.INSTANCE.getNoSqlStore().getDataLakeStorage()
+ StorageDispatcher.INSTANCE.getNoSqlStore().getDataLakeStorage(),
+ permissionResourceManager
);
}
private DataExplorerResourceManager(IDataExplorerDashboardStorage dashboardStorage,
IDataExplorerWidgetStorage widgetStorage,
- IDataLakeMeasureStorage dataLakeMeasureStorage) {
- super(dashboardStorage, DashboardModel.class);
+ IDataLakeMeasureStorage dataLakeMeasureStorage,
+ PermissionResourceManager permissionResourceManager) {
+ super(dashboardStorage, DashboardModel.class, permissionResourceManager);
this.widgetStorage = widgetStorage;
this.dataLakeMeasureStorage = dataLakeMeasureStorage;
}
diff --git a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataExplorerWidgetResourceManager.java b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataExplorerWidgetResourceManager.java
index 09fe152f01..78206bd2bf 100644
--- a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataExplorerWidgetResourceManager.java
+++ b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataExplorerWidgetResourceManager.java
@@ -34,8 +34,9 @@ public class DataExplorerWidgetResourceManager extends CrudResourceManager<DataE
private final DataExplorerResourceManager dashboardManager;
public DataExplorerWidgetResourceManager(DataExplorerResourceManager dashboardManager,
- IDataExplorerWidgetStorage db) {
- super(db, DataExplorerWidgetModel.class);
+ IDataExplorerWidgetStorage db,
+ PermissionResourceManager permissionResourceManager) {
+ super(db, DataExplorerWidgetModel.class, permissionResourceManager);
this.dashboardManager = dashboardManager;
}
diff --git a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataProcessorResourceManager.java b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataProcessorResourceManager.java
index d86e2fd187..8e0eb9398b 100644
--- a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataProcessorResourceManager.java
+++ b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataProcessorResourceManager.java
@@ -25,8 +25,8 @@ import org.apache.streampipes.storage.management.StorageDispatcher;
public class DataProcessorResourceManager extends
AbstractPipelineElementResourceManager<IDataProcessorStorage, DataProcessorDescription, DataProcessorInvocation> {
- public DataProcessorResourceManager() {
- super(StorageDispatcher.INSTANCE.getNoSqlStore().getDataProcessorStorage());
+ public DataProcessorResourceManager(PermissionResourceManager permissionResourceManager) {
+ super(StorageDispatcher.INSTANCE.getNoSqlStore().getDataProcessorStorage(), permissionResourceManager);
}
@Override
diff --git a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataSinkResourceManager.java b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataSinkResourceManager.java
index ec8d150015..9273d368fb 100644
--- a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataSinkResourceManager.java
+++ b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataSinkResourceManager.java
@@ -25,8 +25,8 @@ import org.apache.streampipes.storage.management.StorageDispatcher;
public class DataSinkResourceManager
extends AbstractPipelineElementResourceManager<IDataSinkStorage, DataSinkDescription, DataSinkInvocation> {
- public DataSinkResourceManager() {
- super(StorageDispatcher.INSTANCE.getNoSqlStore().getDataSinkStorage());
+ public DataSinkResourceManager(PermissionResourceManager permissionResourceManager) {
+ super(StorageDispatcher.INSTANCE.getNoSqlStore().getDataSinkStorage(), permissionResourceManager);
}
@Override
diff --git a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataStreamResourceManager.java b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataStreamResourceManager.java
index ed1ba3214f..035e56023f 100644
--- a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataStreamResourceManager.java
+++ b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataStreamResourceManager.java
@@ -24,12 +24,13 @@ import org.apache.streampipes.storage.management.StorageDispatcher;
public class DataStreamResourceManager
extends AbstractPipelineElementResourceManager<IDataStreamStorage, SpDataStream, SpDataStream> {
- public DataStreamResourceManager(IDataStreamStorage db) {
- super(db);
+ public DataStreamResourceManager(IDataStreamStorage db,
+ PermissionResourceManager permissionResourceManager) {
+ super(db, permissionResourceManager);
}
- public DataStreamResourceManager() {
- super(StorageDispatcher.INSTANCE.getNoSqlStore().getDataStreamStorage());
+ public DataStreamResourceManager(PermissionResourceManager permissionResourceManager) {
+ super(StorageDispatcher.INSTANCE.getNoSqlStore().getDataStreamStorage(), permissionResourceManager);
}
@Override
diff --git a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/PermissionResourceManager.java b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/PermissionResourceManager.java
index e87775fb30..b9b5751968 100644
--- a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/PermissionResourceManager.java
+++ b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/PermissionResourceManager.java
@@ -35,6 +35,10 @@ public class PermissionResourceManager extends AbstractResourceManager<IPermissi
super(StorageDispatcher.INSTANCE.getNoSqlStore().getPermissionStorage());
}
+ public PermissionResourceManager(IPermissionStorage permissionStorage) {
+ super(permissionStorage);
+ }
+
public List<Permission> findAll() {
return db.findAll();
}
diff --git a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/PipelineResourceManager.java b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/PipelineResourceManager.java
index 260d5c1145..ac95de516f 100644
--- a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/PipelineResourceManager.java
+++ b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/PipelineResourceManager.java
@@ -20,14 +20,15 @@ package org.apache.streampipes.resource.management;
import org.apache.streampipes.model.pipeline.Pipeline;
import org.apache.streampipes.model.pipeline.PipelineSummaryDto;
import org.apache.streampipes.model.resource.ResourceSummaryDto;
-import org.apache.streampipes.storage.management.StorageDispatcher;
+import org.apache.streampipes.storage.api.pipeline.IPipelineStorage;
import org.springframework.security.core.Authentication;
public class PipelineResourceManager extends CrudResourceManager<Pipeline> {
- public PipelineResourceManager() {
- super(StorageDispatcher.INSTANCE.getNoSqlStore().getPipelineStorageAPI(), Pipeline.class);
+ public PipelineResourceManager(IPipelineStorage pipelineStorage,
+ PermissionResourceManager permissionResourceManager) {
+ super(pipelineStorage, Pipeline.class, permissionResourceManager);
}
public ResourceSummaryDto<PipelineSummaryDto> getSummary(Authentication auth) {
diff --git a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/SpResourceManager.java b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/SpResourceManager.java
index 4c17a82856..83107b42e1 100644
--- a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/SpResourceManager.java
+++ b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/SpResourceManager.java
@@ -18,48 +18,64 @@
package org.apache.streampipes.resource.management;
import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
+import org.apache.streampipes.storage.api.user.IPermissionStorage;
+import org.apache.streampipes.storage.management.StorageDispatcher;
public class SpResourceManager {
- public AssetResourceManager manageAssets() {
- return new AssetResourceManager();
- }
+ private final IPermissionStorage permissionStorage;
+ private final IDataExplorerWidgetStorage chartStorage;
- public AdapterResourceManager manageAdapters() {
- return new AdapterResourceManager();
+ public SpResourceManager(IPermissionStorage permissionStorage,
+ IDataExplorerWidgetStorage chartStorage) {
+ this.permissionStorage = permissionStorage;
+ this.chartStorage = chartStorage;
}
public AdapterDescriptionResourceManager manageAdapterDescriptions() {
- return new AdapterDescriptionResourceManager();
+ return new AdapterDescriptionResourceManager(managePermissions());
}
- public DataExplorerWidgetResourceManager manageDataExplorerWidget(DataExplorerResourceManager dashboardManager,
- IDataExplorerWidgetStorage db) {
- return new DataExplorerWidgetResourceManager(dashboardManager, db);
+ public DataSinkResourceManager manageDataSinks() {
+ return new DataSinkResourceManager(managePermissions());
}
public DataProcessorResourceManager manageDataProcessors() {
- return new DataProcessorResourceManager();
+ return new DataProcessorResourceManager(managePermissions());
}
- public DataSinkResourceManager manageDataSinks() {
- return new DataSinkResourceManager();
+ public DataStreamResourceManager manageDataStreams() {
+ return new DataStreamResourceManager(managePermissions());
}
- public DataStreamResourceManager manageDataStreams() {
- return new DataStreamResourceManager();
+ public AssetResourceManager manageAssets() {
+ return new AssetResourceManager();
+ }
+
+ public AdapterResourceManager manageAdapters() {
+ return new AdapterResourceManager();
}
public DataLakeMeasureResourceManager manageDataLakeMeasures() {
return new DataLakeMeasureResourceManager();
}
- public PipelineResourceManager managePipelines() {
- return new PipelineResourceManager();
+ public PermissionResourceManager managePermissions() {
+ return new PermissionResourceManager(permissionStorage);
}
- public PermissionResourceManager managePermissions() {
- return new PermissionResourceManager();
+ public DataExplorerResourceManager manageDashboards() {
+ return new DataExplorerResourceManager(chartStorage, managePermissions());
+ }
+
+ public DataExplorerWidgetResourceManager manageCharts() {
+ return new DataExplorerWidgetResourceManager(manageDashboards(), chartStorage, managePermissions());
+ }
+
+ public PipelineResourceManager managePipelines() {
+ return new PipelineResourceManager(
+ StorageDispatcher.INSTANCE.getNoSqlStore().getPipelineStorageAPI(), managePermissions()
+ );
}
public UserResourceManager manageUsers() {
diff --git a/streampipes-resource-management/src/test/java/org/apache/streampipes/resource/management/DataStreamResourceManagerTest.java b/streampipes-resource-management/src/test/java/org/apache/streampipes/resource/management/DataStreamResourceManagerTest.java
index 435ea0dd03..15fafd3861 100644
--- a/streampipes-resource-management/src/test/java/org/apache/streampipes/resource/management/DataStreamResourceManagerTest.java
+++ b/streampipes-resource-management/src/test/java/org/apache/streampipes/resource/management/DataStreamResourceManagerTest.java
@@ -33,9 +33,10 @@ public class DataStreamResourceManagerTest {
@Test
public void update() {
IDataStreamStorage storage = mock(IDataStreamStorage.class);
- DataStreamResourceManager dataStreamResourceManager = new DataStreamResourceManager(storage);
+ PermissionResourceManager permissionResourceManager = mock(PermissionResourceManager.class);
+ DataStreamResourceManager dataStreamResourceManager = new DataStreamResourceManager(storage, permissionResourceManager);
dataStreamResourceManager.update(new SpDataStream());
verify(storage, times(1)).updateElement(any());
}
-}
\ No newline at end of file
+}
diff --git a/streampipes-rest-core-base/src/main/java/org/apache/streampipes/rest/core/base/impl/AbstractRestResource.java b/streampipes-rest-core-base/src/main/java/org/apache/streampipes/rest/core/base/impl/AbstractRestResource.java
index 5b41613eec..70434e1cd3 100644
--- a/streampipes-rest-core-base/src/main/java/org/apache/streampipes/rest/core/base/impl/AbstractRestResource.java
+++ b/streampipes-rest-core-base/src/main/java/org/apache/streampipes/rest/core/base/impl/AbstractRestResource.java
@@ -22,7 +22,6 @@ import org.apache.streampipes.model.message.ErrorMessage;
import org.apache.streampipes.model.message.Message;
import org.apache.streampipes.model.message.Notification;
import org.apache.streampipes.model.message.SuccessMessage;
-import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.rest.shared.impl.AbstractSharedRestInterface;
import org.apache.streampipes.storage.api.core.INoSqlStorage;
import org.apache.streampipes.storage.api.pipeline.IPipelineElementDescriptionStorage;
@@ -81,8 +80,4 @@ public class AbstractRestResource extends AbstractSharedRestInterface {
protected ResponseEntity unauthorized() {
return ResponseEntity.status(org.springframework.http.HttpStatus.UNAUTHORIZED).build();
}
-
- protected SpResourceManager getSpResourceManager() {
- return new SpResourceManager();
- }
}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/ResetManagement.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/ResetManagement.java
index 7d09e19c6a..9d3e764166 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/ResetManagement.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/ResetManagement.java
@@ -36,7 +36,6 @@ import org.apache.streampipes.model.file.FileMetadata;
import org.apache.streampipes.model.pipeline.Pipeline;
import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.resource.management.UserResourceManager;
-import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
import org.apache.streampipes.storage.api.system.IExtensionsServiceStorage;
import org.apache.streampipes.storage.api.system.IGenericStorage;
import org.apache.streampipes.storage.management.StorageDispatcher;
@@ -53,21 +52,25 @@ public class ResetManagement {
// dependency between this package and streampipes-pipeline-management
// See in issue [STREAMPIPES-405]
- private final IDataExplorerWidgetStorage widgetStorage;
private final WorkerRestClient workerRestClient;
private final IExtensionsServiceStorage extensionsServiceStorage;
private final ExtensionServiceRequestManager requestManager;
private final ChartSchemaUpdateCoordinator chartSchemaUpdateCoordinator;
+ private final PipelineManager pipelineManager;
+ private final SpResourceManager resourceManager;
- public ResetManagement(IDataExplorerWidgetStorage widgetStorage,
- WorkerRestClient workerRestClient,
+ public ResetManagement(WorkerRestClient workerRestClient,
IExtensionsServiceStorage extensionsServiceStorage,
- ExtensionServiceRequestManager requestManager) {
- this.widgetStorage = widgetStorage;
+ ExtensionServiceRequestManager requestManager,
+ PipelineManager pipelineManager,
+ SpResourceManager resourceManager,
+ ChartSchemaUpdateCoordinator chartSchemaUpdateCoordinator) {
this.workerRestClient = workerRestClient;
this.extensionsServiceStorage = extensionsServiceStorage;
this.requestManager = requestManager;
- this.chartSchemaUpdateCoordinator = new ChartSchemaUpdateCoordinator(widgetStorage);
+ this.pipelineManager = pipelineManager;
+ this.resourceManager = resourceManager;
+ this.chartSchemaUpdateCoordinator = chartSchemaUpdateCoordinator;
}
private static final Logger logger = LoggerFactory.getLogger(ResetManagement.class);
@@ -93,7 +96,7 @@ public class ResetManagement {
removeAllDataInDataLake();
- removeAllDataViewWidgets(widgetStorage);
+ removeAllDataViewWidgets();
removeAllDataViews();
@@ -116,10 +119,10 @@ public class ResetManagement {
}
private void stopAndDeleteAllPipelines(ExtensionServiceRequestManager requestManager) {
- List<Pipeline> allPipelines = PipelineManager.getAllPipelines();
+ List<Pipeline> allPipelines = pipelineManager.getAllPipelines();
allPipelines.forEach(pipeline -> {
- PipelineManager.stopPipeline(pipeline.getPipelineId(), true, requestManager);
- PipelineManager.deletePipeline(pipeline.getPipelineId());
+ pipelineManager.stopPipeline(pipeline.getPipelineId(), true, requestManager);
+ pipelineManager.deletePipeline(pipeline.getPipelineId());
});
}
@@ -129,8 +132,7 @@ public class ResetManagement {
AdapterMasterManagement adapterMasterManagement = new AdapterMasterManagement(
StorageDispatcher.INSTANCE.getNoSqlStore()
.getAdapterInstanceStorage(),
- new SpResourceManager().manageAdapters(),
- new SpResourceManager().manageDataStreams(),
+ resourceManager,
AdapterMetricsManager.INSTANCE.getAdapterMetrics(),
workerRestClient,
extensionsServiceStorage,
@@ -170,9 +172,10 @@ public class ResetManagement {
});
}
- private void removeAllDataViewWidgets(IDataExplorerWidgetStorage widgetStorage) {
- widgetStorage.findAll()
- .forEach(widget -> widgetStorage.deleteElementById(widget.getElementId()));
+ private void removeAllDataViewWidgets() {
+ resourceManager.manageCharts().findAll()
+ .forEach(widget ->
+ resourceManager.manageCharts().getDb().deleteElementById(widget.getElementId()));
}
private void removeAllDataViews() {
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/AbstractMonitoringResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/AbstractMonitoringResource.java
index 8ec9ca4766..014dfc2dba 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/AbstractMonitoringResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/AbstractMonitoringResource.java
@@ -20,6 +20,7 @@ package org.apache.streampipes.rest.impl;
import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequestManager;
import org.apache.streampipes.manager.pipeline.ExtensionsServiceLogExecutor;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.rest.core.base.impl.AbstractAuthGuardedRestResource;
import org.springframework.http.ResponseEntity;
@@ -28,14 +29,17 @@ import org.springframework.web.bind.annotation.GetMapping;
public abstract class AbstractMonitoringResource extends AbstractAuthGuardedRestResource {
private final ExtensionServiceRequestManager extensionServiceRequestManager;
+ protected final SpResourceManager resourceManager;
- protected AbstractMonitoringResource(ExtensionServiceRequestManager extensionServiceRequestManager) {
+ protected AbstractMonitoringResource(ExtensionServiceRequestManager extensionServiceRequestManager,
+ SpResourceManager resourceManager) {
this.extensionServiceRequestManager = extensionServiceRequestManager;
+ this.resourceManager = resourceManager;
}
@GetMapping
public ResponseEntity<Void> triggerMonitoringUpdate() {
- new ExtensionsServiceLogExecutor(extensionServiceRequestManager).triggerUpdate();
+ new ExtensionsServiceLogExecutor(extensionServiceRequestManager, resourceManager).triggerUpdate();
return ok();
}
}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/AccountActivationResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/AccountActivationResource.java
index d53a4d662d..acc4b481cb 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/AccountActivationResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/AccountActivationResource.java
@@ -18,6 +18,7 @@
package org.apache.streampipes.rest.impl;
import org.apache.streampipes.commons.exceptions.UserNotFoundException;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.rest.core.base.impl.AbstractAuthGuardedRestResource;
import org.apache.streampipes.rest.shared.exception.SpMessageException;
@@ -33,12 +34,18 @@ import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/api/v2/activate-account")
public class AccountActivationResource extends AbstractAuthGuardedRestResource {
+ private final SpResourceManager resourceManager;
+
+ public AccountActivationResource(SpResourceManager resourceManager) {
+ this.resourceManager = resourceManager;
+ }
+
@GetMapping(
path = "{recoveryCode}",
produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Void> activateUserAccount(@PathVariable("recoveryCode") String recoveryCode) {
try {
- getSpResourceManager().manageUsers().activateAccount(recoveryCode);
+ resourceManager.manageUsers().activateAccount(recoveryCode);
return ok();
} catch (UserNotFoundException e) {
throw new SpMessageException(HttpStatus.BAD_REQUEST, e);
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/AdapterMonitoringResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/AdapterMonitoringResource.java
index ff77d6a6d0..cb13ff6e73 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/AdapterMonitoringResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/AdapterMonitoringResource.java
@@ -26,6 +26,7 @@ import org.apache.streampipes.model.base.NamedStreamPipesEntity;
import org.apache.streampipes.model.client.user.DefaultPrivilege;
import org.apache.streampipes.model.connect.adapter.AdapterDescription;
import org.apache.streampipes.model.monitoring.SpMetricsEntry;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.resource.management.permission.SpPermissionEvaluator;
import org.apache.streampipes.storage.api.connect.IAdapterStorage;
import org.apache.streampipes.storage.management.StorageDispatcher;
@@ -50,8 +51,9 @@ public class AdapterMonitoringResource extends AbstractMonitoringResource {
private final IAdapterStorage adapterStorage;
private final ExtensionServiceRequestManager extensionServiceRequestManager;
- public AdapterMonitoringResource(ExtensionServiceRequestManager extensionServiceRequestManager) {
- super(extensionServiceRequestManager);
+ public AdapterMonitoringResource(ExtensionServiceRequestManager extensionServiceRequestManager,
+ SpResourceManager resourceManager) {
+ super(extensionServiceRequestManager, resourceManager);
this.extensionServiceRequestManager = extensionServiceRequestManager;
this.adapterStorage = StorageDispatcher.INSTANCE.getNoSqlStore().getAdapterInstanceStorage();
}
@@ -96,7 +98,7 @@ public class AdapterMonitoringResource extends AbstractMonitoringResource {
public ResponseEntity<Map<String, SpMetricsEntry>> getMetricsInfos(
@RequestParam(value = "filter") List<String> elementIds
) {
- new ExtensionsServiceLogExecutor(extensionServiceRequestManager).triggerUpdate();
+ new ExtensionsServiceLogExecutor(extensionServiceRequestManager, resourceManager).triggerUpdate();
var filteredElementIds = elementIds.stream()
.map(adapterStorage::getElementById)
.filter(a -> checkAdapterPermission(a, "READ"))
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/AssetManagementResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/AssetManagementResource.java
index 27140f71f5..54efd0caf2 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/AssetManagementResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/AssetManagementResource.java
@@ -22,11 +22,13 @@ import org.apache.streampipes.model.assets.AssetSummaryDto;
import org.apache.streampipes.model.assets.SpAssetModel;
import org.apache.streampipes.model.client.user.DefaultPrivilege;
import org.apache.streampipes.model.resource.ResourceSummaryDto;
-import org.apache.streampipes.resource.management.AssetResourceManager;
import org.apache.streampipes.resource.management.CrudResourceManager;
+import org.apache.streampipes.resource.management.PermissionResourceManager;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.rest.core.base.impl.AbstractAuthGuardedRestResource;
import org.apache.streampipes.rest.security.AuthConstants;
import org.apache.streampipes.storage.api.system.IAssetStorage;
+import org.apache.streampipes.storage.api.user.IPermissionStorage;
import org.apache.streampipes.storage.management.StorageDispatcher;
import org.springframework.http.HttpStatus;
@@ -50,37 +52,41 @@ import java.util.List;
@RequestMapping("/api/v2/assets")
public class AssetManagementResource extends AbstractAuthGuardedRestResource {
- private final CrudResourceManager<SpAssetModel> resourceManager;
+ private final CrudResourceManager<SpAssetModel> assetResourceManager;
+ private final SpResourceManager resourceManager;
- public AssetManagementResource() {
+ public AssetManagementResource(IPermissionStorage permissionStorage,
+ SpResourceManager resourceManager) {
IAssetStorage assetStorage = StorageDispatcher.INSTANCE.getNoSqlStore().getAssetStorage();
- this.resourceManager = new CrudResourceManager<>(assetStorage, SpAssetModel.class);
+ this.resourceManager = resourceManager;
+ var permissionResourceManager = new PermissionResourceManager(permissionStorage);
+ this.assetResourceManager = new CrudResourceManager<>(assetStorage, SpAssetModel.class, permissionResourceManager);
}
@GetMapping(path = "/summary", produces = MediaType.APPLICATION_JSON_VALUE)
@PreAuthorize(AuthConstants.IS_AUTHENTICATED)
public ResourceSummaryDto<AssetSummaryDto> getAssetSummary() {
- return getResourceManager().getSummary(getAuthentication());
+ return resourceManager.manageAssets().getSummary(getAuthentication());
}
@GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
@PreAuthorize(AuthConstants.IS_AUTHENTICATED)
@PostFilter("hasPermission(filterObject.elementId, 'READ')")
public List<SpAssetModel> getAll() {
- return resourceManager.findAll();
+ return assetResourceManager.findAll();
}
@PostMapping(produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
@PreAuthorize(AuthConstants.HAS_WRITE_ASSETS_PRIVILEGE)
public ResponseEntity<?> create(@RequestBody SpAssetModel asset) {
- resourceManager.create(asset, getAuthenticatedUserSid());
+ assetResourceManager.create(asset, getAuthenticatedUserSid());
return ok();
}
@GetMapping(path = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
@PreAuthorize(AuthConstants.IS_AUTHENTICATED + " and hasPermission(#elementId, 'READ')")
public ResponseEntity<SpAssetModel> getAsset(@PathVariable("id") String elementId) {
- var obj = resourceManager.find(elementId);
+ var obj = assetResourceManager.find(elementId);
if (obj != null) {
return ok(obj);
} else {
@@ -93,8 +99,8 @@ public class AssetManagementResource extends AbstractAuthGuardedRestResource {
public ResponseEntity<SpAssetModel> update(@PathVariable("id") String elementId,
@RequestBody SpAssetModel asset) {
if (elementId.equals(asset.getElementId())) {
- resourceManager.update(asset);
- return ok(resourceManager.find(elementId));
+ assetResourceManager.update(asset);
+ return ok(assetResourceManager.find(elementId));
} else {
throw new ResponseStatusException(HttpStatus.FORBIDDEN);
}
@@ -103,7 +109,7 @@ public class AssetManagementResource extends AbstractAuthGuardedRestResource {
@DeleteMapping(path = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
@PreAuthorize(AuthConstants.HAS_WRITE_ASSETS_PRIVILEGE + " and hasPermission(#elementId, 'WRITE')")
public ResponseEntity<Void> delete(@PathVariable("id") String elementId) {
- resourceManager.delete(elementId);
+ assetResourceManager.delete(elementId);
return ok();
}
@@ -113,8 +119,4 @@ public class AssetManagementResource extends AbstractAuthGuardedRestResource {
public boolean hasWriteAuthority() {
return isAdminOrHasAnyAuthority(DefaultPrivilege.Constants.PRIVILEGE_WRITE_ASSETS_VALUE);
}
-
- private AssetResourceManager getResourceManager() {
- return getSpResourceManager().manageAssets();
- }
}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/Authentication.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/Authentication.java
index 456a2aa9d6..97826293b7 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/Authentication.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/Authentication.java
@@ -30,6 +30,7 @@ import org.apache.streampipes.model.configuration.GeneralConfig;
import org.apache.streampipes.model.message.NotificationType;
import org.apache.streampipes.model.message.Notifications;
import org.apache.streampipes.model.message.SuccessMessage;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.rest.core.base.impl.AbstractRestResource;
import org.apache.streampipes.rest.shared.exception.SpMessageException;
import org.apache.streampipes.storage.management.StorageDispatcher;
@@ -72,9 +73,12 @@ public class Authentication extends AbstractRestResource {
private static final long MIN_REFRESH_COOKIE_SECONDS = 1;
AuthenticationManager authenticationManager;
+ private final SpResourceManager resourceManager;
- public Authentication(AuthenticationManager authenticationManager) {
+ public Authentication(AuthenticationManager authenticationManager,
+ SpResourceManager resourceManager) {
this.authenticationManager = authenticationManager;
+ this.resourceManager = resourceManager;
}
@PostMapping(
@@ -169,7 +173,7 @@ public class Authentication extends AbstractRestResource {
config.getDefaultUserRoles()
);
try {
- getSpResourceManager().manageUsers().registerUser(enrichedUserRegistrationData);
+ resourceManager.manageUsers().registerUser(enrichedUserRegistrationData);
return ok(new SuccessMessage(NotificationType.REGISTRATION_SUCCESS.uiNotification()));
} catch (UsernameAlreadyTakenException e) {
throw new SpMessageException(
@@ -187,7 +191,7 @@ public class Authentication extends AbstractRestResource {
produces = org.springframework.http.MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<?> sendPasswordRecoveryLink(@PathVariable("username") String username) {
try {
- getSpResourceManager().manageUsers().sendPasswordRecoveryLink(username);
+ resourceManager.manageUsers().sendPasswordRecoveryLink(username);
return ok(new SuccessMessage(NotificationType.PASSWORD_RECOVERY_LINK_SENT.uiNotification()));
} catch (UserNotFoundException e) {
return ok();
@@ -229,7 +233,7 @@ public class Authentication extends AbstractRestResource {
setRefreshCookie(request, response, issuedRefreshToken);
}
((UserAccount) principal).setLastLoginAtMillis(System.currentTimeMillis());
- getSpResourceManager().manageUsers().updateUser(principal);
+ resourceManager.manageUsers().updateUser(principal);
return ok(tokenResp);
} else {
throw new BadCredentialsException("Could not create auth token");
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/CompactPipelineResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/CompactPipelineResource.java
index c25f6dd8c4..b21f035a14 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/CompactPipelineResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/CompactPipelineResource.java
@@ -26,6 +26,7 @@ import org.apache.streampipes.model.message.NotificationType;
import org.apache.streampipes.model.message.Notifications;
import org.apache.streampipes.model.pipeline.PipelineOperationStatus;
import org.apache.streampipes.model.pipeline.compact.CompactPipeline;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.rest.core.base.impl.AbstractAuthGuardedRestResource;
import org.apache.streampipes.rest.security.AuthConstants;
@@ -45,13 +46,19 @@ public class CompactPipelineResource extends AbstractAuthGuardedRestResource {
private final CompactPipelineManagement compactPipelineManagement;
private final ExtensionServiceRequestManager requestManager;
+ private final PipelineManager pipelineManager;
- public CompactPipelineResource(ExtensionServiceRequestManager requestManager) {
+ public CompactPipelineResource(ExtensionServiceRequestManager requestManager,
+ SpResourceManager resourceManager) {
this.compactPipelineManagement = new CompactPipelineManagement(
getPipelineElementStorage(),
requestManager
);
this.requestManager = requestManager;
+ this.pipelineManager = new PipelineManager(
+ getPipelineStorage(),
+ resourceManager
+ );
}
@PostMapping(
@@ -68,10 +75,10 @@ public class CompactPipelineResource extends AbstractAuthGuardedRestResource {
var pipelineGenerationResult = compactPipelineManagement.makePipeline(compactPipeline);
if (pipelineGenerationResult.allPipelineElementsValid()) {
- String pipelineId = PipelineManager.addPipeline(getAuthenticatedUserSid(), pipelineGenerationResult.pipeline());
+ String pipelineId = pipelineManager.addPipeline(getAuthenticatedUserSid(), pipelineGenerationResult.pipeline());
if (compactPipeline.createOptions().start()) {
try {
- PipelineOperationStatus status = PipelineManager.startPipeline(pipelineId, requestManager);
+ PipelineOperationStatus status = pipelineManager.startPipeline(pipelineId, requestManager);
return ok(status);
} catch (Exception e) {
return statusMessage(Notifications.error(NotificationType.UNKNOWN_ERROR));
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineMonitoring.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineMonitoring.java
index e3fbb88933..21ff3edb1c 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineMonitoring.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineMonitoring.java
@@ -23,6 +23,7 @@ import org.apache.streampipes.manager.pipeline.ExtensionsServiceLogExecutor;
import org.apache.streampipes.model.client.user.DefaultPrivilege;
import org.apache.streampipes.model.monitoring.SpLogEntry;
import org.apache.streampipes.model.monitoring.SpMetricsEntry;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
@@ -42,8 +43,9 @@ public class PipelineMonitoring extends AbstractMonitoringResource {
private final ExtensionServiceRequestManager extensionServiceRequestManager;
- public PipelineMonitoring(ExtensionServiceRequestManager extensionServiceRequestManager) {
- super(extensionServiceRequestManager);
+ public PipelineMonitoring(ExtensionServiceRequestManager extensionServiceRequestManager,
+ SpResourceManager resourceManager) {
+ super(extensionServiceRequestManager, resourceManager);
this.extensionServiceRequestManager = extensionServiceRequestManager;
}
@@ -68,7 +70,7 @@ public class PipelineMonitoring extends AbstractMonitoringResource {
@RequestParam(value = "forceUpdate", required = false, defaultValue = "false") boolean forceUpdate
) {
if (forceUpdate) {
- new ExtensionsServiceLogExecutor(extensionServiceRequestManager).triggerUpdate();
+ new ExtensionsServiceLogExecutor(extensionServiceRequestManager, resourceManager).triggerUpdate();
}
return ok(ExtensionsLogProvider.INSTANCE.getMetricInfosForPipeline(pipelineId));
}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineResource.java
index f88a28c4ea..92a8d69251 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineResource.java
@@ -43,11 +43,15 @@ import org.apache.streampipes.model.pipeline.PipelineOperationStatus;
import org.apache.streampipes.model.pipeline.PipelineSummaryDto;
import org.apache.streampipes.model.pipeline.compact.CompactPipeline;
import org.apache.streampipes.model.resource.ResourceSummaryDto;
-import org.apache.streampipes.resource.management.PipelineResourceManager;
+import org.apache.streampipes.resource.management.DataProcessorResourceManager;
+import org.apache.streampipes.resource.management.DataSinkResourceManager;
+import org.apache.streampipes.resource.management.PermissionResourceManager;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.rest.core.base.impl.AbstractAuthGuardedRestResource;
import org.apache.streampipes.rest.shared.exception.SpMessageException;
import org.apache.streampipes.rest.shared.exception.SpNotificationException;
import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
+import org.apache.streampipes.storage.api.pipeline.IPipelineStorage;
import org.apache.streampipes.storage.management.StorageDispatcher;
import com.google.gson.JsonSyntaxException;
@@ -91,19 +95,28 @@ public class PipelineResource extends AbstractAuthGuardedRestResource {
private final CompactPipelineManagement compactPipelineManagement;
private final ExtensionServiceRequestManager requestManager;
private final MeasurementUpdateManagement measurementUpdateManagement;
- private final IDataExplorerWidgetStorage chartStorage;
+ private final PipelineManager pipelineManager;
+ private final DataProcessorResourceManager dataProcessorResourceManager;
+ private final DataSinkResourceManager dataSinkResourceManager;
+ private final SpResourceManager resourceManager;
public PipelineResource(ExtensionServiceRequestManager requestManager,
+ SpResourceManager resourceManager,
IDataExplorerWidgetStorage chartStorage) {
+ this.resourceManager = resourceManager;
this.compactPipelineManagement = new CompactPipelineManagement(
StorageDispatcher.INSTANCE.getNoSqlStore().getPipelineElementDescriptionStorage(),
requestManager
);
this.requestManager = requestManager;
- this.chartStorage = chartStorage;
this.measurementUpdateManagement = new MeasurementUpdateManagement(
new ChartSchemaUpdateCoordinator(chartStorage)
);
+ PermissionResourceManager permissionResourceManager = resourceManager.managePermissions();
+ IPipelineStorage pipelineStorage = StorageDispatcher.INSTANCE.getNoSqlStore().getPipelineStorageAPI();
+ this.pipelineManager = new PipelineManager(pipelineStorage, resourceManager);
+ this.dataProcessorResourceManager = new DataProcessorResourceManager(permissionResourceManager);
+ this.dataSinkResourceManager = new DataSinkResourceManager(permissionResourceManager);
}
@GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
@@ -116,13 +129,13 @@ public class PipelineResource extends AbstractAuthGuardedRestResource {
@PreAuthorize("this.hasReadAuthority()")
@PostFilter("hasPermission(filterObject.pipelineId, 'READ')")
public List<Pipeline> get() {
- return PipelineManager.getAllPipelines();
+ return pipelineManager.getAllPipelines();
}
@GetMapping(path = "/summary", produces = MediaType.APPLICATION_JSON_VALUE)
@PreAuthorize("this.hasReadAuthority()")
public ResourceSummaryDto<PipelineSummaryDto> getPipelineSummary() {
- return new PipelineResourceManager().getSummary(getAuthentication());
+ return resourceManager.managePipelines().getSummary(getAuthentication());
}
@@ -141,7 +154,7 @@ public class PipelineResource extends AbstractAuthGuardedRestResource {
@Operation(summary = "Delete a pipeline with a given id", tags = {"Pipeline"})
@PreAuthorize("this.hasWriteAuthority() and hasPermission(#pipelineId, 'WRITE')")
public Message delete(@PathVariable("pipelineId") String pipelineId) {
- PipelineManager.deletePipeline(pipelineId);
+ pipelineManager.deletePipeline(pipelineId);
return Notifications.success("Pipeline deleted");
}
@@ -149,12 +162,12 @@ public class PipelineResource extends AbstractAuthGuardedRestResource {
@Operation(summary = "Get a specific pipeline with the given id", tags = {"Pipeline"})
@PreAuthorize("this.hasReadAuthority() and hasPermission(#pipelineId, 'READ')")
public ResponseEntity<Pipeline> getElement(@PathVariable("pipelineId") String pipelineId) {
- Pipeline foundPipeline = PipelineManager.getPipeline(pipelineId);
+ Pipeline foundPipeline = pipelineManager.getPipeline(pipelineId);
if (foundPipeline == null) {
throw new ResponseStatusException(NOT_FOUND, "Pipeline with " + pipelineId + " not found.");
} else {
- return ok(PipelineManager.getPipeline(pipelineId));
+ return ok(pipelineManager.getPipeline(pipelineId));
}
}
@@ -163,7 +176,7 @@ public class PipelineResource extends AbstractAuthGuardedRestResource {
@PreAuthorize("this.hasWriteAuthority() and hasPermission(#pipelineId, 'WRITE')")
public ResponseEntity<?> start(@PathVariable("pipelineId") String pipelineId) {
try {
- PipelineOperationStatus status = PipelineManager.startPipeline(pipelineId, requestManager);
+ PipelineOperationStatus status = pipelineManager.startPipeline(pipelineId, requestManager);
return ok(status);
} catch (Exception e) {
@@ -178,7 +191,7 @@ public class PipelineResource extends AbstractAuthGuardedRestResource {
public ResponseEntity<?> stop(@PathVariable("pipelineId") String pipelineId,
@RequestParam(value = "forceStop", defaultValue = "false") boolean forceStop) {
try {
- PipelineOperationStatus status = PipelineManager.stopPipeline(pipelineId, forceStop, requestManager);
+ PipelineOperationStatus status = pipelineManager.stopPipeline(pipelineId, forceStop, requestManager);
return ok(status);
} catch (Exception e) {
LOG.error(e.getMessage());
@@ -194,7 +207,7 @@ public class PipelineResource extends AbstractAuthGuardedRestResource {
@PreAuthorize("this.hasWriteAuthority()")
public ResponseEntity<SuccessMessage> addPipeline(@RequestBody Pipeline pipeline) {
- String pipelineId = PipelineManager.addPipeline(getAuthenticatedUserSid(), pipeline);
+ String pipelineId = pipelineManager.addPipeline(getAuthenticatedUserSid(), pipeline);
SuccessMessage message = Notifications.success("Pipeline stored");
message.addNotification(new Notification("id", pipelineId));
return ok(message);
@@ -232,7 +245,9 @@ public class PipelineResource extends AbstractAuthGuardedRestResource {
public PipelineElementRecommendationMessage recommend(@RequestBody Pipeline pipeline,
@PathVariable("recId") String baseRecElement) {
try {
- return new ElementRecommender(pipeline, baseRecElement, requestManager).findRecommendedElements();
+ return new ElementRecommender(
+ pipeline, baseRecElement, requestManager, dataProcessorResourceManager, dataSinkResourceManager
+ ).findRecommendedElements();
} catch (JsonSyntaxException e) {
throw new SpNotificationException(
HttpStatus.BAD_REQUEST,
@@ -277,7 +292,7 @@ public class PipelineResource extends AbstractAuthGuardedRestResource {
@Operation(summary = "Update an existing pipeline", tags = {"Pipeline"})
@PreAuthorize("this.hasWriteAuthority() and hasPermission(#pipelineId, 'WRITE')")
public ResponseEntity<SuccessMessage> updatePipeline(@PathVariable("pipelineId") String pipelineId,
- @RequestBody Pipeline pipeline) {
+ @RequestBody Pipeline pipeline) {
Pipeline storedPipeline = getPipelineStorage().getElementById(pipelineId);
if (!storedPipeline.isRunning()) {
storedPipeline.setStreams(pipeline.getStreams());
@@ -301,12 +316,12 @@ public class PipelineResource extends AbstractAuthGuardedRestResource {
path = "/contains/{elementId}")
@Operation(summary = "Returns all pipelines that contain the element with the elementId", tags = {
"Pipeline"}, responses = {@ApiResponse(content = {
- @Content(mediaType = "application/json",
+ @Content(mediaType = "application/json",
array = @ArraySchema(schema = @Schema(implementation = Pipeline.class)))})})
@PreAuthorize("this.hasReadAuthority()")
@PostFilter("hasPermission(filterObject.pipelineId, 'READ')")
public List<Pipeline> getPipelinesContainingElement(@PathVariable("elementId") String elementId) {
- return PipelineManager.getPipelinesContainingElements(elementId);
+ return pipelineManager.getPipelinesContainingElements(elementId);
}
/**
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/ResetResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/ResetResource.java
index 210f82595e..769264c90e 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/ResetResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/ResetResource.java
@@ -20,9 +20,12 @@ package org.apache.streampipes.rest.impl;
import org.apache.streampipes.connect.management.management.WorkerRestClient;
import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequestManager;
+import org.apache.streampipes.manager.pipeline.PipelineManager;
+import org.apache.streampipes.manager.pipeline.update.ChartSchemaUpdateCoordinator;
import org.apache.streampipes.model.client.user.PrincipalType;
import org.apache.streampipes.model.message.Notifications;
import org.apache.streampipes.model.message.SuccessMessage;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.rest.ResetManagement;
import org.apache.streampipes.rest.core.base.impl.AbstractAuthGuardedRestResource;
import org.apache.streampipes.rest.security.AuthConstants;
@@ -51,10 +54,19 @@ public class ResetResource extends AbstractAuthGuardedRestResource {
public ResetResource(WorkerRestClient workerRestClient,
ExtensionServiceRequestManager requestManager,
- IDataExplorerWidgetStorage widgetStorage) {
+ SpResourceManager resourceManager) {
IExtensionsServiceStorage extensionsServiceStorage = StorageDispatcher.INSTANCE.getNoSqlStore().getExtensionsServiceStorage();
+ var pipelineManager = new PipelineManager(
+ StorageDispatcher.INSTANCE.getNoSqlStore().getPipelineStorageAPI(),
+ resourceManager
+ );
this.resetManagement = new ResetManagement(
- widgetStorage, workerRestClient, extensionsServiceStorage, requestManager
+ workerRestClient,
+ extensionsServiceStorage,
+ requestManager,
+ pipelineManager,
+ resourceManager,
+ new ChartSchemaUpdateCoordinator((IDataExplorerWidgetStorage) resourceManager.manageCharts().getDb())
);
}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/RestorePasswordResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/RestorePasswordResource.java
index 2cdd8c00bd..8caacca855 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/RestorePasswordResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/RestorePasswordResource.java
@@ -18,6 +18,7 @@
package org.apache.streampipes.rest.impl;
import org.apache.streampipes.model.client.user.UserRegistrationData;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.rest.core.base.impl.AbstractRestResource;
import org.springframework.http.MediaType;
@@ -36,10 +37,16 @@ import java.security.spec.InvalidKeySpecException;
@RequestMapping("/api/v2/restore-password")
public class RestorePasswordResource extends AbstractRestResource {
+ private final SpResourceManager resourceManager;
+
+ public RestorePasswordResource(SpResourceManager resourceManager) {
+ this.resourceManager = resourceManager;
+ }
+
@GetMapping(path = "{recoveryCode}", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Void> checkTokenValidity(@PathVariable("recoveryCode") String recoveryCode) {
try {
- getSpResourceManager().manageUsers().checkPasswordRecoveryCode(recoveryCode);
+ resourceManager.manageUsers().checkPasswordRecoveryCode(recoveryCode);
return ok();
} catch (IllegalArgumentException e) {
return badRequest();
@@ -54,7 +61,7 @@ public class RestorePasswordResource extends AbstractRestResource {
@RequestBody UserRegistrationData userRegistrationData
) {
try {
- getSpResourceManager().manageUsers().changePassword(recoveryCode, userRegistrationData);
+ resourceManager.manageUsers().changePassword(recoveryCode, userRegistrationData);
return ok();
} catch (IllegalArgumentException e) {
return badRequest();
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/DataExportResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/DataExportResource.java
index e6a3fe9ce0..c5ae16091c 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/DataExportResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/DataExportResource.java
@@ -20,10 +20,11 @@ package org.apache.streampipes.rest.impl.admin;
import org.apache.streampipes.export.ExportManager;
import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequestManager;
+import org.apache.streampipes.manager.pipeline.PipelineManager;
import org.apache.streampipes.model.export.ExportConfiguration;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.rest.core.base.impl.AbstractAuthGuardedRestResource;
import org.apache.streampipes.rest.security.AuthConstants;
-import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
@@ -42,12 +43,15 @@ import java.util.List;
public class DataExportResource extends AbstractAuthGuardedRestResource {
private final ExtensionServiceRequestManager extensionServiceRequestManager;
- private final IDataExplorerWidgetStorage chartStorage;
+ private final PipelineManager pipelineManager;
+ private final SpResourceManager resourceManager;
public DataExportResource(ExtensionServiceRequestManager extensionServiceRequestManager,
- IDataExplorerWidgetStorage chartStorage) {
+ SpResourceManager resourceManager) {
this.extensionServiceRequestManager = extensionServiceRequestManager;
- this.chartStorage = chartStorage;
+ this.pipelineManager = new PipelineManager(getNoSqlStorage().getPipelineStorageAPI(), resourceManager);
+ this.resourceManager = resourceManager;
+
}
@PostMapping(
@@ -55,7 +59,8 @@ public class DataExportResource extends AbstractAuthGuardedRestResource {
consumes = MediaType.APPLICATION_JSON_VALUE,
produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<ExportConfiguration> getExportPreview(@RequestBody List<String> selectedAssetIds) {
- var exportConfig = ExportManager.getExportPreview(selectedAssetIds, extensionServiceRequestManager, chartStorage);
+ var exportConfig = ExportManager.getExportPreview(
+ selectedAssetIds, extensionServiceRequestManager, resourceManager, pipelineManager);
return ok(exportConfig);
}
@@ -65,7 +70,11 @@ public class DataExportResource extends AbstractAuthGuardedRestResource {
produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
public ResponseEntity<byte[]> download(@RequestBody ExportConfiguration exportConfiguration) throws IOException {
var applicationPackage = ExportManager
- .getExportPackage(exportConfiguration, extensionServiceRequestManager, chartStorage);
+ .getExportPackage(
+ exportConfiguration,
+ extensionServiceRequestManager,
+ resourceManager,
+ pipelineManager);
return ok(applicationPackage);
}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/DataImportResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/DataImportResource.java
index baadde3df1..e87e1f34ce 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/DataImportResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/DataImportResource.java
@@ -20,10 +20,11 @@ package org.apache.streampipes.rest.impl.admin;
import org.apache.streampipes.export.ImportManager;
import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequestManager;
+import org.apache.streampipes.manager.pipeline.PipelineManager;
import org.apache.streampipes.model.export.AssetExportConfiguration;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.rest.core.base.impl.AbstractAuthGuardedRestResource;
import org.apache.streampipes.rest.security.AuthConstants;
-import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -45,12 +46,14 @@ public class DataImportResource extends AbstractAuthGuardedRestResource {
private static final Logger LOG = LoggerFactory.getLogger(DataImportResource.class);
private final ExtensionServiceRequestManager extensionServiceRequestManager;
- private final IDataExplorerWidgetStorage chartStorage;
+ private final PipelineManager pipelineManager;
+ private final SpResourceManager resourceManager;
public DataImportResource(ExtensionServiceRequestManager extensionServiceRequestManager,
- IDataExplorerWidgetStorage chartStorage) {
+ SpResourceManager resourceManager) {
this.extensionServiceRequestManager = extensionServiceRequestManager;
- this.chartStorage = chartStorage;
+ this.pipelineManager = new PipelineManager(getPipelineStorage(), resourceManager);
+ this.resourceManager = resourceManager;
}
@PostMapping(
@@ -59,7 +62,12 @@ public class DataImportResource extends AbstractAuthGuardedRestResource {
produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<AssetExportConfiguration> getImportPreview(@RequestPart("file_upload") MultipartFile fileDetail)
throws IOException {
- var importConfig = ImportManager.getImportPreview(fileDetail.getInputStream(), extensionServiceRequestManager, chartStorage);
+ var importConfig = ImportManager.getImportPreview(
+ fileDetail.getInputStream(),
+ extensionServiceRequestManager,
+ resourceManager,
+ pipelineManager
+ );
return ok(importConfig);
}
@@ -74,7 +82,8 @@ public class DataImportResource extends AbstractAuthGuardedRestResource {
exportConfiguration,
getAuthenticatedUserSid(),
extensionServiceRequestManager,
- chartStorage
+ resourceManager,
+ pipelineManager
);
return ok();
} catch (IOException e) {
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/ExtensionsInstallationResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/ExtensionsInstallationResource.java
index 25bdc14fac..b62931e4da 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/ExtensionsInstallationResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/ExtensionsInstallationResource.java
@@ -29,6 +29,12 @@ import org.apache.streampipes.model.extensions.svcdiscovery.SpServiceRegistratio
import org.apache.streampipes.model.message.Message;
import org.apache.streampipes.model.message.Notification;
import org.apache.streampipes.model.message.NotificationType;
+import org.apache.streampipes.resource.management.AdapterDescriptionResourceManager;
+import org.apache.streampipes.resource.management.DataProcessorResourceManager;
+import org.apache.streampipes.resource.management.DataSinkResourceManager;
+import org.apache.streampipes.resource.management.DataStreamResourceManager;
+import org.apache.streampipes.resource.management.PermissionResourceManager;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.rest.core.base.impl.AbstractAuthGuardedRestResource;
import org.apache.streampipes.rest.security.AuthConstants;
import org.apache.streampipes.storage.api.pipeline.IPipelineElementDescriptionStorage;
@@ -54,9 +60,21 @@ import java.util.Set;
public class ExtensionsInstallationResource extends AbstractAuthGuardedRestResource {
private final ExtensionServiceRequestManager extensionServiceRequestManager;
+ private final DataSinkResourceManager dataSinkResourceManager;
+ private final DataProcessorResourceManager dataProcessorResourceManager;
+ private final AdapterDescriptionResourceManager adapterDescriptionResourceManager;
+ private final DataStreamResourceManager dataStreamResourceManager;
+ private final SpResourceManager resourceManager;
- public ExtensionsInstallationResource(ExtensionServiceRequestManager extensionServiceRequestManager) {
+ public ExtensionsInstallationResource(ExtensionServiceRequestManager extensionServiceRequestManager,
+ SpResourceManager resourceManager) {
+ this.resourceManager = resourceManager;
this.extensionServiceRequestManager = extensionServiceRequestManager;
+ PermissionResourceManager permissionResourceManager = resourceManager.managePermissions();
+ this.dataSinkResourceManager = resourceManager.manageDataSinks();
+ this.dataProcessorResourceManager = resourceManager.manageDataProcessors();
+ this.adapterDescriptionResourceManager = resourceManager.manageAdapterDescriptions();
+ this.dataStreamResourceManager = resourceManager.manageDataStreams();
}
@PostMapping(
@@ -65,7 +83,7 @@ public class ExtensionsInstallationResource extends AbstractAuthGuardedRestResou
public ResponseEntity<Message> addElement(@RequestBody ExtensionItemInstallationRequest installationReq) {
try {
var service = findSupportedService(installationReq);
- return ok(new ExtensionItemInstaller(service, extensionServiceRequestManager)
+ return ok(new ExtensionItemInstaller(service, extensionServiceRequestManager, resourceManager)
.installExtension(installationReq, getAuthenticatedUserSid()));
} catch (IOException | SepaParseException | NoServiceEndpointsAvailableException e) {
return constructErrorMessage(new Notification(NotificationType.PARSE_ERROR, e.getMessage()));
@@ -78,7 +96,7 @@ public class ExtensionsInstallationResource extends AbstractAuthGuardedRestResou
public ResponseEntity<Message> updateElement(@RequestBody ExtensionItemInstallationRequest installationReq) {
try {
var service = findSupportedService(installationReq);
- return ok(new ExtensionItemInstaller(service, extensionServiceRequestManager)
+ return ok(new ExtensionItemInstaller(service, extensionServiceRequestManager, resourceManager)
.updateExtension(installationReq));
} catch (IOException | SepaParseException | NoServiceEndpointsAvailableException e) {
return constructErrorMessage(new Notification(NotificationType.PARSE_ERROR, e.getMessage()));
@@ -88,21 +106,20 @@ public class ExtensionsInstallationResource extends AbstractAuthGuardedRestResou
@DeleteMapping(path = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Message> deleteElement(@PathVariable("id") String elementId) {
IPipelineElementDescriptionStorage requestor = getPipelineElementStorage();
- var resourceManager = getSpResourceManager();
String appId;
try {
if (requestor.existsDataProcessor(elementId)) {
appId = requestor.getDataProcessorById(elementId).getAppId();
- resourceManager.manageDataProcessors().delete(elementId);
+ dataProcessorResourceManager.delete(elementId);
} else if (requestor.existsDataStream(elementId)) {
appId = requestor.getDataStreamById(elementId).getAppId();
- resourceManager.manageDataStreams().delete(elementId);
+ dataStreamResourceManager.delete(elementId);
} else if (requestor.existsDataSink(elementId)) {
appId = requestor.getDataSinkById(elementId).getAppId();
- resourceManager.manageDataSinks().delete(elementId);
+ dataSinkResourceManager.delete(elementId);
} else if (requestor.existsAdapterDescription(elementId)) {
appId = requestor.getAdapterById(elementId).getAppId();
- resourceManager.manageAdapterDescriptions().delete(elementId);
+ adapterDescriptionResourceManager.delete(elementId);
} else {
return constructErrorMessage(new Notification(NotificationType.STORAGE_ERROR.title(),
NotificationType.STORAGE_ERROR.description()));
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/MigrationResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/MigrationResource.java
index 5fc813d6de..0bb834041e 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/MigrationResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/MigrationResource.java
@@ -28,6 +28,7 @@ import org.apache.streampipes.manager.migration.PipelineElementMigrationManager;
import org.apache.streampipes.model.extensions.svcdiscovery.SpServiceStatus;
import org.apache.streampipes.model.extensions.svcdiscovery.SpServiceTagPrefix;
import org.apache.streampipes.model.migration.ModelMigratorConfig;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.rest.core.base.impl.AbstractAuthGuardedRestResource;
import org.apache.streampipes.rest.security.AuthConstants;
import org.apache.streampipes.rest.shared.exception.SpMessageException;
@@ -77,11 +78,14 @@ public class MigrationResource extends AbstractAuthGuardedRestResource {
);
private final ExtensionServiceRequestManager extensionServiceRequestManager;
private final WorkerRestClient workerRestClient;
+ private final SpResourceManager resourceManager;
public MigrationResource(ExtensionServiceRequestManager extensionServiceRequestManager,
- WorkerRestClient workerRestClient) {
+ WorkerRestClient workerRestClient,
+ SpResourceManager resourceManager) {
this.extensionServiceRequestManager = extensionServiceRequestManager;
this.workerRestClient = workerRestClient;
+ this.resourceManager = resourceManager;
}
@PostMapping(path = "{serviceId}", consumes = MediaType.APPLICATION_JSON_VALUE)
@@ -133,13 +137,15 @@ public class MigrationResource extends AbstractAuthGuardedRestResource {
adapterStorage,
adapterDescriptionStorage,
workerRestClient,
- extensionServiceRequestManager)
+ extensionServiceRequestManager,
+ resourceManager)
.handleMigrations(extensionsServiceConfig, adapterMigrations);
new PipelineElementMigrationManager(
pipelineStorage,
dataProcessorStorage,
dataSinkStorage,
- extensionServiceRequestManager)
+ extensionServiceRequestManager,
+ resourceManager)
.handleMigrations(extensionsServiceConfig, pipelineElementMigrations);
}
}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/PermissionResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/PermissionResource.java
index 91d1b1e72f..937fc17a32 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/PermissionResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/PermissionResource.java
@@ -18,7 +18,9 @@
package org.apache.streampipes.rest.impl.admin;
import org.apache.streampipes.model.client.user.Permission;
+import org.apache.streampipes.resource.management.PermissionResourceManager;
import org.apache.streampipes.rest.core.base.impl.AbstractAuthGuardedRestResource;
+import org.apache.streampipes.storage.api.user.IPermissionStorage;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
@@ -37,10 +39,16 @@ import java.util.Objects;
@RequestMapping("/api/v2/admin/permissions")
public class PermissionResource extends AbstractAuthGuardedRestResource {
+ private final PermissionResourceManager permissionResourceManager;
+
+ public PermissionResource(IPermissionStorage permissionStorage) {
+ this.permissionResourceManager = new PermissionResourceManager(permissionStorage);
+ }
+
@GetMapping(path = "objects/{objectInstanceId}", produces = MediaType.APPLICATION_JSON_VALUE)
public List<Permission> getPermissionForObject(@PathVariable("objectInstanceId") String objectInstanceId) {
var principalId = getAuthenticatedUserSid();
- var permission = getSpResourceManager().managePermissions().findForObjectId(objectInstanceId);
+ var permission = permissionResourceManager.findForObjectId(objectInstanceId);
if (isAdminOrOwner(principalId, permission)) {
return permission;
} else {
@@ -52,12 +60,12 @@ public class PermissionResource extends AbstractAuthGuardedRestResource {
public void updatePermission(@PathVariable("permissionId") String permissionId,
@RequestBody Permission permission) {
var principalId = getAuthenticatedUserSid();
- var existingPermission = getSpResourceManager().managePermissions().findForObjectId(permission.getObjectInstanceId());
+ var existingPermission = permissionResourceManager.findForObjectId(permission.getObjectInstanceId());
if (
permissionId.equals(permission.getPermissionId())
&& isObjectInstanceCorrect(existingPermission, permission)
&& isAdminOrOwner(principalId, existingPermission)) {
- getSpResourceManager().managePermissions().update(permission);
+ permissionResourceManager.update(permission);
} else {
throw new ResponseStatusException(HttpStatus.FORBIDDEN, "Only admins or owners can update permissions");
}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/connect/AdapterResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/connect/AdapterResource.java
index 038e724b21..da43b782af 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/connect/AdapterResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/connect/AdapterResource.java
@@ -27,6 +27,7 @@ import org.apache.streampipes.connect.management.management.WorkerRestClient;
import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequestManager;
import org.apache.streampipes.manager.pipeline.PipelineManager;
import org.apache.streampipes.manager.pipeline.update.ChartSchemaUpdateCoordinator;
+import org.apache.streampipes.manager.pipeline.update.PipelineUpdateCoordinator;
import org.apache.streampipes.model.client.user.DefaultRole;
import org.apache.streampipes.model.client.user.Permission;
import org.apache.streampipes.model.connect.adapter.AdapterDescription;
@@ -38,7 +39,6 @@ import org.apache.streampipes.model.message.Notifications;
import org.apache.streampipes.model.monitoring.SpLogMessage;
import org.apache.streampipes.model.resource.ResourceSummaryDto;
import org.apache.streampipes.model.util.ElementIdGenerator;
-import org.apache.streampipes.resource.management.AdapterResourceManager;
import org.apache.streampipes.resource.management.PermissionResourceManager;
import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.resource.management.permission.SpPermissionEvaluator;
@@ -81,31 +81,44 @@ public class AdapterResource extends AbstractAdapterResource<AdapterMasterManage
private static final Logger LOG = LoggerFactory.getLogger(AdapterResource.class);
private final ExtensionServiceRequestManager requestManager;
private final ApplicationEventPublisher eventPublisher;
- private final ChartSchemaUpdateCoordinator chartSchemaUpdateCoordinator;
+ private final PermissionResourceManager permissionResourceManager;
+ private final PipelineManager pipelineManager;
+ private final PipelineUpdateCoordinator pipelineUpdateCoordinator;
+ private final SpResourceManager resourceManager;
public AdapterResource(WorkerRestClient workerRestClient,
ExtensionServiceRequestManager requestManager,
- IDataExplorerWidgetStorage chartStorage) {
- this(workerRestClient, requestManager, null, chartStorage);
+ SpResourceManager resourceManager) {
+ this(workerRestClient, requestManager, null, resourceManager);
}
@Autowired
public AdapterResource(WorkerRestClient workerRestClient,
ExtensionServiceRequestManager requestManager,
ApplicationEventPublisher eventPublisher,
- IDataExplorerWidgetStorage chartStorage) {
+ SpResourceManager resourceManager) {
super(() -> new AdapterMasterManagement(
StorageDispatcher.INSTANCE.getNoSqlStore()
.getAdapterInstanceStorage(),
- new SpResourceManager().manageAdapters(),
- new SpResourceManager().manageDataStreams(),
+ resourceManager,
AdapterMetricsManager.INSTANCE.getAdapterMetrics(),
workerRestClient,
StorageDispatcher.INSTANCE.getNoSqlStore().getExtensionsServiceStorage(),
requestManager));
this.requestManager = requestManager;
+ this.resourceManager = resourceManager;
this.eventPublisher = eventPublisher;
- this.chartSchemaUpdateCoordinator = new ChartSchemaUpdateCoordinator(chartStorage);
+ this.permissionResourceManager = resourceManager.managePermissions();
+ this.pipelineManager = new PipelineManager(
+ getPipelineStorage(),
+ resourceManager
+ );
+ this.pipelineUpdateCoordinator = new PipelineUpdateCoordinator(
+ requestManager,
+ resourceManager,
+ new ChartSchemaUpdateCoordinator((IDataExplorerWidgetStorage) resourceManager.manageCharts().getDb()),
+ pipelineManager
+ );
}
@PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE)
@@ -142,7 +155,9 @@ public class AdapterResource extends AbstractAdapterResource<AdapterMasterManage
@PutMapping(produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
@PreAuthorize("this.hasWriteAuthority() and hasPermission(#adapterDescription.correspondingDataStreamElementId, 'WRITE')")
public ResponseEntity<? extends Message> updateAdapter(@RequestBody AdapterDescription adapterDescription) {
- var updateManager = new AdapterUpdateManagement(managementService, requestManager, chartSchemaUpdateCoordinator);
+ var updateManager = new AdapterUpdateManagement(
+ managementService, pipelineUpdateCoordinator, resourceManager
+ );
try {
updateManager.updateAdapter(adapterDescription);
publishEvent(new AdapterUpdatedEvent(adapterDescription));
@@ -158,7 +173,9 @@ public class AdapterResource extends AbstractAdapterResource<AdapterMasterManage
@PreAuthorize(AuthConstants.HAS_WRITE_ADAPTER_PRIVILEGE)
public ResponseEntity<List<PipelineUpdateInfo>> performPipelineMigrationPreflight(
@RequestBody AdapterDescription adapterDescription) {
- var updateManager = new AdapterUpdateManagement(managementService, requestManager, chartSchemaUpdateCoordinator);
+ var updateManager = new AdapterUpdateManagement(
+ managementService, pipelineUpdateCoordinator, resourceManager
+ );
var migrations = updateManager.checkPipelineMigrations(adapterDescription);
return ok(migrations);
@@ -277,7 +294,6 @@ public class AdapterResource extends AbstractAdapterResource<AdapterMasterManage
return ResponseEntity.status(HttpStatus.SC_CONFLICT)
.body(String.join(", ", namesOfPipelinesUsingAdapter));
} else {
- PermissionResourceManager permissionResourceManager = new PermissionResourceManager();
// find out the names of pipelines that have an owner and the owner is not the
// current user
List<String> namesOfPipelinesNotOwnedByUser = pipelinesUsingAdapter
@@ -310,8 +326,8 @@ public class AdapterResource extends AbstractAdapterResource<AdapterMasterManage
if (isAdmin || namesOfPipelinesNotOwnedByUser.isEmpty()) {
try {
for (String pipelineId : pipelinesUsingAdapter) {
- PipelineManager.stopPipeline(pipelineId, false, requestManager);
- PipelineManager.deletePipeline(pipelineId);
+ pipelineManager.stopPipeline(pipelineId, false, requestManager);
+ pipelineManager.deletePipeline(pipelineId);
}
managementService.deleteAdapter(elementId);
publishEvent(new AdapterDeletedEvent(adapter));
@@ -351,17 +367,13 @@ public class AdapterResource extends AbstractAdapterResource<AdapterMasterManage
@GetMapping(path = "/summary", produces = MediaType.APPLICATION_JSON_VALUE)
@PreAuthorize("this.hasReadAuthority()")
public ResourceSummaryDto<AdapterSummaryDto> getAdapterSummary() {
- return getResourceManager().getSummary(getAuthentication());
+ return resourceManager.manageAdapters().getSummary(getAuthentication());
}
private AdapterDescription getAdapterDescription(String elementId) throws AdapterException {
return managementService.getAdapter(elementId);
}
- private AdapterResourceManager getResourceManager() {
- return getSpResourceManager().manageAdapters();
- }
-
private CompactAdapter toCompactAdapterDescription(AdapterDescription adapterDescription) throws Exception {
return new CompactAdapterManagement(List.of()).convertToCompactAdapter(adapterDescription);
}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/connect/CompactAdapterResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/connect/CompactAdapterResource.java
index ddff2a5ca4..7563725352 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/connect/CompactAdapterResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/connect/CompactAdapterResource.java
@@ -29,8 +29,10 @@ import org.apache.streampipes.connect.management.management.GuessManagement;
import org.apache.streampipes.connect.management.management.WorkerRestClient;
import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequestManager;
import org.apache.streampipes.manager.execution.endpoint.ExtensionsServiceEndpointGenerator;
+import org.apache.streampipes.manager.pipeline.PipelineManager;
import org.apache.streampipes.manager.pipeline.compact.CompactPipelineManagement;
import org.apache.streampipes.manager.pipeline.update.ChartSchemaUpdateCoordinator;
+import org.apache.streampipes.manager.pipeline.update.PipelineUpdateCoordinator;
import org.apache.streampipes.model.connect.adapter.AdapterDescription;
import org.apache.streampipes.model.connect.adapter.compact.CompactAdapter;
import org.apache.streampipes.model.message.Notifications;
@@ -62,15 +64,15 @@ public class CompactAdapterResource extends AbstractAdapterResource<AdapterMaste
private final CompactAdapterManagement compactAdapterManagement;
private final AdapterUpdateManagement adapterUpdateManagement;
private final ExtensionServiceRequestManager requestManager;
+ private final PipelineManager pipelineManager;
public CompactAdapterResource(WorkerRestClient workerRestClient,
ExtensionServiceRequestManager requestManager,
- IDataExplorerWidgetStorage chartStorage) {
+ SpResourceManager resourceManager) {
super(() -> new AdapterMasterManagement(
StorageDispatcher.INSTANCE.getNoSqlStore()
.getAdapterInstanceStorage(),
- new SpResourceManager().manageAdapters(),
- new SpResourceManager().manageDataStreams(),
+ resourceManager,
AdapterMetricsManager.INSTANCE.getAdapterMetrics(),
workerRestClient,
StorageDispatcher.INSTANCE.getNoSqlStore().getExtensionsServiceStorage(),
@@ -84,8 +86,20 @@ public class CompactAdapterResource extends AbstractAdapterResource<AdapterMaste
this.compactAdapterManagement = new CompactAdapterManagement(
new AdapterGenerationSteps(guessManagement).getGenerators()
);
- var chartCoordinator = new ChartSchemaUpdateCoordinator(chartStorage);
- this.adapterUpdateManagement = new AdapterUpdateManagement(managementService, requestManager, chartCoordinator);
+ this.pipelineManager = new PipelineManager(
+ getPipelineStorage(),
+ resourceManager
+ );
+ var pipelineUpdateCoordinator = new PipelineUpdateCoordinator(
+ requestManager,
+ resourceManager,
+ new ChartSchemaUpdateCoordinator((IDataExplorerWidgetStorage) resourceManager.manageCharts().getDb()),
+ pipelineManager
+ );
+ this.adapterUpdateManagement = new AdapterUpdateManagement(
+ managementService,
+ pipelineUpdateCoordinator,
+ resourceManager);
}
@PostMapping(
@@ -127,6 +141,7 @@ public class CompactAdapterResource extends AbstractAdapterResource<AdapterMaste
getNoSqlStorage().getPipelineElementDescriptionStorage(),
requestManager
),
+ pipelineManager,
getAuthenticatedUserSid()
).createAndStartPersistPipeline(storedAdapter, requestManager);
}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/DataLakeDashboardResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/DataLakeDashboardResource.java
index 4e45709926..62e7e30cf0 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/DataLakeDashboardResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/DataLakeDashboardResource.java
@@ -24,6 +24,7 @@ import org.apache.streampipes.model.dashboard.DashboardModel;
import org.apache.streampipes.model.dashboard.DashboardSummaryDto;
import org.apache.streampipes.model.resource.ResourceSummaryDto;
import org.apache.streampipes.resource.management.DataExplorerResourceManager;
+import org.apache.streampipes.resource.management.PermissionResourceManager;
import org.apache.streampipes.rest.core.base.impl.AbstractAuthGuardedRestResource;
import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
import org.apache.streampipes.storage.api.user.IPermissionStorage;
@@ -53,36 +54,42 @@ public class DataLakeDashboardResource extends AbstractAuthGuardedRestResource {
private final IPermissionStorage permissionStorage;
private final IDataExplorerWidgetStorage chartStorage;
+ private final DataExplorerResourceManager dashboardResourceManager;
- public DataLakeDashboardResource(IDataExplorerWidgetStorage chartStorage) {
- this.permissionStorage = getNoSqlStorage().getPermissionStorage();
+ public DataLakeDashboardResource(IDataExplorerWidgetStorage chartStorage,
+ IPermissionStorage permissionStorage) {
+ this.permissionStorage = permissionStorage;
this.chartStorage = chartStorage;
+ this.dashboardResourceManager = new DataExplorerResourceManager(
+ chartStorage,
+ new PermissionResourceManager(permissionStorage)
+ );
}
@GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
@PreAuthorize("this.hasReadAuthority()")
@PostFilter("hasPermission(filterObject.couchDbId, 'READ')")
public List<DashboardModel> getAllDashboards() {
- return getResourceManager().findAll();
+ return dashboardResourceManager.findAll();
}
@GetMapping(path = "/summary", produces = MediaType.APPLICATION_JSON_VALUE)
@PreAuthorize("this.hasReadAuthority()")
public ResourceSummaryDto<DashboardSummaryDto> getDashboardSummary() {
- return getResourceManager().getSummary(getAuthentication());
+ return dashboardResourceManager.getSummary(getAuthentication());
}
@GetMapping(path = "/{dashboardId}", produces = MediaType.APPLICATION_JSON_VALUE)
@PreAuthorize("this.hasReadAuthority() and hasPermission(#dashboardId, 'READ')")
public DashboardModel getDashboard(@PathVariable("dashboardId") String dashboardId) {
- return getResourceManager().find(dashboardId);
+ return dashboardResourceManager.find(dashboardId);
}
@GetMapping(path = "/{dashboardId}/composite", produces = MediaType.APPLICATION_JSON_VALUE)
@PreAuthorize("this.hasReadAuthorityOrAnonymous(#dashboardId) and hasPermission(#dashboardId, 'READ')")
public ResponseEntity<?> getCompositeDashboardModel(@PathVariable("dashboardId") String dashboardId,
@RequestHeader(value = "If-None-Match", required = false) String ifNoneMatch) {
- var dashboard = getResourceManager().getCompositeDashboard(dashboardId);
+ var dashboard = dashboardResourceManager.getCompositeDashboard(dashboardId);
var currentEtag = "\"" + dashboard.getRevisionHash() + "\"";
if (Objects.nonNull(ifNoneMatch)) {
if (currentEtag.equals(ifNoneMatch)) {
@@ -102,29 +109,24 @@ public class DataLakeDashboardResource extends AbstractAuthGuardedRestResource {
@PutMapping(path = "/{dashboardId}", produces = MediaType.APPLICATION_JSON_VALUE)
@PreAuthorize("this.hasWriteAuthority() and hasPermission(#dashboardModel.couchDbId, 'WRITE')")
public ResponseEntity<DashboardModel> modifyDashboard(@RequestBody DashboardModel dashboardModel) {
- getResourceManager().update(dashboardModel);
- return ok(getResourceManager().find(dashboardModel.getElementId()));
+ dashboardResourceManager.update(dashboardModel);
+ return ok(dashboardResourceManager.find(dashboardModel.getElementId()));
}
@DeleteMapping(path = "/{dashboardId}")
@PreAuthorize("this.hasWriteAuthority() and hasPermission(#dashboardId, 'WRITE')")
public ResponseEntity<Void> deleteDashboard(@PathVariable("dashboardId") String dashboardId) {
- getResourceManager().delete(dashboardId);
+ dashboardResourceManager.delete(dashboardId);
return ok();
}
@PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE)
@PreAuthorize("this.hasWriteAuthority()")
public ResponseEntity<DashboardModel> createDashboard(@RequestBody DashboardModel dashboardModel) {
- var response = getResourceManager().create(dashboardModel, getAuthenticatedUserSid());
+ var response = dashboardResourceManager.create(dashboardModel, getAuthenticatedUserSid());
return ok(response);
}
-
- private DataExplorerResourceManager getResourceManager() {
- return new DataExplorerResourceManager(chartStorage);
- }
-
public boolean hasReadAuthority() {
return isAdminOrHasAnyAuthority(DefaultPrivilege.Constants.PRIVILEGE_READ_DASHBOARD_VALUE);
}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeMeasureResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeMeasureResource.java
index 41d9b19993..bb6b2176c0 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeMeasureResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeMeasureResource.java
@@ -24,7 +24,7 @@ import org.apache.streampipes.model.datalake.DataLakeMeasure;
import org.apache.streampipes.model.datalake.DatasetSummaryDto;
import org.apache.streampipes.model.monitoring.SpLogMessage;
import org.apache.streampipes.model.resource.ResourceSummaryDto;
-import org.apache.streampipes.resource.management.DataLakeMeasureResourceManager;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
import io.swagger.v3.oas.annotations.Operation;
@@ -51,14 +51,18 @@ import java.util.Objects;
@RequestMapping("/api/v4/datalake/measure")
public class DataLakeMeasureResource extends AbstractDataLakeResource {
- public DataLakeMeasureResource(IDataExplorerWidgetStorage chartStorage) {
+ private final SpResourceManager resourceManager;
+
+ public DataLakeMeasureResource(IDataExplorerWidgetStorage chartStorage,
+ SpResourceManager resourceManager) {
super(new ChartSchemaUpdateCoordinator(chartStorage));
+ this.resourceManager = resourceManager;
}
@GetMapping(path = "/summary", produces = MediaType.APPLICATION_JSON_VALUE)
@PreAuthorize("this.hasReadAuthority()")
public ResourceSummaryDto<DatasetSummaryDto> getDatasetSummary() {
- return getResourceManager().getSummary(getAuthentication());
+ return resourceManager.manageDataLakeMeasures().getSummary(getAuthentication());
}
@PostMapping(produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
@@ -149,9 +153,4 @@ public class DataLakeMeasureResource extends AbstractDataLakeResource {
return badRequest(e.getMessage());
}
}
-
- private DataLakeMeasureResourceManager getResourceManager() {
- return getSpResourceManager().manageDataLakeMeasures();
- }
-
}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeWidgetResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeWidgetResource.java
index 0e8501d954..26cf8a47ea 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeWidgetResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeWidgetResource.java
@@ -24,11 +24,12 @@ import org.apache.streampipes.model.datalake.DataExplorerWidgetModel;
import org.apache.streampipes.model.resource.ResourceSummaryDto;
import org.apache.streampipes.resource.management.DataExplorerResourceManager;
import org.apache.streampipes.resource.management.DataExplorerWidgetResourceManager;
-import org.apache.streampipes.resource.management.SpResourceManager;
+import org.apache.streampipes.resource.management.PermissionResourceManager;
import org.apache.streampipes.rest.core.base.impl.AbstractAuthGuardedRestResource;
import org.apache.streampipes.rest.security.AuthConstants;
import org.apache.streampipes.rest.shared.exception.BadRequestException;
import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
+import org.apache.streampipes.storage.api.user.IPermissionStorage;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
@@ -51,10 +52,13 @@ public class DataLakeWidgetResource extends AbstractAuthGuardedRestResource {
private final DataExplorerWidgetResourceManager resourceManager;
- public DataLakeWidgetResource(IDataExplorerWidgetStorage dataExplorerWidgetStorage) {
- this.resourceManager = new SpResourceManager().manageDataExplorerWidget(
- new DataExplorerResourceManager(dataExplorerWidgetStorage),
- dataExplorerWidgetStorage
+ public DataLakeWidgetResource(IDataExplorerWidgetStorage chartStorage,
+ IPermissionStorage permissionStorage) {
+ var permissionResourceManager = new PermissionResourceManager(permissionStorage);
+ this.resourceManager = new DataExplorerWidgetResourceManager(
+ new DataExplorerResourceManager(chartStorage, permissionResourceManager),
+ chartStorage,
+ permissionResourceManager
);
}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/KioskDashboardDataLakeResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/KioskDashboardDataLakeResource.java
index ada7f5a0d8..84305ad078 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/KioskDashboardDataLakeResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/KioskDashboardDataLakeResource.java
@@ -55,7 +55,8 @@ public class KioskDashboardDataLakeResource extends AbstractAuthGuardedRestResou
private final IDataExplorerWidgetStorage dataExplorerWidgetStorage;
private final IPermissionStorage permissionStorage;
- public KioskDashboardDataLakeResource(IDataExplorerWidgetStorage dataExplorerWidgetStorage) {
+ public KioskDashboardDataLakeResource(IDataExplorerWidgetStorage dataExplorerWidgetStorage,
+ IPermissionStorage permissionStorage) {
IDataExplorerSchemaManagement dataExplorerSchemaManagement = new DataExplorerDispatcher()
.getDataExplorerManager()
.getSchemaManagement(new ChartSchemaUpdateCoordinator(dataExplorerWidgetStorage));
@@ -63,7 +64,7 @@ public class KioskDashboardDataLakeResource extends AbstractAuthGuardedRestResou
.getDataExplorerManager()
.getQueryManagement(dataExplorerSchemaManagement);
this.dataExplorerWidgetStorage = dataExplorerWidgetStorage;
- this.permissionStorage = getNoSqlStorage().getPermissionStorage();
+ this.permissionStorage = permissionStorage;
}
@PostMapping(path = "/{dashboardId}/{widgetId}/data",
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/pe/DataProcessorResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/pe/DataProcessorResource.java
index 641ae8c11a..3d76d2d674 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/pe/DataProcessorResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/pe/DataProcessorResource.java
@@ -24,8 +24,10 @@ import org.apache.streampipes.model.message.Message;
import org.apache.streampipes.model.message.NotificationType;
import org.apache.streampipes.model.monitoring.SpLogMessage;
import org.apache.streampipes.resource.management.DataProcessorResourceManager;
+import org.apache.streampipes.resource.management.PermissionResourceManager;
import org.apache.streampipes.rest.core.base.impl.AbstractAuthGuardedRestResource;
import org.apache.streampipes.rest.security.AuthConstants;
+import org.apache.streampipes.storage.api.user.IPermissionStorage;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
@@ -43,24 +45,32 @@ import java.util.List;
@RequestMapping("/api/v2/sepas")
public class DataProcessorResource extends AbstractAuthGuardedRestResource {
+ private final DataProcessorResourceManager dataProcessorResourceManager;
+
+ public DataProcessorResource(IPermissionStorage permissionStorage) {
+ this.dataProcessorResourceManager = new DataProcessorResourceManager(
+ new PermissionResourceManager(permissionStorage)
+ );
+ }
+
@GetMapping(path = "/available", produces = MediaType.APPLICATION_JSON_VALUE)
@PreAuthorize(AuthConstants.HAS_READ_PIPELINE_ELEMENT_PRIVILEGE)
@PostFilter("hasPermission(filterObject.elementId, 'READ')")
public List<DataProcessorDescription> getAvailable() {
- return getDataProcessorResourceManager().findAll();
+ return dataProcessorResourceManager.findAll();
}
@GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
@PreAuthorize(AuthConstants.HAS_READ_PIPELINE_ELEMENT_PRIVILEGE)
@PostFilter("hasPermission(filterObject.belongsTo, 'READ')")
public List<DataProcessorInvocation> getOwn() {
- return getDataProcessorResourceManager().findAllAsInvocation();
+ return dataProcessorResourceManager.findAllAsInvocation();
}
@DeleteMapping(path = "/{elementId}", produces = MediaType.APPLICATION_JSON_VALUE)
@PreAuthorize(AuthConstants.HAS_WRITE_PIPELINE_ELEMENT_PRIVILEGE)
public ResponseEntity<Message> removeOwn(@PathVariable("elementId") String elementId) {
- getDataProcessorResourceManager().delete(elementId);
+ dataProcessorResourceManager.delete(elementId);
return constructSuccessMessage(NotificationType.STORAGE_SUCCESS.uiNotification());
}
@@ -68,14 +78,9 @@ public class DataProcessorResource extends AbstractAuthGuardedRestResource {
@PreAuthorize(AuthConstants.HAS_READ_PIPELINE_ELEMENT_PRIVILEGE)
public ResponseEntity<?> getElement(@PathVariable("elementId") String elementId) {
try {
- return ok(getDataProcessorResourceManager().findAsInvocation(elementId));
+ return ok(dataProcessorResourceManager.findAsInvocation(elementId));
} catch (IllegalArgumentException e) {
return notFound(SpLogMessage.from(e));
}
}
-
- private DataProcessorResourceManager getDataProcessorResourceManager() {
- return getSpResourceManager().manageDataProcessors();
- }
-
}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/pe/DataSinkResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/pe/DataSinkResource.java
index 377b7fe13b..a2567e5ef9 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/pe/DataSinkResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/pe/DataSinkResource.java
@@ -24,8 +24,10 @@ import org.apache.streampipes.model.message.Message;
import org.apache.streampipes.model.message.NotificationType;
import org.apache.streampipes.model.monitoring.SpLogMessage;
import org.apache.streampipes.resource.management.DataSinkResourceManager;
+import org.apache.streampipes.resource.management.PermissionResourceManager;
import org.apache.streampipes.rest.core.base.impl.AbstractAuthGuardedRestResource;
import org.apache.streampipes.rest.security.AuthConstants;
+import org.apache.streampipes.storage.api.user.IPermissionStorage;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
@@ -43,24 +45,32 @@ import java.util.List;
@RequestMapping("/api/v2/actions")
public class DataSinkResource extends AbstractAuthGuardedRestResource {
+ private final DataSinkResourceManager dataSinkResourceManager;
+
+ public DataSinkResource(IPermissionStorage permissionStorage) {
+ this.dataSinkResourceManager = new DataSinkResourceManager(
+ new PermissionResourceManager(permissionStorage)
+ );
+ }
+
@GetMapping(path = "/available", produces = MediaType.APPLICATION_JSON_VALUE)
@PreAuthorize(AuthConstants.HAS_READ_PIPELINE_ELEMENT_PRIVILEGE)
@PostFilter("hasPermission(filterObject.elementId, 'READ')")
public List<DataSinkDescription> getAvailable() {
- return getDataSinkResourceManager().findAll();
+ return dataSinkResourceManager.findAll();
}
@GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
@PreAuthorize(AuthConstants.HAS_READ_PIPELINE_ELEMENT_PRIVILEGE)
@PostFilter("hasPermission(filterObject.belongsTo, 'READ')")
public List<DataSinkInvocation> getOwn() {
- return getDataSinkResourceManager().findAllAsInvocation();
+ return dataSinkResourceManager.findAllAsInvocation();
}
@DeleteMapping(path = "/{elementId}", produces = MediaType.APPLICATION_JSON_VALUE)
@PreAuthorize(AuthConstants.HAS_WRITE_PIPELINE_ELEMENT_PRIVILEGE)
public ResponseEntity<Message> removeOwn(@PathVariable("elementId") String elementId) {
- getDataSinkResourceManager().delete(elementId);
+ dataSinkResourceManager.delete(elementId);
return constructSuccessMessage(NotificationType.STORAGE_SUCCESS.uiNotification());
}
@@ -68,13 +78,9 @@ public class DataSinkResource extends AbstractAuthGuardedRestResource {
@PreAuthorize(AuthConstants.HAS_READ_PIPELINE_ELEMENT_PRIVILEGE)
public ResponseEntity<?> getElement(@PathVariable("elementId") String elementId) {
try {
- return ok(getDataSinkResourceManager().findAsInvocation(elementId));
+ return ok(dataSinkResourceManager.findAsInvocation(elementId));
} catch (IllegalArgumentException e) {
return notFound(SpLogMessage.from(e));
}
}
-
- private DataSinkResourceManager getDataSinkResourceManager() {
- return getSpResourceManager().manageDataSinks();
- }
}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/pe/DataStreamResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/pe/DataStreamResource.java
index 0ac52a394a..19e22717f8 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/pe/DataStreamResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/pe/DataStreamResource.java
@@ -19,14 +19,17 @@
package org.apache.streampipes.rest.impl.pe;
import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequestManager;
+import org.apache.streampipes.manager.pipeline.PipelineManager;
import org.apache.streampipes.manager.pipeline.update.ChartSchemaUpdateCoordinator;
import org.apache.streampipes.manager.pipeline.update.DataStreamUpdateManagement;
+import org.apache.streampipes.manager.pipeline.update.PipelineUpdateCoordinator;
import org.apache.streampipes.model.SpDataStream;
import org.apache.streampipes.model.connect.adapter.PipelineUpdateInfo;
import org.apache.streampipes.model.message.Message;
import org.apache.streampipes.model.message.NotificationType;
import org.apache.streampipes.model.monitoring.SpLogMessage;
import org.apache.streampipes.resource.management.DataStreamResourceManager;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.rest.core.base.impl.AbstractAuthGuardedRestResource;
import org.apache.streampipes.rest.event.DataStreamDeletedEvent;
import org.apache.streampipes.rest.event.DataStreamUpdatedEvent;
@@ -56,13 +59,22 @@ public class DataStreamResource extends AbstractAuthGuardedRestResource {
private final DataStreamUpdateManagement dataStreamUpdateManagement;
private final ApplicationEventPublisher eventPublisher;
+ private final DataStreamResourceManager dataStreamResourceManager;
public DataStreamResource(ExtensionServiceRequestManager requestManager,
ApplicationEventPublisher eventPublisher,
- IDataExplorerWidgetStorage chartStorage) {
- this.dataStreamUpdateManagement = new DataStreamUpdateManagement(
+ IDataExplorerWidgetStorage chartStorage,
+ SpResourceManager resourceManager) {
+ var pipelineUpdateCoordinator = new PipelineUpdateCoordinator(
requestManager,
- new ChartSchemaUpdateCoordinator(chartStorage));
+ resourceManager,
+ new ChartSchemaUpdateCoordinator(chartStorage),
+ new PipelineManager(getPipelineStorage(), resourceManager)
+ );
+ this.dataStreamResourceManager = resourceManager.manageDataStreams();
+ this.dataStreamUpdateManagement = new DataStreamUpdateManagement(
+ pipelineUpdateCoordinator, dataStreamResourceManager
+ );
this.eventPublisher = eventPublisher;
}
@@ -70,21 +82,21 @@ public class DataStreamResource extends AbstractAuthGuardedRestResource {
@PreAuthorize(AuthConstants.HAS_READ_PIPELINE_ELEMENT_PRIVILEGE)
@PostFilter("hasPermission(filterObject.elementId, 'READ')")
public List<SpDataStream> getAvailable() {
- return getDataStreamResourceManager().findAll();
+ return dataStreamResourceManager.findAll();
}
@GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
@PreAuthorize(AuthConstants.HAS_READ_PIPELINE_ELEMENT_PRIVILEGE)
@PostFilter("hasPermission(filterObject.elementId, 'READ')")
public List<SpDataStream> get() {
- return getDataStreamResourceManager().findAllAsInvocation();
+ return dataStreamResourceManager.findAllAsInvocation();
}
@DeleteMapping(path = "/{elementId}", produces = MediaType.APPLICATION_JSON_VALUE)
@PreAuthorize(AuthConstants.HAS_WRITE_PIPELINE_ELEMENT_PRIVILEGE)
public ResponseEntity<Message> delete(@PathVariable("elementId") String elementId) {
publishEvent(new DataStreamDeletedEvent(elementId));
- getDataStreamResourceManager().delete(elementId);
+ dataStreamResourceManager.delete(elementId);
return constructSuccessMessage(NotificationType.STORAGE_SUCCESS.uiNotification());
}
@@ -92,7 +104,7 @@ public class DataStreamResource extends AbstractAuthGuardedRestResource {
@PreAuthorize(AuthConstants.HAS_READ_PIPELINE_ELEMENT_PRIVILEGE)
public ResponseEntity<?> getElement(@PathVariable("elementId") String elementId) {
try {
- return ok(getDataStreamResourceManager().findAsInvocation(elementId));
+ return ok(dataStreamResourceManager.findAsInvocation(elementId));
} catch (IllegalArgumentException e) {
return notFound(SpLogMessage.from(e));
}
@@ -130,17 +142,13 @@ public class DataStreamResource extends AbstractAuthGuardedRestResource {
@PreAuthorize(AuthConstants.HAS_WRITE_PIPELINE_ELEMENT_PRIVILEGE)
public ResponseEntity<?> addDataStream(@RequestBody SpDataStream dataStream) {
try {
- getDataStreamResourceManager().add(dataStream, getAuthenticatedUserSid());
+ dataStreamResourceManager.add(dataStream, getAuthenticatedUserSid());
return ok();
} catch (IllegalArgumentException e) {
return badRequest(e.getMessage());
}
}
- private DataStreamResourceManager getDataStreamResourceManager() {
- return getSpResourceManager().manageDataStreams();
- }
-
private void publishEvent(Object event) {
if (eventPublisher != null) {
eventPublisher.publishEvent(event);
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/runtime/PipelinePreviewResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/runtime/PipelinePreviewResource.java
index 2490fa1fba..e592d1784b 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/runtime/PipelinePreviewResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/runtime/PipelinePreviewResource.java
@@ -23,6 +23,7 @@ import org.apache.streampipes.manager.runtime.DataStreamRuntimeInfoProvider;
import org.apache.streampipes.manager.runtime.RateLimitedRuntimeInfoProvider;
import org.apache.streampipes.model.pipeline.Pipeline;
import org.apache.streampipes.model.preview.PipelinePreviewModel;
+import org.apache.streampipes.resource.management.SpResourceManager;
import org.apache.streampipes.rest.core.base.impl.AbstractAuthGuardedRestResource;
import org.apache.streampipes.rest.shared.exception.BadRequestException;
@@ -43,9 +44,12 @@ import jakarta.servlet.http.HttpServletResponse;
public class PipelinePreviewResource extends AbstractAuthGuardedRestResource {
private final ExtensionServiceRequestManager requestManager;
+ private final SpResourceManager resourceManager;
- public PipelinePreviewResource(ExtensionServiceRequestManager requestManager) {
+ public PipelinePreviewResource(ExtensionServiceRequestManager requestManager,
+ SpResourceManager resourceManager) {
this.requestManager = requestManager;
+ this.resourceManager = resourceManager;
}
@PostMapping(
@@ -53,7 +57,7 @@ public class PipelinePreviewResource extends AbstractAuthGuardedRestResource {
consumes = MediaType.APPLICATION_JSON_VALUE
)
public ResponseEntity<PipelinePreviewModel> requestPipelinePreview(@RequestBody Pipeline pipeline) {
- PipelinePreviewModel previewModel = new PipelinePreview().initiatePreview(pipeline, requestManager);
+ PipelinePreviewModel previewModel = new PipelinePreview(resourceManager).initiatePreview(pipeline, requestManager);
return ok(previewModel);
}
@@ -67,11 +71,11 @@ public class PipelinePreviewResource extends AbstractAuthGuardedRestResource {
try {
// deactivate nginx proxy buffering for better performance of streaming output
response.addHeader("X-Accel-Buffering", "no");
- var spDataStreams = new PipelinePreview().getPipelineElementPreviewStreams(previewId);
+ var spDataStreams = new PipelinePreview(resourceManager).getPipelineElementPreviewStreams(previewId);
var runtimeInfoFetcher = new DataStreamRuntimeInfoProvider(spDataStreams);
var runtimeInfoProvider = new RateLimitedRuntimeInfoProvider(
runtimeInfoFetcher,
- () -> new PipelinePreview().deletePreview(previewId, requestManager)
+ () -> new PipelinePreview(resourceManager).deletePreview(previewId, requestManager)
);
return runtimeInfoProvider::streamOutput;
} catch (IllegalArgumentException e) {
diff --git a/streampipes-service-core/pom.xml b/streampipes-service-core/pom.xml
index caabf9b19d..62a2a2f4aa 100644
--- a/streampipes-service-core/pom.xml
+++ b/streampipes-service-core/pom.xml
@@ -37,6 +37,10 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-cache</artifactId>
+ </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
@@ -114,6 +118,10 @@
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
</dependency>
+ <dependency>
+ <groupId>com.github.ben-manes.caffeine</groupId>
+ <artifactId>caffeine</artifactId>
+ </dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
diff --git a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/PostStartupTask.java b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/PostStartupTask.java
index 1b972e9f71..956a6be858 100644
--- a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/PostStartupTask.java
+++ b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/PostStartupTask.java
@@ -59,21 +59,21 @@ public class PostStartupTask implements Runnable {
private final WorkerAdministrationManagement workerAdministrationManagement;
private final PostStartupRecovery postStartupRecovery;
private final ExtensionServiceRequestManager extensionServiceRequestManager;
+ private final SpResourceManager resourceManager;
private final INoSqlStorage storage = StorageDispatcher.INSTANCE.getNoSqlStore();
public PostStartupTask(IPipelineStorage pipelineStorage,
ExtensionServiceRequestManager extensionServiceRequestManager,
- WorkerRestClient workerRestClient) {
+ WorkerRestClient workerRestClient,
+ SpResourceManager resourceManager) {
this.pipelineStorage = pipelineStorage;
this.extensionServiceRequestManager = extensionServiceRequestManager;
this.executorService = Executors.newSingleThreadScheduledExecutor();
- var resourceManager = new SpResourceManager();
+ this.resourceManager = resourceManager;
this.workerAdministrationManagement = new WorkerAdministrationManagement(
storage.getAdapterDescriptionStorage(),
- storage.getPermissionStorage(),
- resourceManager.manageUsers(),
- resourceManager.managePermissions(),
+ resourceManager,
extensionServiceRequestManager);
this.postStartupRecovery = new PostStartupRecovery(
new ExtensionHealthCheck(
@@ -82,8 +82,7 @@ public class PostStartupTask implements Runnable {
StorageDispatcher.INSTANCE.getNoSqlStore().getAdapterInstanceStorage(),
new AdapterMasterManagement(
StorageDispatcher.INSTANCE.getNoSqlStore().getAdapterInstanceStorage(),
- new SpResourceManager().manageAdapters(),
- new SpResourceManager().manageDataStreams(),
+ resourceManager,
AdapterMetricsManager.INSTANCE.getAdapterMetrics(),
workerRestClient,
StorageDispatcher.INSTANCE.getNoSqlStore().getExtensionsServiceStorage(),
@@ -91,14 +90,15 @@ public class PostStartupTask implements Runnable {
)
),
StorageDispatcher.INSTANCE.getNoSqlStore().getExtensionsServiceStorage(),
- extensionServiceRequestManager
+ extensionServiceRequestManager,
+ resourceManager
)
);
}
@Override
public void run() {
- new ServiceHealthCheck(storage.getExtensionsServiceStorage(), extensionServiceRequestManager).run();
+ new ServiceHealthCheck(storage.getExtensionsServiceStorage(), extensionServiceRequestManager, resourceManager).run();
performAdapterAssetUpdate();
startAllPreviouslyStoppedPipelines();
runHealthCheckOnce();
@@ -152,7 +152,8 @@ public class PostStartupTask implements Runnable {
}
private void startPipeline(Pipeline pipeline, boolean restartOnReboot) {
- PipelineOperationStatus status = new PipelineExecutor(pipeline, extensionServiceRequestManager).startPipeline();
+ PipelineOperationStatus status = new PipelineExecutor(pipeline, extensionServiceRequestManager, resourceManager)
+ .startPipeline();
if (status.isSuccess()) {
LOG.info("Pipeline {} successfully restarted", status.getPipelineName());
Pipeline storedPipeline = getPipelineStorage().getElementById(pipeline.getPipelineId());
diff --git a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/StreamPipesCoreApplication.java b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/StreamPipesCoreApplication.java
index abf883b470..57c809e2f3 100644
--- a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/StreamPipesCoreApplication.java
+++ b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/StreamPipesCoreApplication.java
@@ -64,6 +64,7 @@ import org.apache.streampipes.storage.api.function.IFunctionStateStorage;
import org.apache.streampipes.storage.api.pipeline.IPipelineStorage;
import org.apache.streampipes.storage.api.system.IExtensionsServiceStorage;
import org.apache.streampipes.storage.api.system.ISpCoreConfigurationStorage;
+import org.apache.streampipes.storage.api.user.IPermissionStorage;
import org.apache.streampipes.storage.couchdb.impl.user.UserStorage;
import org.apache.streampipes.storage.couchdb.utils.CouchDbViewGenerator;
import org.apache.streampipes.storage.management.StorageDispatcher;
@@ -118,6 +119,12 @@ public class StreamPipesCoreApplication extends StreamPipesServiceBase {
@Autowired
protected IDataExplorerWidgetStorage chartStorage;
+ @Autowired
+ protected IPermissionStorage permissionStorage;
+
+ @Autowired
+ protected SpResourceManager resourceManager;
+
private final IExtensionsServiceStorage extensionsServiceStorage =
StorageDispatcher.INSTANCE.getNoSqlStore().getExtensionsServiceStorage();
@@ -167,7 +174,7 @@ public class StreamPipesCoreApplication extends StreamPipesServiceBase {
ExtensionsServiceReportExecutor.setServiceReportFetcher(serviceRegistration -> {
var target = ExtensionServiceRequestTargets.serviceLoad(serviceRegistration);
- var response = extensionServiceRequestManager.request(ExtensionServiceRequests.serviceLoad(target));
+ var response = extensionServiceRequestManager.request(ExtensionServiceRequests.serviceLoad(target, resourceManager));
if (!response.isSuccess()) {
throw new IOException("Could not fetch load report from endpoint " + serviceRegistration.getServiceUrl()
@@ -197,34 +204,38 @@ public class StreamPipesCoreApplication extends StreamPipesServiceBase {
executorService.schedule(new PostStartupTask(
getPipelineStorage(),
extensionServiceRequestManager,
- workerRestClient),
+ workerRestClient,
+ resourceManager),
env.getInitialHealthCheckDelayInMillis().getValueOrDefault(),
TimeUnit.MILLISECONDS);
scheduleHealthChecks(env.getHealthCheckIntervalInMillis().getValueOrDefault(), List
.of(new ServiceHealthCheck(
extensionsServiceStorage,
- extensionServiceRequestManager),
+ extensionServiceRequestManager,
+ resourceManager),
new ExtensionHealthCheck(
new ResourceProvider(
StorageDispatcher.INSTANCE.getNoSqlStore().getPipelineStorageAPI(),
StorageDispatcher.INSTANCE.getNoSqlStore().getAdapterInstanceStorage(),
new AdapterMasterManagement(
StorageDispatcher.INSTANCE.getNoSqlStore().getAdapterInstanceStorage(),
- new SpResourceManager().manageAdapters(),
- new SpResourceManager().manageDataStreams(),
+ new SpResourceManager(permissionStorage, chartStorage),
AdapterMetricsManager.INSTANCE.getAdapterMetrics(),
workerRestClient,
extensionsServiceStorage,
extensionServiceRequestManager
)),
StorageDispatcher.INSTANCE.getNoSqlStore().getExtensionsServiceStorage(),
- extensionServiceRequestManager
+ extensionServiceRequestManager,
+ resourceManager
)));
var logFetchInterval = env.getLogFetchIntervalInMillis().getValueOrDefault();
LOG.info("Extensions logs will be fetched every {} milliseconds", logFetchInterval);
- logCheckExecutorService.scheduleAtFixedRate(new ExtensionsServiceLogExecutor(extensionServiceRequestManager),
+ logCheckExecutorService.scheduleAtFixedRate(new ExtensionsServiceLogExecutor(
+ extensionServiceRequestManager, resourceManager
+ ),
logFetchInterval, logFetchInterval,
TimeUnit.MILLISECONDS);
}
@@ -241,7 +252,7 @@ public class StreamPipesCoreApplication extends StreamPipesServiceBase {
}
protected List<Migration> getMigrations() {
- return new AvailableMigrations(chartStorage).getAvailableMigrations();
+ return new AvailableMigrations(chartStorage, permissionStorage).getAvailableMigrations();
}
private boolean isConfigured() {
@@ -256,7 +267,10 @@ public class StreamPipesCoreApplication extends StreamPipesServiceBase {
try {
TimeUnit.MILLISECONDS.sleep(initialSleepBeforeInstallation);
LOG.info("Starting installation procedure");
- new AutoInstallation(extensionServiceRequestManager).startAutoInstallation();
+ new AutoInstallation(
+ extensionServiceRequestManager,
+ new SpResourceManager(permissionStorage, chartStorage)
+ ).startAutoInstallation();
} catch (InterruptedException e) {
LOG.error("Ooops, something went wrong during the installation", e);
}
@@ -277,7 +291,8 @@ public class StreamPipesCoreApplication extends StreamPipesServiceBase {
});
LOG.info("Gracefully stopping all running pipelines...");
- List<PipelineOperationStatus> status = PipelineManager.stopAllPipelines(true, extensionServiceRequestManager);
+ var pipelineManager = new PipelineManager(getPipelineStorage(), resourceManager);
+ List<PipelineOperationStatus> status = pipelineManager.stopAllPipelines(true, extensionServiceRequestManager);
status.forEach(s -> {
if (s.isSuccess()) {
LOG.info("Pipeline {} successfully stopped", s.getPipelineName());
@@ -286,7 +301,7 @@ public class StreamPipesCoreApplication extends StreamPipesServiceBase {
}
});
- new FunctionManager(extensionServiceRequestManager).stopAllFunctionsAndPersistState(functionStateStorage);
+ new FunctionManager(extensionServiceRequestManager, resourceManager).stopAllFunctionsAndPersistState(functionStateStorage);
LOG.info("Thanks for using Apache StreamPipes - see you next time!");
}
diff --git a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/extensions/ExtensionServiceRequestConfiguration.java b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/extensions/ExtensionServiceRequestConfiguration.java
index 40b10b2abb..6c5856c9d2 100644
--- a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/extensions/ExtensionServiceRequestConfiguration.java
+++ b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/extensions/ExtensionServiceRequestConfiguration.java
@@ -22,6 +22,9 @@ import org.apache.streampipes.connect.management.management.WorkerRestClient;
import org.apache.streampipes.manager.api.extensions.ExtensionServiceRequestManager;
import org.apache.streampipes.manager.execution.HttpExtensionServiceRequestManager;
import org.apache.streampipes.model.extensions.transport.ExtensionServiceBrokerTopics;
+import org.apache.streampipes.resource.management.SpResourceManager;
+import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
+import org.apache.streampipes.storage.api.user.IPermissionStorage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -82,7 +85,14 @@ public class ExtensionServiceRequestConfiguration {
}
@Bean
- public WorkerRestClient workerRestClient(ExtensionServiceRequestManager extensionServiceRequestManager) {
- return new WorkerRestClient(extensionServiceRequestManager);
+ public SpResourceManager spResourceManager(IPermissionStorage permissionStorage,
+ IDataExplorerWidgetStorage chartStorage) {
+ return new SpResourceManager(permissionStorage, chartStorage);
+ }
+
+ @Bean
+ public WorkerRestClient workerRestClient(ExtensionServiceRequestManager extensionServiceRequestManager,
+ SpResourceManager resourceManager) {
+ return new WorkerRestClient(extensionServiceRequestManager, resourceManager);
}
}
diff --git a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/AvailableMigrations.java b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/AvailableMigrations.java
index 4c89b7e0be..ec53eb0381 100644
--- a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/AvailableMigrations.java
+++ b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/AvailableMigrations.java
@@ -40,6 +40,7 @@ import org.apache.streampipes.service.core.migrations.v099.RemoveObsoletePrivile
import org.apache.streampipes.service.core.migrations.v099.UniqueDashboardIdMigration;
import org.apache.streampipes.service.core.migrations.v099.connect.MigrateAdaptersToUseScript;
import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
+import org.apache.streampipes.storage.api.user.IPermissionStorage;
import java.util.Arrays;
import java.util.List;
@@ -47,9 +48,12 @@ import java.util.List;
public class AvailableMigrations {
private final IDataExplorerWidgetStorage chartStorage;
+ private final IPermissionStorage permissionStorage;
- public AvailableMigrations(IDataExplorerWidgetStorage chartStorage) {
+ public AvailableMigrations(IDataExplorerWidgetStorage chartStorage,
+ IPermissionStorage permissionStorage) {
this.chartStorage = chartStorage;
+ this.permissionStorage = permissionStorage;
}
public List<Migration> getAvailableMigrations() {
@@ -58,18 +62,18 @@ public class AvailableMigrations {
new ModifyAssetLinkTypesMigration(),
new AddDataLakeMeasureViewMigration(),
new AddDefaultExportProviderMigration(),
- new FixImportedPermissionsMigration(chartStorage),
+ new FixImportedPermissionsMigration(chartStorage, permissionStorage),
new AddAssetManagementViewMigration(),
new MoveAssetContentMigration(),
- new CreateAssetPermissionMigration(),
- new CreateDatasetPermissionMigration(),
+ new CreateAssetPermissionMigration(permissionStorage),
+ new CreateDatasetPermissionMigration(permissionStorage),
new RemoveObsoletePrivilegesMigration(),
new UniqueDashboardIdMigration(),
new AddScriptTemplateViewMigration(),
new ComputeCertificateThumbprintMigration(),
new MigrateAdaptersToUseScript(),
new ModifyAssetLinkIconMigration(),
- new RemoveDuplicatedAssetPermissions(),
+ new RemoveDuplicatedAssetPermissions(permissionStorage),
new AddFunctionStateViewMigration(),
new AddRefreshTokenViewsMigration(),
new RemoveAssetUserRoleMigration(),
diff --git a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v0980/FixImportedPermissionsMigration.java b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v0980/FixImportedPermissionsMigration.java
index 9fc98e05b0..9566e08489 100644
--- a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v0980/FixImportedPermissionsMigration.java
+++ b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v0980/FixImportedPermissionsMigration.java
@@ -37,17 +37,16 @@ import java.util.List;
public class FixImportedPermissionsMigration implements Migration {
private final IDataExplorerWidgetStorage chartStorage;
+ private final IPermissionStorage permissionStorage;
- public FixImportedPermissionsMigration(IDataExplorerWidgetStorage chartStorage) {
+ public FixImportedPermissionsMigration(IDataExplorerWidgetStorage chartStorage,
+ IPermissionStorage permissionStorage) {
this.chartStorage = chartStorage;
+ this.permissionStorage = permissionStorage;
}
private static final Logger LOG = LoggerFactory.getLogger(FixImportedPermissionsMigration.class);
- private final IPermissionStorage permissionStorage =
- StorageDispatcher.INSTANCE.getNoSqlStore()
- .getPermissionStorage();
-
@Override
public boolean shouldExecute() {
return true;
diff --git a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v099/CreateAssetPermissionMigration.java b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v099/CreateAssetPermissionMigration.java
index 3153f0e81f..e8ce41fc91 100644
--- a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v099/CreateAssetPermissionMigration.java
+++ b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v099/CreateAssetPermissionMigration.java
@@ -34,10 +34,10 @@ public class CreateAssetPermissionMigration implements Migration {
private final PermissionResourceManager permissionResourceManager;
- public CreateAssetPermissionMigration() {
+ public CreateAssetPermissionMigration(IPermissionStorage permissionStorage) {
this.assetStorage = StorageDispatcher.INSTANCE.getNoSqlStore().getAssetStorage();
- this.permissionStorage = StorageDispatcher.INSTANCE.getNoSqlStore().getPermissionStorage();
- this.permissionResourceManager = new PermissionResourceManager();
+ this.permissionStorage = permissionStorage;
+ this.permissionResourceManager = new PermissionResourceManager(permissionStorage);
}
@Override
diff --git a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v099/CreateDatasetPermissionMigration.java b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v099/CreateDatasetPermissionMigration.java
index 8368cc6be6..01e40e5cff 100644
--- a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v099/CreateDatasetPermissionMigration.java
+++ b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v099/CreateDatasetPermissionMigration.java
@@ -45,11 +45,11 @@ public class CreateDatasetPermissionMigration implements Migration {
private static final String DB_MEASUREMENT = "db_measurement";
- public CreateDatasetPermissionMigration() {
+ public CreateDatasetPermissionMigration(IPermissionStorage permissionStorage) {
this.dataLakeStorage = StorageDispatcher.INSTANCE.getNoSqlStore().getDataLakeStorage();
this.pipelineStorage = StorageDispatcher.INSTANCE.getNoSqlStore().getPipelineStorageAPI();
- this.permissionStorage = StorageDispatcher.INSTANCE.getNoSqlStore().getPermissionStorage();
- this.permissionResourceManager = new PermissionResourceManager();
+ this.permissionStorage = permissionStorage;
+ this.permissionResourceManager = new PermissionResourceManager(permissionStorage);
}
@Override
diff --git a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v099/RemoveDuplicatedAssetPermissions.java b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v099/RemoveDuplicatedAssetPermissions.java
index 1a1d0331b5..3f9acd2cf7 100644
--- a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v099/RemoveDuplicatedAssetPermissions.java
+++ b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v099/RemoveDuplicatedAssetPermissions.java
@@ -34,12 +34,15 @@ public class RemoveDuplicatedAssetPermissions implements Migration {
private static final Logger LOG = LoggerFactory.getLogger(RemoveDuplicatedAssetPermissions.class);
- private final IPermissionStorage permissionStorage =
- StorageDispatcher.INSTANCE.getNoSqlStore().getPermissionStorage();
+ private final IPermissionStorage permissionStorage;
private final IAssetStorage assetStorage =
StorageDispatcher.INSTANCE.getNoSqlStore().getAssetStorage();
+ public RemoveDuplicatedAssetPermissions(IPermissionStorage permissionStorage) {
+ this.permissionStorage = permissionStorage;
+ }
+
@Override
public boolean shouldExecute() {
return true;
diff --git a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/storage/CachedDataExplorerWidgetStorage.java b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/storage/CachedDataExplorerWidgetStorage.java
new file mode 100644
index 0000000000..c8cf431694
--- /dev/null
+++ b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/storage/CachedDataExplorerWidgetStorage.java
@@ -0,0 +1,188 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.streampipes.service.core.storage;
+
+import org.apache.streampipes.model.Tuple2;
+import org.apache.streampipes.model.datalake.DataExplorerWidgetModel;
+import org.apache.streampipes.serializers.json.JacksonSerializer;
+import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.cache.Cache;
+import org.springframework.cache.CacheManager;
+
+import java.util.List;
+import java.util.Objects;
+
+public class CachedDataExplorerWidgetStorage implements IDataExplorerWidgetStorage {
+
+ static final String CACHE_NAME = "dataExplorerWidgets";
+ static final String FIND_ALL_CACHE_NAME = "dataExplorerWidgetsAll";
+
+ private static final Logger LOG = LoggerFactory.getLogger(CachedDataExplorerWidgetStorage.class);
+ private static final String FIND_ALL_CACHE_KEY = "all";
+ private static final TypeReference<List<DataExplorerWidgetModel>> WIDGET_LIST_TYPE = new TypeReference<>() {
+ };
+
+ private final IDataExplorerWidgetStorage delegate;
+ private final Cache cache;
+ private final Cache findAllCache;
+ private final ObjectMapper objectMapper;
+
+ public CachedDataExplorerWidgetStorage(IDataExplorerWidgetStorage delegate,
+ CacheManager cacheManager) {
+ this(delegate, cacheManager, JacksonSerializer.getObjectMapper());
+ }
+
+ CachedDataExplorerWidgetStorage(IDataExplorerWidgetStorage delegate,
+ CacheManager cacheManager,
+ ObjectMapper objectMapper) {
+ this.delegate = delegate;
+ this.cache = Objects.requireNonNull(cacheManager.getCache(CACHE_NAME));
+ this.findAllCache = Objects.requireNonNull(cacheManager.getCache(FIND_ALL_CACHE_NAME));
+ this.objectMapper = objectMapper;
+ }
+
+ @Override
+ public List<DataExplorerWidgetModel> findAll() {
+ var cachedElements = getCachedElements();
+ if (cachedElements != null) {
+ return cachedElements;
+ }
+
+ var elements = delegate.findAll();
+ put(elements);
+ return elements;
+ }
+
+ @Override
+ public Tuple2<Boolean, String> persist(DataExplorerWidgetModel element) {
+ var result = delegate.persist(element);
+ if (Boolean.TRUE.equals(result.k)) {
+ evict(element.getElementId());
+ evict(result.v);
+ evictFindAll();
+ }
+ return result;
+ }
+
+ @Override
+ public DataExplorerWidgetModel getElementById(String id) {
+ var cachedElement = getCachedElement(id);
+ if (cachedElement != null) {
+ return cachedElement;
+ }
+
+ var element = delegate.getElementById(id);
+ if (element != null) {
+ put(element);
+ }
+ return element;
+ }
+
+ @Override
+ public DataExplorerWidgetModel updateElement(DataExplorerWidgetModel element) {
+ var updatedElement = delegate.updateElement(element);
+ evict(element.getElementId());
+ if (updatedElement != null) {
+ evict(updatedElement.getElementId());
+ }
+ evictFindAll();
+ return updatedElement;
+ }
+
+ @Override
+ public void deleteElement(DataExplorerWidgetModel element) {
+ delegate.deleteElement(element);
+ evict(element.getElementId());
+ evictFindAll();
+ }
+
+ @Override
+ public void deleteElementById(String id) {
+ delegate.deleteElementById(id);
+ evict(id);
+ evictFindAll();
+ }
+
+ private List<DataExplorerWidgetModel> getCachedElements() {
+ try {
+ var cachedValue = findAllCache.get(FIND_ALL_CACHE_KEY, String.class);
+ return cachedValue == null
+ ? null
+ : objectMapper.readValue(cachedValue, WIDGET_LIST_TYPE);
+ } catch (JsonProcessingException | RuntimeException e) {
+ LOG.warn("Could not read data explorer widgets from cache", e);
+ evictFindAll();
+ return null;
+ }
+ }
+
+ private DataExplorerWidgetModel getCachedElement(String id) {
+ try {
+ var cachedValue = cache.get(id, String.class);
+ return cachedValue == null
+ ? null
+ : objectMapper.readValue(cachedValue, DataExplorerWidgetModel.class);
+ } catch (JsonProcessingException | RuntimeException e) {
+ LOG.warn("Could not read data explorer widget {} from cache", id, e);
+ evict(id);
+ return null;
+ }
+ }
+
+ private void put(DataExplorerWidgetModel element) {
+ try {
+ cache.put(element.getElementId(), objectMapper.writeValueAsString(element));
+ } catch (JsonProcessingException | RuntimeException e) {
+ LOG.warn("Could not write data explorer widget {} to cache", element.getElementId(), e);
+ }
+ }
+
+ private void put(List<DataExplorerWidgetModel> elements) {
+ try {
+ findAllCache.put(FIND_ALL_CACHE_KEY, objectMapper.writeValueAsString(elements));
+ } catch (JsonProcessingException | RuntimeException e) {
+ LOG.warn("Could not write data explorer widgets to cache", e);
+ }
+ }
+
+ private void evict(String id) {
+ if (id == null) {
+ return;
+ }
+
+ try {
+ cache.evict(id);
+ } catch (RuntimeException e) {
+ LOG.warn("Could not evict data explorer widget {} from cache", id, e);
+ }
+ }
+
+ private void evictFindAll() {
+ try {
+ findAllCache.evict(FIND_ALL_CACHE_KEY);
+ } catch (RuntimeException e) {
+ LOG.warn("Could not evict data explorer widgets from cache", e);
+ }
+ }
+}
diff --git a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/storage/StorageApiConfiguration.java b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/storage/StorageApiConfiguration.java
index 8945921de1..cdfcffeada 100644
--- a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/storage/StorageApiConfiguration.java
+++ b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/storage/StorageApiConfiguration.java
@@ -20,13 +20,18 @@ package org.apache.streampipes.service.core.storage;
import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
import org.apache.streampipes.storage.api.function.IFunctionStateStorage;
+import org.apache.streampipes.storage.api.user.IPermissionStorage;
import org.apache.streampipes.storage.couchdb.impl.explorer.DataExplorerWidgetStorageImpl;
import org.apache.streampipes.storage.couchdb.impl.function.FunctionStateStorageImpl;
+import org.apache.streampipes.storage.couchdb.impl.user.PermissionStorageImpl;
+import org.springframework.cache.CacheManager;
+import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
+@EnableCaching
public class StorageApiConfiguration {
@Bean
@@ -35,7 +40,15 @@ public class StorageApiConfiguration {
}
@Bean
- public IDataExplorerWidgetStorage dataExplorerWidgetStorage() {
- return new DataExplorerWidgetStorageImpl();
+ public IDataExplorerWidgetStorage dataExplorerWidgetStorage(CacheManager cacheManager) {
+ return new CachedDataExplorerWidgetStorage(
+ new DataExplorerWidgetStorageImpl(),
+ cacheManager
+ );
+ }
+
+ @Bean
+ public IPermissionStorage permissionStorage() {
+ return new PermissionStorageImpl("users/permissions");
}
}
diff --git a/streampipes-service-core/src/main/resources/application.properties b/streampipes-service-core/src/main/resources/application.properties
index 291b1750a8..ece15145a6 100644
--- a/streampipes-service-core/src/main/resources/application.properties
+++ b/streampipes-service-core/src/main/resources/application.properties
@@ -21,6 +21,9 @@ spring.servlet.multipart.max-file-size=5120MB
spring.servlet.multipart.max-request-size=5120MB
server.tomcat.additional-tld-skip-patterns=*.jar
spring.mvc.async.request-timeout=900000
+spring.cache.type=caffeine
+spring.cache.cache-names=dataExplorerWidgets,dataExplorerWidgetsAll
+spring.cache.caffeine.spec=maximumSize=10000,expireAfterWrite=10m
logging.config=classpath:logback.xml
spring.output.ansi.enabled=always
springdoc.api-docs.path=/apidocs
diff --git a/streampipes-service-core/src/test/java/org/apache/streampipes/service/core/storage/CachedDataExplorerWidgetStorageTest.java b/streampipes-service-core/src/test/java/org/apache/streampipes/service/core/storage/CachedDataExplorerWidgetStorageTest.java
new file mode 100644
index 0000000000..076d8ff806
--- /dev/null
+++ b/streampipes-service-core/src/test/java/org/apache/streampipes/service/core/storage/CachedDataExplorerWidgetStorageTest.java
@@ -0,0 +1,150 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.streampipes.service.core.storage;
+
+import org.apache.streampipes.model.Tuple2;
+import org.apache.streampipes.model.datalake.DataExplorerWidgetModel;
+import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.cache.concurrent.ConcurrentMapCacheManager;
+
+import java.util.HashMap;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotSame;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+class CachedDataExplorerWidgetStorageTest {
+
+ private static final String WIDGET_ID = "widget-id";
+
+ private IDataExplorerWidgetStorage delegate;
+ private CachedDataExplorerWidgetStorage storage;
+
+ @BeforeEach
+ void setUp() {
+ delegate = mock(IDataExplorerWidgetStorage.class);
+ var cacheManager = new ConcurrentMapCacheManager(
+ CachedDataExplorerWidgetStorage.CACHE_NAME,
+ CachedDataExplorerWidgetStorage.FIND_ALL_CACHE_NAME
+ );
+ storage = new CachedDataExplorerWidgetStorage(delegate, cacheManager);
+ }
+
+ @Test
+ void findAllCachesSerializedCopies() {
+ var widget = makeWidget("Initial title");
+ when(delegate.findAll()).thenReturn(List.of(widget));
+
+ var firstResult = storage.findAll();
+ firstResult.get(0).getBaseAppearanceConfig().put("widgetTitle", "Changed title");
+ var secondResult = storage.findAll();
+
+ assertNotSame(firstResult, secondResult);
+ assertNotSame(firstResult.get(0), secondResult.get(0));
+ assertEquals("Initial title", secondResult.get(0).getBaseAppearanceConfig().get("widgetTitle"));
+ verify(delegate, times(1)).findAll();
+ }
+
+ @Test
+ void getElementByIdCachesSerializedCopy() {
+ var widget = makeWidget("Initial title");
+ when(delegate.getElementById(WIDGET_ID)).thenReturn(widget);
+
+ var firstResult = storage.getElementById(WIDGET_ID);
+ firstResult.getBaseAppearanceConfig().put("widgetTitle", "Changed title");
+ var secondResult = storage.getElementById(WIDGET_ID);
+
+ assertNotSame(firstResult, secondResult);
+ assertEquals("Initial title", secondResult.getBaseAppearanceConfig().get("widgetTitle"));
+ verify(delegate, times(1)).getElementById(WIDGET_ID);
+ }
+
+ @Test
+ void updateElementEvictsCachedElement() {
+ var widget = makeWidget("Initial title");
+ var updatedWidget = makeWidget("Updated title");
+ when(delegate.getElementById(WIDGET_ID)).thenReturn(widget, updatedWidget);
+ when(delegate.updateElement(updatedWidget)).thenReturn(updatedWidget);
+
+ storage.getElementById(WIDGET_ID);
+ storage.updateElement(updatedWidget);
+ var result = storage.getElementById(WIDGET_ID);
+
+ assertEquals("Updated title", result.getBaseAppearanceConfig().get("widgetTitle"));
+ verify(delegate, times(2)).getElementById(WIDGET_ID);
+ }
+
+ @Test
+ void updateElementEvictsFindAllCache() {
+ var widget = makeWidget("Initial title");
+ var updatedWidget = makeWidget("Updated title");
+ when(delegate.findAll()).thenReturn(List.of(widget), List.of(updatedWidget));
+ when(delegate.updateElement(updatedWidget)).thenReturn(updatedWidget);
+
+ storage.findAll();
+ storage.updateElement(updatedWidget);
+ var result = storage.findAll();
+
+ assertEquals("Updated title", result.get(0).getBaseAppearanceConfig().get("widgetTitle"));
+ verify(delegate, times(2)).findAll();
+ }
+
+ @Test
+ void deleteElementByIdEvictsCachedElement() {
+ var widget = makeWidget("Initial title");
+ when(delegate.getElementById(WIDGET_ID)).thenReturn(widget);
+
+ storage.getElementById(WIDGET_ID);
+ storage.deleteElementById(WIDGET_ID);
+ storage.getElementById(WIDGET_ID);
+
+ verify(delegate).deleteElementById(WIDGET_ID);
+ verify(delegate, times(2)).getElementById(WIDGET_ID);
+ }
+
+ @Test
+ void successfulPersistEvictsExistingElement() {
+ var widget = makeWidget("Initial title");
+ var persistedWidget = makeWidget("Persisted title");
+ when(delegate.getElementById(WIDGET_ID)).thenReturn(widget, persistedWidget);
+ when(delegate.persist(persistedWidget)).thenReturn(new Tuple2<>(true, WIDGET_ID));
+
+ storage.getElementById(WIDGET_ID);
+ storage.persist(persistedWidget);
+ var result = storage.getElementById(WIDGET_ID);
+
+ assertEquals("Persisted title", result.getBaseAppearanceConfig().get("widgetTitle"));
+ verify(delegate, times(2)).getElementById(WIDGET_ID);
+ }
+
+ private DataExplorerWidgetModel makeWidget(String title) {
+ var widget = new DataExplorerWidgetModel();
+ widget.setElementId(WIDGET_ID);
+ var baseAppearanceConfig = new HashMap<String, Object>();
+ baseAppearanceConfig.put("widgetTitle", title);
+ widget.setBaseAppearanceConfig(baseAppearanceConfig);
+ return widget;
+ }
+}
diff --git a/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/CouchDbStorageManager.java b/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/CouchDbStorageManager.java
index 6b964775b4..577b82b51f 100644
--- a/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/CouchDbStorageManager.java
+++ b/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/CouchDbStorageManager.java
@@ -21,7 +21,6 @@ import org.apache.streampipes.model.datalake.DataLakeMeasure;
import org.apache.streampipes.storage.api.connect.IAdapterStorage;
import org.apache.streampipes.storage.api.core.INoSqlStorage;
import org.apache.streampipes.storage.api.explorer.IDataExplorerDashboardStorage;
-import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
import org.apache.streampipes.storage.api.explorer.IDataLakeMeasureStorage;
import org.apache.streampipes.storage.api.pipeline.ICompactPipelineTemplateStorage;
import org.apache.streampipes.storage.api.pipeline.IDataProcessorStorage;
@@ -51,7 +50,6 @@ import org.apache.streampipes.storage.api.user.IUserStorage;
import org.apache.streampipes.storage.couchdb.impl.connect.AdapterDescriptionStorageImpl;
import org.apache.streampipes.storage.couchdb.impl.connect.AdapterInstanceStorageImpl;
import org.apache.streampipes.storage.couchdb.impl.explorer.DataExplorerDashboardStorageImpl;
-import org.apache.streampipes.storage.couchdb.impl.explorer.DataExplorerWidgetStorageImpl;
import org.apache.streampipes.storage.couchdb.impl.explorer.DataLakeMeasureStorage;
import org.apache.streampipes.storage.couchdb.impl.pipeline.CompactPipelineTemplateStorageImpl;
import org.apache.streampipes.storage.couchdb.impl.pipeline.DataProcessorStorageImpl;