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

riemer pushed a commit to branch support-dynamic-assets-maven-plugin
in repository https://gitbox.apache.org/repos/asf/streampipes.git

commit c6b475bba956ada4c7ef27a0a4815ebeacb61ec0
Author: Dominik Riemer <[email protected]>
AuthorDate: Wed Oct 9 22:27:09 2024 +0200

    fix: Support dynamic assets in Maven plugin to generate docs
---
 .../extensions/api/assets/AssetResolver.java       | 14 ++++++++--
 .../api/assets/DefaultAssetResolver.java           | 17 ++++++------
 .../generic/assets/PlcAdapterAssetResolver.java    | 12 ++++----
 .../streampipes-extensions-all-jvm/pom.xml         | 20 ++++++++++++++
 .../smp/extractor/ExtensionsFinder.java            | 32 ++++++++++++----------
 .../smp/extractor/LocalesExtractor.java            | 10 ++++++-
 .../smp/generator/ResourceGenerator.java           | 11 ++++++--
 .../apache/streampipes/smp/model/AssetModel.java   | 12 ++++++++
 8 files changed, 96 insertions(+), 32 deletions(-)

diff --git 
a/streampipes-extensions-api/src/main/java/org/apache/streampipes/extensions/api/assets/AssetResolver.java
 
b/streampipes-extensions-api/src/main/java/org/apache/streampipes/extensions/api/assets/AssetResolver.java
index 16006e631b..c032168647 100644
--- 
a/streampipes-extensions-api/src/main/java/org/apache/streampipes/extensions/api/assets/AssetResolver.java
+++ 
b/streampipes-extensions-api/src/main/java/org/apache/streampipes/extensions/api/assets/AssetResolver.java
@@ -23,8 +23,18 @@ import java.util.Properties;
 
 public interface AssetResolver {
 
-  byte[] getAsset(String assetName) throws IOException;
+  default byte[] getAsset(String assetName) throws IOException {
+    return getAsset(this.getClass().getClassLoader(), assetName);
+  }
 
-  Properties getLocale(String localeName) throws IOException;
+  default Properties getLocale(String localeName) throws IOException {
+    return getLocale(this.getClass().getClassLoader(), localeName);
+  }
+
+  byte[] getAsset(ClassLoader classLoader,
+                  String assetName) throws IOException;
+
+  Properties getLocale(ClassLoader classLoader,
+                       String localeName) throws IOException;
 
 }
diff --git 
a/streampipes-extensions-api/src/main/java/org/apache/streampipes/extensions/api/assets/DefaultAssetResolver.java
 
b/streampipes-extensions-api/src/main/java/org/apache/streampipes/extensions/api/assets/DefaultAssetResolver.java
index 61b3f067d3..8449a9451b 100644
--- 
a/streampipes-extensions-api/src/main/java/org/apache/streampipes/extensions/api/assets/DefaultAssetResolver.java
+++ 
b/streampipes-extensions-api/src/main/java/org/apache/streampipes/extensions/api/assets/DefaultAssetResolver.java
@@ -34,23 +34,24 @@ public class DefaultAssetResolver implements AssetResolver {
   }
 
   @Override
