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 2022/08/17 07:38:22 UTC

[incubator-streampipes] branch STREAMPIPES-577 updated: [STREAMPIPES-577] More adapters support preview, improve preview appearance

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

riemer pushed a commit to branch STREAMPIPES-577
in repository https://gitbox.apache.org/repos/asf/incubator-streampipes.git


The following commit(s) were added to refs/heads/STREAMPIPES-577 by this push:
     new 1dede1727 [STREAMPIPES-577] More adapters support preview, improve preview appearance
1dede1727 is described below

commit 1dede1727e16ec92d1a5393dbe2c283bea1c07a1
Author: Dominik Riemer <do...@gmail.com>
AuthorDate: Wed Aug 17 09:38:12 2022 +0200

    [STREAMPIPES-577] More adapters support preview, improve preview appearance
---
 .../connect/adapter/format/csv/CsvParser.java      | 40 ++++++++++++++++++----
 .../adapter/format/json/AbstractJsonFormat.java    |  3 --
 .../connect/iiot/protocol/set/FileProtocol.java    | 11 +++---
 .../iiot/protocol/stream/FileStreamProtocol.java   | 11 +++---
 .../event-property-row.component.html              | 10 +++---
 .../event-property-row.component.scss              | 12 +++++--
 .../event-schema-preview.component.ts              | 10 +++++-
 7 files changed, 71 insertions(+), 26 deletions(-)

diff --git a/streampipes-connect/src/main/java/org/apache/streampipes/connect/adapter/format/csv/CsvParser.java b/streampipes-connect/src/main/java/org/apache/streampipes/connect/adapter/format/csv/CsvParser.java
index 4f6b87323..a5e4f3841 100644
--- a/streampipes-connect/src/main/java/org/apache/streampipes/connect/adapter/format/csv/CsvParser.java
+++ b/streampipes-connect/src/main/java/org/apache/streampipes/connect/adapter/format/csv/CsvParser.java
@@ -19,11 +19,13 @@
 package org.apache.streampipes.connect.adapter.format.csv;
 
 
-import org.apache.streampipes.connect.api.EmitBinaryEvent;
 import org.apache.streampipes.connect.adapter.model.generic.Parser;
 import org.apache.streampipes.connect.adapter.sdk.ParameterExtractor;
+import org.apache.streampipes.connect.api.EmitBinaryEvent;
 import org.apache.streampipes.connect.api.exception.ParseException;
 import org.apache.streampipes.model.connect.grounding.FormatDescription;
+import org.apache.streampipes.model.connect.guess.AdapterGuessInfo;
+import org.apache.streampipes.model.connect.guess.GuessTypeInfo;
 import org.apache.streampipes.model.schema.EventPropertyPrimitive;
 import org.apache.streampipes.model.schema.EventSchema;
 import org.apache.streampipes.vocabulary.XSD;
@@ -33,6 +35,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 
 
@@ -81,7 +84,13 @@ public class CsvParser extends Parser {
     }
 
     @Override
