This is an automated email from the ASF dual-hosted git repository.

riemer pushed a commit to branch add-directory-configuration-to-ui
in repository https://gitbox.apache.org/repos/asf/streampipes.git

commit a73395a00e4694524f7e3f1ee5938988d791342c
Author: Dominik Riemer <[email protected]>
AuthorDate: Thu Jan 9 17:15:50 2025 +0100

    feat: Asset and file directories can be modified from the UI
---
 .../model/configuration/DefaultGeneralConfig.java  | 35 +++++++++++++
 .../configuration/DefaultSpCoreConfiguration.java  | 28 -----------
 .../model/configuration/GeneralConfig.java         | 19 +++++++
 .../model/configuration/SpCoreConfiguration.java   | 38 +++++++-------
 .../streampipes/manager/assets/AssetConstants.java |  1 +
 .../streampipes/manager/file/FileConstants.java    |  1 +
 .../core/migrations/AvailableMigrations.java       |  4 +-
 .../v970/MoveDirectoryConfigurationMigration.java  | 58 ++++++++++++++++++++++
 .../src/lib/model/config/general-config.model.ts   |  2 +
 .../general-configuration.component.html           | 28 +++++++++++
 .../general-configuration.component.ts             | 18 +++++++
 11 files changed, 184 insertions(+), 48 deletions(-)

diff --git 
a/streampipes-model/src/main/java/org/apache/streampipes/model/configuration/DefaultGeneralConfig.java
 
b/streampipes-model/src/main/java/org/apache/streampipes/model/configuration/DefaultGeneralConfig.java
index c0b97cfd22..30f20971f9 100644
--- 
a/streampipes-model/src/main/java/org/apache/streampipes/model/configuration/DefaultGeneralConfig.java
+++ 
b/streampipes-model/src/main/java/org/apache/streampipes/model/configuration/DefaultGeneralConfig.java
@@ -18,11 +18,46 @@
 
 package org.apache.streampipes.model.configuration;
 
+import org.apache.streampipes.commons.environment.Environment;
+import org.apache.streampipes.commons.environment.Environments;
+
+import java.io.File;
+
 public class DefaultGeneralConfig {
 
   public GeneralConfig make() {
     var generalConfig = new GeneralConfig();
     generalConfig.setLinkSettings(new DefaultLinkSettings().make());
+    generalConfig.setAssetDir(makeAssetLocation());
+    generalConfig.setFilesDir(makeFileLocation());
     return generalConfig;
   }
+
+  public String makeAssetLocation() {
+    return makeStreamPipesHomeLocation()
+        + "assets";
+  }
+
+  public String makeFileLocation() {
+    return makeStreamPipesHomeLocation()
+        + "files";
+  }
+
+  private String makeStreamPipesHomeLocation() {
+    var userDefinedAssetDir = getEnvironment().getCoreAssetBaseDir();
+    var assetDirAppendix = getSpAssetDirAppendix();
+    if (userDefinedAssetDir.exists()) {
+      return userDefinedAssetDir.getValue() + assetDirAppendix;
+    } else {
+      return System.getProperty("user.home") + assetDirAppendix;
+    }
+  }
+
+  private String getSpAssetDirAppendix() {
+    return File.separator + ".streampipes" + File.separator;
+  }
+
+  private Environment getEnvironment() {
+    return Environments.getEnvironment();
+  }
 }
diff --git 
a/streampipes-model/src/main/java/org/apache/streampipes/model/configuration/DefaultSpCoreConfiguration.java
 
b/streampipes-model/src/main/java/org/apache/streampipes/model/configuration/DefaultSpCoreConfiguration.java
index b669b3e4b7..85b52d1cdb 100644
--- 
a/streampipes-model/src/main/java/org/apache/streampipes/model/configuration/DefaultSpCoreConfiguration.java
+++ 
b/streampipes-model/src/main/java/org/apache/streampipes/model/configuration/DefaultSpCoreConfiguration.java
@@ -22,8 +22,6 @@ import org.apache.streampipes.commons.environment.Environment;
 import org.apache.streampipes.commons.environment.Environments;
 import org.apache.streampipes.commons.random.TokenGenerator;
 