-  public byte[] getAsset(String assetName) throws IOException {
-    return getResourceFile(assetName).readAllBytes();
+  public byte[] getAsset(ClassLoader classLoader,
+                         String assetName) throws IOException {
+    return getResourceFile(classLoader, assetName).readAllBytes();
   }
 
   @Override
-  public Properties getLocale(String localeName) throws IOException {
+  public Properties getLocale(ClassLoader classLoader,
+                              String localeName) throws IOException {
     Properties props = new Properties();
-    props.load(new InputStreamReader(getResourceFile(localeName), 
StandardCharsets.UTF_8));
+    props.load(new InputStreamReader(getResourceFile(classLoader, localeName), 
StandardCharsets.UTF_8));
     return props;
   }
 
-  protected InputStream getResourceFile(String filename) throws IOException {
+  protected InputStream getResourceFile(ClassLoader classLoader,
+                                        String filename) throws IOException {
     if (existsFile(filename)) {
       var path = makePath(filename);
-      return this.getClass()
-          .getClassLoader()
-          .getResourceAsStream(path);
+      return classLoader.getResourceAsStream(path);
     } else {
       throw new IOException(String.format("Could not read file %s", filename));
     }
diff --git 
a/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/generic/assets/PlcAdapterAssetResolver.java
 
b/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/generic/assets/PlcAdapterAssetResolver.java
index f104007906..a8b02834f2 100644
--- 
a/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/generic/assets/PlcAdapterAssetResolver.java
+++ 
b/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/generic/assets/PlcAdapterAssetResolver.java
@@ -40,8 +40,9 @@ public class PlcAdapterAssetResolver extends 
DefaultAssetResolver {
   }
 
   @Override
-  public Properties getLocale(String localeName) throws IOException {
-    var properties = super.getLocale(localeName);
+  public Properties getLocale(ClassLoader classLoader,
+                              String localeName) throws IOException {
+    var properties = super.getLocale(classLoader, localeName);
     properties.put(appId + ".title", driver.getProtocolName());
     properties.put(appId + ".description", "");
 
@@ -49,12 +50,13 @@ public class PlcAdapterAssetResolver extends 
DefaultAssetResolver {
   }
 
   @Override
-  public byte[] getAsset(String assetName) throws IOException {
+  public byte[] getAsset(ClassLoader classLoader,
+                         String assetName) throws IOException {
     if (assetName.equals(GlobalStreamPipesConstants.STD_DOCUMENTATION_NAME)) {
-      var docsTemplate = new String(getResourceFile(assetName).readAllBytes());
+      var docsTemplate = new String(getResourceFile(classLoader, 
assetName).readAllBytes());
       return new DocumentationGenerator(driver, 
docsTemplate).generateDocumentation();
     } else {
-      return super.getAsset(assetName);
+      return super.getAsset(classLoader, assetName);
     }
   }
 }
diff --git a/streampipes-extensions/streampipes-extensions-all-jvm/pom.xml 
b/streampipes-extensions/streampipes-extensions-all-jvm/pom.xml
index c3867b86c1..88cede6913 100644
--- a/streampipes-extensions/streampipes-extensions-all-jvm/pom.xml
+++ b/streampipes-extensions/streampipes-extensions-all-jvm/pom.xml
@@ -270,6 +270,26 @@
                         <artifactId>rocketmq-client-java</artifactId>
                         <version>5.0.2</version>
                     </dependency>
+                    <dependency>
+                        <groupId>org.apache.plc4x</groupId>
+                        <artifactId>plc4j-driver-all</artifactId>
+                        <version>0.12.0</version>
+                        <type>pom</type>
+                        <exclusions>
+                            <exclusion>
+                                <groupId>org.apache.plc4x</groupId>
+                                <artifactId>plc4j-driver-firmata</artifactId>
+                            </exclusion>
+                            <exclusion>
+                                <groupId>org.apache.plc4x</groupId>
+                                <artifactId>plc4j-driver-opcua</artifactId>
+                            </exclusion>
+                            <exclusion>
+                                <groupId>org.apache.plc4x</groupId>
+                                <artifactId>plc4j-driver-c-bus</artifactId>
+                            </exclusion>
+                        </exclusions>
+                    </dependency>
                 </dependencies>
                 <configuration>
                     
<initClass>org.apache.streampipes.extensions.all.jvm.AllExtensionsInit</initClass>
diff --git 
a/streampipes-maven-plugin/src/main/java/org/apache/streampipes/smp/extractor/ExtensionsFinder.java
 
b/streampipes-maven-plugin/src/main/java/org/apache/streampipes/smp/extractor/ExtensionsFinder.java
index c1ac981bb4..1fa3c01a42 100644
--- 
a/streampipes-maven-plugin/src/main/java/org/apache/streampipes/smp/extractor/ExtensionsFinder.java
+++ 
b/streampipes-maven-plugin/src/main/java/org/apache/streampipes/smp/extractor/ExtensionsFinder.java
@@ -49,7 +49,7 @@ public class ExtensionsFinder {
 
   public List<AssetModel> findExtensions()
       throws MalformedURLException, DependencyResolutionRequiredException, 
ClassNotFoundException,
-             InstantiationException, IllegalAccessException {
+      InstantiationException, IllegalAccessException {
     var extensions = new ArrayList<AssetModel>();
     var serviceDef = (
         (StreamPipesExtensionsServiceBase) loader
@@ -70,22 +70,26 @@ public class ExtensionsFinder {
       PeType peType
   ) {
     return serviceDef.getDeclarers()
-                     .stream()
-                     .map(IStreamPipesPipelineElement::declareConfig)
-                     .filter(configType::isInstance)
-                     .map(config -> new AssetModel(config.getDescription()
-                                                         .getAppId(), peType))
-                     .toList();
+        .stream()
+        .map(IStreamPipesPipelineElement::declareConfig)
+        .filter(configType::isInstance)
+        .map(config -> new AssetModel(config.getDescription()
+            .getAppId(), peType))
+        .toList();
   }
 
   private Collection<? extends AssetModel> findAdapters(SpServiceDefinition 
serviceDef) {
     return serviceDef.getAdapters()
-                     .stream()
-                     .map(adapter -> {
-                       var config = adapter.declareConfig();
-                       return new AssetModel(config.getAdapterDescription()
-                                                   .getAppId(), 
PeType.ADAPTER);
-                     })
-                     .toList();
+        .stream()
+        .map(adapter -> {
+          var config = adapter.declareConfig();
+          var resolver = config.getAssetResolver();
+          return new AssetModel(
+              config.getAdapterDescription().getAppId(),
+              PeType.ADAPTER,
+              resolver
+          );
+        })
+        .toList();
   }
 }
diff --git 
a/streampipes-maven-plugin/src/main/java/org/apache/streampipes/smp/extractor/LocalesExtractor.java
 
b/streampipes-maven-plugin/src/main/java/org/apache/streampipes/smp/extractor/LocalesExtractor.java
index 7688c2e64f..49e58707ce 100644
--- 
a/streampipes-maven-plugin/src/main/java/org/apache/streampipes/smp/extractor/LocalesExtractor.java
+++ 
b/streampipes-maven-plugin/src/main/java/org/apache/streampipes/smp/extractor/LocalesExtractor.java
@@ -18,6 +18,7 @@
 
 package org.apache.streampipes.smp.extractor;
 
+import org.apache.streampipes.extensions.api.assets.DefaultAssetResolver;
 import org.apache.streampipes.smp.model.AssetModel;
 
 import org.apache.maven.plugin.logging.Log;
@@ -45,7 +46,14 @@ public class LocalesExtractor {
   public void applyLocales(AssetModel assetModel) {
     var localeFile = loader.getResourceAsStream(assetModel.getAppId() + "/" + 
LOCALES_FILE_EN);
     try {
-      var props = loadProperties(localeFile);
+      Properties props;
+      if (assetModel.getAssetResolver() != null
+          && !(assetModel.getAssetResolver().getClass() == 
DefaultAssetResolver.class)) {
+        props = assetModel.getAssetResolver().getLocale(loader, 
LOCALES_FILE_EN);
+      } else {
+        props = loadProperties(localeFile);
+      }
+
       assetModel.setPipelineElementName(extractKey(props, assetModel, TITLE));
       assetModel.setPipelineElementDescription(extractKey(props, assetModel, 
DESCRIPTION));
     } catch (IOException e) {
diff --git 
a/streampipes-maven-plugin/src/main/java/org/apache/streampipes/smp/generator/ResourceGenerator.java
 
b/streampipes-maven-plugin/src/main/java/org/apache/streampipes/smp/generator/ResourceGenerator.java
index 9816ed785d..d21984773e 100644
--- 
a/streampipes-maven-plugin/src/main/java/org/apache/streampipes/smp/generator/ResourceGenerator.java
+++ 
b/streampipes-maven-plugin/src/main/java/org/apache/streampipes/smp/generator/ResourceGenerator.java
@@ -18,8 +18,10 @@
 
 package org.apache.streampipes.smp.generator;
 
+import org.apache.streampipes.extensions.api.assets.DefaultAssetResolver;
 import org.apache.streampipes.smp.model.AssetModel;
 
+import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.file.Path;
@@ -38,8 +40,13 @@ public abstract class ResourceGenerator {
     this.targetPath = targetPath;
   }
 
-  protected InputStream getResourceInputStream(String resourceName) {
-    return loader.getResourceAsStream(extensionsElement.getAppId() + "/" + 
resourceName);
+  protected InputStream getResourceInputStream(String resourceName) throws 
IOException {
+    if (extensionsElement.getAssetResolver() != null
+        && !(extensionsElement.getAssetResolver().getClass() == 
DefaultAssetResolver.class)) {
+      return new 
ByteArrayInputStream(extensionsElement.getAssetResolver().getAsset(loader, 
resourceName));
+    } else {
+      return loader.getResourceAsStream(extensionsElement.getAppId() + "/" + 
resourceName);
+    }
   }
 
   public abstract void generate() throws IOException;
diff --git 
a/streampipes-maven-plugin/src/main/java/org/apache/streampipes/smp/model/AssetModel.java
 
b/streampipes-maven-plugin/src/main/java/org/apache/streampipes/smp/model/AssetModel.java
index ecb77de77b..96dfef8282 100644
--- 
a/streampipes-maven-plugin/src/main/java/org/apache/streampipes/smp/model/AssetModel.java
+++ 
b/streampipes-maven-plugin/src/main/java/org/apache/streampipes/smp/model/AssetModel.java
@@ -18,6 +18,7 @@
 
 package org.apache.streampipes.smp.model;
 
+import org.apache.streampipes.extensions.api.assets.AssetResolver;
 import org.apache.streampipes.smp.constants.PeType;
 
 public class AssetModel implements Comparable<AssetModel> {
@@ -26,11 +27,18 @@ public class AssetModel implements Comparable<AssetModel> {
   private String pipelineElementName;
   private String pipelineElementDescription;
   private PeType peType = PeType.PROCESSOR;
+  private AssetResolver assetResolver;
 
   public AssetModel() {
 
   }
 
+  public AssetModel(String appId, PeType peType, AssetResolver resolver) {
+    this.appId = appId;
+    this.peType = peType;
+    this.assetResolver = resolver;
+  }
+
   public AssetModel(String appId, PeType peType) {
     this.appId = appId;
     this.peType = peType;
@@ -63,6 +71,10 @@ public class AssetModel implements Comparable<AssetModel> {
     this.pipelineElementDescription = pipelineElementDescription;
   }
 
+  public AssetResolver getAssetResolver() {
+    return assetResolver;
+  }
+
   public PeType getPeType() {
     return peType;
   }

Reply via email to