-    public EventSchema getEventSchema(List<byte[]> oneEvent) {
+    public boolean supportsPreview() {
+        return true;
+    }
+
+    @Override
+    public AdapterGuessInfo getSchemaAndSample(List<byte[]> oneEvent) {
+        var sample = new HashMap<String, GuessTypeInfo>();
         String[] keys;
         String[] data;
 
@@ -101,26 +110,45 @@ public class CsvParser extends Parser {
             EventPropertyPrimitive p = new EventPropertyPrimitive();
             p.setRuntimeName(keys[i]);
             p.setRuntimeType(getTypeString(data[i]));
+            sample.put(keys[i], new GuessTypeInfo(getTypeString(data[i]), data[i]));
             resultSchema.addEventProperty(p);
         }
 
-        return resultSchema;
+        return new AdapterGuessInfo(resultSchema, sample);
+    }
+
+    @Override
+    public EventSchema getEventSchema(List<byte[]> oneEvent) {
+        return getSchemaAndSample(oneEvent).getEventSchema();
     }
 
     private String getTypeString(String o) {
 
+        String typeClass = getTypeClass(o);
+
+        if (Float.class.getCanonicalName().equals(typeClass)) {
+            return XSD._float.toString();
+        } else if (Boolean.class.getCanonicalName().equals(typeClass)) {
+            return XSD._boolean.toString();
+        } else {
+            return XSD._string.toString();
+        }
+    }
+
+    private String getTypeClass(String o) {
+
         try {
             Double.parseDouble(o);
-            return XSD._float.toString();
+            return Float.class.getCanonicalName();
         } catch (NumberFormatException e) {
 
         }
 
         if (o.equalsIgnoreCase("true") || o.equalsIgnoreCase("false")) {
-            return XSD._boolean.toString();
+            return Boolean.class.getCanonicalName();
         }
 
-        return XSD._string.toString();
+        return String.class.getCanonicalName();
     }
 
 
diff --git a/streampipes-connect/src/main/java/org/apache/streampipes/connect/adapter/format/json/AbstractJsonFormat.java b/streampipes-connect/src/main/java/org/apache/streampipes/connect/adapter/format/json/AbstractJsonFormat.java
index a7116aecd..1da9b1696 100644
--- a/streampipes-connect/src/main/java/org/apache/streampipes/connect/adapter/format/json/AbstractJsonFormat.java
+++ b/streampipes-connect/src/main/java/org/apache/streampipes/connect/adapter/format/json/AbstractJsonFormat.java
@@ -21,7 +21,6 @@ import org.apache.streampipes.commons.exceptions.SpRuntimeException;
 import org.apache.streampipes.connect.api.IFormat;
 import org.apache.streampipes.connect.api.exception.ParseException;
 import org.apache.streampipes.dataformat.json.JsonDataFormatDefinition;
-import org.apache.streampipes.model.schema.EventSchema;
 
 import java.util.Map;
 
@@ -30,8 +29,6 @@ public abstract class AbstractJsonFormat implements IFormat {
 
   @Override
   public Map<String, Object> parse(byte[] object) throws ParseException {
-    EventSchema resultSchema = new EventSchema();
-
     JsonDataFormatDefinition jsonDefinition = new JsonDataFormatDefinition();
 
     Map<String, Object> result = null;
diff --git a/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/protocol/set/FileProtocol.java b/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/protocol/set/FileProtocol.java
index 31d4fc5bf..8dcb342c4 100644
--- a/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/protocol/set/FileProtocol.java
+++ b/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/protocol/set/FileProtocol.java
@@ -121,11 +121,12 @@ public class FileProtocol extends Protocol {
             InputStream targetStream = FileProtocolUtils.getFileInputStream(this.selectedFilename);
             List<byte[]> dataByte = parser.parseNEvents(targetStream, 20);
 
-            EventSchema eventSchema = parser.getEventSchema(dataByte);
-
-            GuessSchema result = SchemaGuesser.guessSchema(eventSchema);
-
-            return result;
+            if (parser.supportsPreview()) {
+                return SchemaGuesser.guessSchema(parser.getSchemaAndSample(dataByte));
+            } else {
+                EventSchema eventSchema = parser.getEventSchema(dataByte);
+                return SchemaGuesser.guessSchema(eventSchema);
+            }
         } catch (FileNotFoundException e) {
             throw new ParseException("Could not read local file");
         }
diff --git a/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/protocol/stream/FileStreamProtocol.java b/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/protocol/stream/FileStreamProtocol.java
index d82d28ce9..f88f5c538 100644
--- a/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/protocol/stream/FileStreamProtocol.java
+++ b/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/protocol/stream/FileStreamProtocol.java
@@ -211,11 +211,12 @@ public class FileStreamProtocol extends Protocol {
 
     List<byte[]> dataByte = parser.parseNEvents(dataInputStream, 2);
 
-    EventSchema eventSchema = parser.getEventSchema(dataByte);
-
-    GuessSchema result = SchemaGuesser.guessSchema(eventSchema);
-
-    return result;
+    if (parser.supportsPreview()) {
+      return SchemaGuesser.guessSchema(parser.getSchemaAndSample(dataByte));
+    } else {
+      EventSchema eventSchema = parser.getEventSchema(dataByte);
+      return SchemaGuesser.guessSchema(eventSchema);
+    }
   }
 
   @Override
diff --git a/ui/src/app/connect/components/new-adapter/schema-editor/event-property-row/event-property-row.component.html b/ui/src/app/connect/components/new-adapter/schema-editor/event-property-row/event-property-row.component.html
index 88a49c3e4..cf07a44ba 100644
--- a/ui/src/app/connect/components/new-adapter/schema-editor/event-property-row/event-property-row.component.html
+++ b/ui/src/app/connect/components/new-adapter/schema-editor/event-property-row/event-property-row.component.html
@@ -43,12 +43,14 @@
             </mat-icon>
             <span style="margin-left: -5px;">marked as timestamp</span>
         </div>
-        <div fxLayoutAlign="end center" *ngIf="runtimeType" class="runtime-type-info-outer">
+        <div fxLayoutAlign="end center" class="runtime-type-info-outer">
+            <div fxLayout="row" fxLayoutAlign="start center" fxFlex="100" *ngIf="runtimeType" >
             <span class="runtime-info runtime-type-info">{{originalRuntimeType}}</span>
-            <span fxLayoutAlign="center center"><i class="material-icons">arrow_right</i></span>
-            <span class="runtime-info runtime-type-info">{{runtimeType}}</span>
+            <span fxLayoutAlign="center center" *ngIf="originalRuntimeType !== runtimeType"><i class="material-icons">arrow_right</i></span>
+            <span class="runtime-info runtime-type-info" *ngIf="originalRuntimeType !== runtimeType">{{runtimeType}}</span>
+            </div>
         </div>
-        <div fxLayoutAlign="end center">
+        <div fxLayoutAlign="end center" class="status-outer">
         <span *ngIf="showFieldStatus"
               [ngClass]="'status status-' +fieldStatusInfo[originalRuntimeName].fieldStatus.toLowerCase()"
               [matTooltip]="fieldStatusInfo[originalRuntimeName].additionalInfo">{{fieldStatusInfo[originalRuntimeName].fieldStatus}}</span>
diff --git a/ui/src/app/connect/components/new-adapter/schema-editor/event-property-row/event-property-row.component.scss b/ui/src/app/connect/components/new-adapter/schema-editor/event-property-row/event-property-row.component.scss
index 9e4191930..ec2466197 100644
--- a/ui/src/app/connect/components/new-adapter/schema-editor/event-property-row/event-property-row.component.scss
+++ b/ui/src/app/connect/components/new-adapter/schema-editor/event-property-row/event-property-row.component.scss
@@ -60,6 +60,11 @@
   border-radius: 5px;
 }
 
+.status-outer {
+  width: 70px;
+  min-width: 70px;
+}
+
 .runtime-info {
   border-radius: 5px;
   color: var(--color-default-text);
@@ -70,15 +75,18 @@
 .runtime-type-info {
   border-radius: 5px;
   color: var(--color-default-text);
-  width: 60px;
   font-size: 10pt;
+  width: 70px;
+  border: 1px solid var(--color-bg-3);
   text-align: center;
 }
 
 .runtime-type-info-outer {
   padding: 3px;
   border-radius: 5px;
-  background: var(--color-bg-3);
+  width: 170px;
+  text-align: center;
+
 }
 
 
diff --git a/ui/src/app/connect/components/new-adapter/schema-editor/event-schema-preview/event-schema-preview.component.ts b/ui/src/app/connect/components/new-adapter/schema-editor/event-schema-preview/event-schema-preview.component.ts
index 11823a586..d7dc13cc1 100644
--- a/ui/src/app/connect/components/new-adapter/schema-editor/event-schema-preview/event-schema-preview.component.ts
+++ b/ui/src/app/connect/components/new-adapter/schema-editor/event-schema-preview/event-schema-preview.component.ts
@@ -43,11 +43,19 @@ export class EventSchemaPreviewComponent implements OnInit {
   }
 
   toSimpleMap(event: Record<string, GuessTypeInfo>): Record<string, any> {
-    const result = {};
+    let result: Record<string, any> = {};
+
     for (const key in event) {
       result[key] = event[key].value;
     }
 
+   result = Object.keys(result).sort().reduce(
+      (obj, key) => {
+        obj[key] = result[key];
+        return obj;
+      },
+      {}
+    );
 
     return result;
   }