-import java.io.File;
-
 public class DefaultSpCoreConfiguration {
 
   public SpCoreConfiguration make() {
@@ -33,33 +31,11 @@ public class DefaultSpCoreConfiguration {
     coreCfg.setMessagingSettings(new DefaultMessagingSettings().make());
     coreCfg.setEmailConfig(EmailConfig.fromDefaults());
     coreCfg.setEmailTemplateConfig(new 
DefaultEmailTemplateConfiguration().getDefaultTemplates());
-    coreCfg.setFilesDir(makeFileLocation());
-    coreCfg.setAssetDir(makeAssetLocation());
     coreCfg.setLocalAuthConfig(LocalAuthConfig.fromDefaults(getJwtSecret()));
 
     return coreCfg;
   }
 
-  private String makeAssetLocation() {
-    return makeStreamPipesHomeLocation()
-        + "assets";
-  }
-
-  private String makeFileLocation() {
-    return makeStreamPipesHomeLocation()
-        + "files";
-  }
-
-  private String makeStreamPipesHomeLocation() {
-    var userDefinedAssetDir = getEnvironment().getCoreAssetBaseDir();
-    var assetDirAppendix = getSpAssetDirAppendix();
-    if (userDefinedAssetDir.exists()) {
-      return userDefinedAssetDir.getValue() + assetDirAppendix;
-    } else {
-      return System.getProperty("user.home") + assetDirAppendix;
-    }
-  }
-
   private String getJwtSecret() {
     var env = getEnvironment();
     return env.getJwtSecret().getValueOrResolve(this::makeDefaultJwtSecret);
@@ -73,8 +49,4 @@ public class DefaultSpCoreConfiguration {
     return Environments.getEnvironment();
   }
 
-  private String getSpAssetDirAppendix() {
-    return File.separator + ".streampipes" + File.separator;
-  }
-
 }
diff --git 
a/streampipes-model/src/main/java/org/apache/streampipes/model/configuration/GeneralConfig.java
 
b/streampipes-model/src/main/java/org/apache/streampipes/model/configuration/GeneralConfig.java
index 188590a196..f2381e57c0 100644
--- 
a/streampipes-model/src/main/java/org/apache/streampipes/model/configuration/GeneralConfig.java
+++ 
b/streampipes-model/src/main/java/org/apache/streampipes/model/configuration/GeneralConfig.java
@@ -33,6 +33,9 @@ public class GeneralConfig {
   private List<String> defaultUserRoles;
   private LinkSettings linkSettings;
 
+  private String assetDir;
+  private String filesDir;
+
   public GeneralConfig() {
   }
 
@@ -113,4 +116,20 @@ public class GeneralConfig {
   public void setLinkSettings(LinkSettings linkSettings) {
     this.linkSettings = linkSettings;
   }
+
+  public String getAssetDir() {
+    return assetDir;
+  }
+
+  public void setAssetDir(String assetDir) {
+    this.assetDir = assetDir;
+  }
+
+  public String getFilesDir() {
+    return filesDir;
+  }
+
+  public void setFilesDir(String filesDir) {
+    this.filesDir = filesDir;
+  }
 }
diff --git 
a/streampipes-model/src/main/java/org/apache/streampipes/model/configuration/SpCoreConfiguration.java
 
b/streampipes-model/src/main/java/org/apache/streampipes/model/configuration/SpCoreConfiguration.java
index b5766bd3f6..eaf25b3650 100644
--- 
a/streampipes-model/src/main/java/org/apache/streampipes/model/configuration/SpCoreConfiguration.java
+++ 
b/streampipes-model/src/main/java/org/apache/streampipes/model/configuration/SpCoreConfiguration.java
@@ -34,12 +34,12 @@ public class SpCoreConfiguration {
   private GeneralConfig generalConfig;
   private LocationConfig locationConfig;
 
-  private boolean isConfigured;
-  private SpCoreConfigurationStatus serviceStatus;
-
   private String assetDir;
   private String filesDir;
 
+  private boolean isConfigured;
+  private SpCoreConfigurationStatus serviceStatus;
+
   public SpCoreConfiguration() {
     this.locationConfig = new LocationConfig(false, "", "");
   }
@@ -100,22 +100,6 @@ public class SpCoreConfiguration {
     isConfigured = configured;
   }
 
-  public String getAssetDir() {
-    return assetDir;
-  }
-
-  public void setAssetDir(String assetDir) {
-    this.assetDir = assetDir;
-  }
-
-  public String getFilesDir() {
-    return filesDir;
-  }
-
-  public void setFilesDir(String filesDir) {
-    this.filesDir = filesDir;
-  }
-
   public EmailTemplateConfig getEmailTemplateConfig() {
     return this.emailTemplateConfig;
   }
@@ -139,4 +123,20 @@ public class SpCoreConfiguration {
   public void setLocationConfig(LocationConfig locationConfig) {
     this.locationConfig = locationConfig;
   }
+
+  public String getAssetDir() {
+    return assetDir;
+  }
+
+  public void setAssetDir(String assetDir) {
+    this.assetDir = assetDir;
+  }
+
+  public String getFilesDir() {
+    return filesDir;
+  }
+
+  public void setFilesDir(String filesDir) {
+    this.filesDir = filesDir;
+  }
 }
diff --git 
a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/assets/AssetConstants.java
 
b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/assets/AssetConstants.java
index 67ad1e1986..f9a8f2db63 100644
--- 
a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/assets/AssetConstants.java
+++ 
b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/assets/AssetConstants.java
@@ -26,6 +26,7 @@ public class AssetConstants {
       .getNoSqlStore()
       .getSpCoreConfigurationStorage()
       .get()
+      .getGeneralConfig()
       .getAssetDir();
 
 }
diff --git 
a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/file/FileConstants.java
 
b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/file/FileConstants.java
index 372ddda1d1..834ffb1dca 100644
--- 
a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/file/FileConstants.java
+++ 
b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/file/FileConstants.java
@@ -25,6 +25,7 @@ public class FileConstants {
       .getNoSqlStore()
       .getSpCoreConfigurationStorage()
       .get()
+      .getGeneralConfig()
       .getFilesDir();
 
 }
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 ed731d7ce8..514b955aee 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
@@ -31,6 +31,7 @@ import 
org.apache.streampipes.service.core.migrations.v970.AddLinkSettingsMigrat
 import 
org.apache.streampipes.service.core.migrations.v970.AddRolesToUserDbMigration;
 import 
org.apache.streampipes.service.core.migrations.v970.DataExplorerDataViewMigration;
 import 
org.apache.streampipes.service.core.migrations.v970.ModifyAssetLinkTypeMigration;
+import 
org.apache.streampipes.service.core.migrations.v970.MoveDirectoryConfigurationMigration;
 import 
org.apache.streampipes.service.core.migrations.v970.RemoveNodesFromOpcUaAdaptersMigration;
 
 import java.util.Arrays;
@@ -52,7 +53,8 @@ public class AvailableMigrations {
         new ModifyAssetLinkTypeMigration(),
         new RemoveNodesFromOpcUaAdaptersMigration(),
         new AddRolesToUserDbMigration(),
-        new AddDataLakePipelineTemplateMigration()
+        new AddDataLakePipelineTemplateMigration(),
+        new MoveDirectoryConfigurationMigration()
     );
   }
 }
diff --git 
a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v970/MoveDirectoryConfigurationMigration.java
 
b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v970/MoveDirectoryConfigurationMigration.java
new file mode 100644
index 0000000000..6d9c4cbd7d
--- /dev/null
+++ 
b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v970/MoveDirectoryConfigurationMigration.java
@@ -0,0 +1,58 @@
+/*
+ * 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.migrations.v970;
+
+import org.apache.streampipes.model.configuration.DefaultGeneralConfig;
+import org.apache.streampipes.service.core.migrations.Migration;
+import org.apache.streampipes.storage.api.ISpCoreConfigurationStorage;
+import org.apache.streampipes.storage.management.StorageDispatcher;
+
+import java.io.IOException;
+
+public class MoveDirectoryConfigurationMigration implements Migration {
+
+  private final ISpCoreConfigurationStorage storage;
+
+  public MoveDirectoryConfigurationMigration() {
+    this.storage = 
StorageDispatcher.INSTANCE.getNoSqlStore().getSpCoreConfigurationStorage();
+  }
+
+  @Override
+  public boolean shouldExecute() {
+    var config = storage.get();
+    return config != null && config.getGeneralConfig().getAssetDir() == null;
+  }
+
+  @Override
+  public void executeMigration() throws IOException {
+    var config = storage.get();
+    config.getGeneralConfig().setFilesDir(new 
DefaultGeneralConfig().makeFileLocation());
+    config.getGeneralConfig().setAssetDir(new 
DefaultGeneralConfig().makeAssetLocation());
+
+    config.setAssetDir(null);
+    config.setFilesDir(null);
+
+    storage.updateElement(config);
+  }
+
+  @Override
+  public String getDescription() {
+    return "Moving asset directory to general config";
+  }
+}
diff --git 
a/ui/projects/streampipes/platform-services/src/lib/model/config/general-config.model.ts
 
b/ui/projects/streampipes/platform-services/src/lib/model/config/general-config.model.ts
index fbc6db7798..9d65e3383d 100644
--- 
a/ui/projects/streampipes/platform-services/src/lib/model/config/general-config.model.ts
+++ 
b/ui/projects/streampipes/platform-services/src/lib/model/config/general-config.model.ts
@@ -28,4 +28,6 @@ export interface GeneralConfigModel {
     defaultUserRoles: string[];
     appName: string;
     linkSettings: LinkSettings;
+    assetDir: string;
+    filesDir: string;
 }
diff --git 
a/ui/src/app/configuration/general-configuration/general-configuration.component.html
 
b/ui/src/app/configuration/general-configuration/general-configuration.component.html
index 945171769a..165bcc6560 100644
--- 
a/ui/src/app/configuration/general-configuration/general-configuration.component.html
+++ 
b/ui/src/app/configuration/general-configuration/general-configuration.component.html
@@ -82,6 +82,34 @@
                             </mat-form-field>
                         </div>
                     </div>
+                    <div class="subsection-title">Asset Directory</div>
+                    <div class="warning mb-10">
+                        Modification of the asset directory will be only 
applied
+                        after restarting the core service.
+                    </div>
+                    <mat-form-field color="accent">
+                        <input
+                            formControlName="assetDir"
+                            fxFlex
+                            matInput
+                            required
+                            data-cy="general-config-asset-dir"
+                        />
+                    </mat-form-field>
+                    <div class="subsection-title">File Directory</div>
+                    <div class="warning mb-10">
+                        Modification of the file directory will be only applied
+                        after restarting the core service.
+                    </div>
+                    <mat-form-field color="accent">
+                        <input
+                            formControlName="filesDir"
+                            fxFlex
+                            matInput
+                            required
+                            data-cy="general-config-files-dir"
+                        />
+                    </mat-form-field>
                 </sp-split-section>
                 <sp-split-section
                     title="Registration"
diff --git 
a/ui/src/app/configuration/general-configuration/general-configuration.component.ts
 
b/ui/src/app/configuration/general-configuration/general-configuration.component.ts
index 320f9d659e..47259988a1 100644
--- 
a/ui/src/app/configuration/general-configuration/general-configuration.component.ts
+++ 
b/ui/src/app/configuration/general-configuration/general-configuration.component.ts
@@ -96,6 +96,8 @@ export class GeneralConfigurationComponent implements OnInit {
                     defaultUserRoles: [UserRole.ROLE_PIPELINE_USER],
                     appName: this.appConstants.APP_NAME,
                     linkSettings: configs[0].linkSettings,
+                    filesDir: configs[0].filesDir,
+                    assetDir: configs[0].assetDir,
                 };
             }
             this.mailConfig = configs[1];
@@ -128,6 +130,20 @@ export class GeneralConfigurationComponent implements 
OnInit {
                     Validators.required,
                 ),
             );
+            this.parentForm.addControl(
+                'assetDir',
+                new UntypedFormControl(
+                    this.generalConfig.assetDir,
+                    Validators.required,
+                ),
+            );
+            this.parentForm.addControl(
+                'filesDir',
+                new UntypedFormControl(
+                    this.generalConfig.filesDir,
+                    Validators.required,
+                ),
+            );
             this.parentForm.addControl(
                 'allowSelfRegistration',
                 new UntypedFormControl(
@@ -190,6 +206,8 @@ export class GeneralConfigurationComponent implements 
OnInit {
                 this.generalConfig.protocol = v.protocol;
                 this.generalConfig.port = v.port;
                 this.generalConfig.hostname = v.hostname;
+                this.generalConfig.assetDir = v.assetDir;
+                this.generalConfig.filesDir = v.filesDir;
                 this.generalConfig.allowPasswordRecovery =
                     v.allowPasswordRecovery;
                 this.generalConfig.allowSelfRegistration =

Reply via email to