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

bossenti pushed a commit to branch dev
in repository 
https://gitbox.apache.org/repos/asf/incubator-streampipes-extensions.git

commit ded0ae23accb4eb2779b924c6ddcfbe2c7029ecb
Author: bossenti <[email protected]>
AuthorDate: Tue Feb 23 14:11:23 2021 +0100

    [STREAMPIPES-300] implement resolveOptions
---
 .../streampipes/connect/adapters/opcua/OpcUa.java  | 37 +++++++++----
 .../connect/adapters/opcua/OpcUaAdapter.java       | 64 +++++++++++++---------
 2 files changed, 63 insertions(+), 38 deletions(-)

diff --git 
a/streampipes-connect-adapters/src/main/java/org/apache/streampipes/connect/adapters/opcua/OpcUa.java
 
b/streampipes-connect-adapters/src/main/java/org/apache/streampipes/connect/adapters/opcua/OpcUa.java
index 4ed74b6..8bfdc07 100644
--- 
a/streampipes-connect-adapters/src/main/java/org/apache/streampipes/connect/adapters/opcua/OpcUa.java
+++ 
b/streampipes-connect-adapters/src/main/java/org/apache/streampipes/connect/adapters/opcua/OpcUa.java
@@ -74,10 +74,11 @@ public class OpcUa {
     }
 
 
-    public OpcUa(String opcServerURL, int namespaceIndex, String nodeId) {
+    public OpcUa(String opcServerURL, int namespaceIndex, String nodeId, 
List<String> selectedNodeNames) {
 
         this.opcServerURL = opcServerURL;
         this.unauthenticated = true;
+        this.selectedNodeNames = selectedNodeNames;
 
         if (isInteger(nodeId)) {
             int integerNodeId = Integer.parseInt(nodeId);
@@ -87,19 +88,19 @@ public class OpcUa {
         }
     }
 
-    public OpcUa(String opcServer, int opcServerPort, int namespaceIndex, 
String nodeId) {
-        this( opcServer + ":" + opcServerPort, namespaceIndex, nodeId);
+    public OpcUa(String opcServer, int opcServerPort, int namespaceIndex, 
String nodeId, List<String> selectedNodeNames) {
+        this( opcServer + ":" + opcServerPort, namespaceIndex, nodeId, 
selectedNodeNames);
     }
 
-    public OpcUa(String opcServerURL, int namespaceIndex, String nodeId, 
String username, String password) {
-        this(opcServerURL, namespaceIndex, nodeId);
+    public OpcUa(String opcServerURL, int namespaceIndex, String nodeId, 
String username, String password, List<String> selectedNodeNames) {
+        this(opcServerURL, namespaceIndex, nodeId, selectedNodeNames);
         this.unauthenticated = false;
         this.user = username;
         this.password = password;
     }
 
-    public OpcUa(String opcServer, int opcServerPort, int namespaceIndex, 
String nodeId, String username, String password) {
-        this (opcServer, opcServerPort, namespaceIndex, nodeId);
+    public OpcUa(String opcServer, int opcServerPort, int namespaceIndex, 
String nodeId, String username, String password, List<String> 
selectedNodeNames) {
+        this (opcServer, opcServerPort, namespaceIndex, nodeId, 
selectedNodeNames);
         this.unauthenticated = false;
         this.user = username;
         this.password = password;
@@ -172,8 +173,8 @@ public class OpcUa {
         );
     }
 
-    public List<OpcNode> browseNode() throws AdapterException {
-        List<OpcNode> referenceDescriptions = browseNode(node);
+    public List<OpcNode> browseNode(boolean selectNodes) throws 
AdapterException {
+        List<OpcNode> referenceDescriptions = browseNode(node, selectNodes);
 
         if (referenceDescriptions.size() == 0) {
             referenceDescriptions = getRootNote(node);
@@ -219,10 +220,9 @@ public class OpcUa {
         return result;
     }
 
-    private List<OpcNode> browseNode(NodeId browseRoot) throws 
AdapterException {
+    private List<OpcNode> browseNode(NodeId browseRoot, boolean selectNodes) 
throws AdapterException {
         List<OpcNode> result = new ArrayList<>();
 
-
         BrowseDescription browse = new BrowseDescription(
                 browseRoot,
                 BrowseDirection.Forward,
@@ -304,7 +304,7 @@ public class OpcUa {
                         result.add(opcNode);
                         
rd.getNodeId().toNodeId(client.getNamespaceTable()).ifPresent(nodeId -> {
                             try {
-                                browseNode(nodeId);
+                                browseNode(nodeId, selectNodes);
                             } catch (AdapterException e) {
                                 e.printStackTrace();
                             }
@@ -316,6 +316,12 @@ public class OpcUa {
             throw new AdapterException("Browsing nodeId=" + browse + " failed: 
" + e.getMessage());
         }
 
+        if (selectNodes) {
+            // filter for nodes that were selected by the user during 
configuration
+            result = result.stream().filter(node -> 
this.getSelectedNodeNames().contains(node.getLabel()))
+                    .collect(Collectors.toList());
+        }
+
         return result;
 
     }
@@ -413,4 +419,11 @@ public class OpcUa {
     }
 
 
+    public List<String> getSelectedNodeNames() {
+        return selectedNodeNames;
+    }
+
+    public String getOpcServerURL() {
+        return opcServerURL;
+    }
 }
diff --git 
a/streampipes-connect-adapters/src/main/java/org/apache/streampipes/connect/adapters/opcua/OpcUaAdapter.java
 
b/streampipes-connect-adapters/src/main/java/org/apache/streampipes/connect/adapters/opcua/OpcUaAdapter.java
index 1c7c5a6..6a44b60 100644
--- 
a/streampipes-connect-adapters/src/main/java/org/apache/streampipes/connect/adapters/opcua/OpcUaAdapter.java
+++ 
b/streampipes-connect-adapters/src/main/java/org/apache/streampipes/connect/adapters/opcua/OpcUaAdapter.java
@@ -22,11 +22,13 @@ import org.apache.streampipes.connect.adapter.Adapter;
 import org.apache.streampipes.connect.adapter.exception.AdapterException;
 import org.apache.streampipes.connect.adapter.exception.ParseException;
 import 
org.apache.streampipes.connect.adapter.model.specific.SpecificDataStreamAdapter;
+import org.apache.streampipes.container.api.ResolvesContainerProvidedOptions;
 import org.apache.streampipes.model.AdapterType;
 import 
org.apache.streampipes.model.connect.adapter.SpecificAdapterStreamDescription;
 import org.apache.streampipes.model.connect.guess.GuessSchema;
 import org.apache.streampipes.model.schema.EventProperty;
 import org.apache.streampipes.model.schema.EventSchema;
+import org.apache.streampipes.model.staticproperty.Option;
 import org.apache.streampipes.sdk.StaticProperties;
 import org.apache.streampipes.sdk.builder.PrimitivePropertyBuilder;
 import 
org.apache.streampipes.sdk.builder.adapter.SpecificDataStreamAdapterBuilder;
@@ -38,12 +40,9 @@ import 
org.eclipse.milo.opcua.stack.core.types.builtin.DataValue;
 import org.eclipse.milo.opcua.stack.core.types.builtin.NodeId;
 
 import java.net.URI;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
-public class OpcUaAdapter extends SpecificDataStreamAdapter {
+public class OpcUaAdapter extends SpecificDataStreamAdapter implements 
ResolvesContainerProvidedOptions {
 
     public static final String ID = 
"org.apache.streampipes.connect.adapters.opcua";
 
@@ -60,6 +59,7 @@ public class OpcUaAdapter extends SpecificDataStreamAdapter {
     private static final String USERNAME = "USERNAME";
     private static final String PASSWORD = "PASSWORD";
     private static final String UNAUTHENTICATED = "UNAUTHENTICATED";
+    private static final String AVAILABLE_NODES = "AVAILABLE_NODES";
 
     private String opcUaServer;
     private String namespaceIndex;
@@ -113,6 +113,7 @@ public class OpcUaAdapter extends SpecificDataStreamAdapter 
{
                                         
StaticProperties.stringFreeTextProperty(Labels.withId(OPC_SERVER_PORT)))))
                 .requiredTextParameter(Labels.withId(NAMESPACE_INDEX))
                 .requiredTextParameter(Labels.withId(NODE_ID))
+                
.requiredMultiValueSelectionFromContainer(Labels.withId(AVAILABLE_NODES), 
Arrays.asList(NAMESPACE_INDEX, NODE_ID))
                 .build();
         description.setAppId(ID);
 
@@ -158,7 +159,8 @@ public class OpcUaAdapter extends SpecificDataStreamAdapter 
{
         try {
             this.opcUa.connect();
 
-            this.allNodes = this.opcUa.browseNode();
+            this.allNodes = this.opcUa.browseNode(true);
+
             List<NodeId> nodeIds = new ArrayList<>();
 
             for (OpcNode rd : this.allNodes) {
@@ -206,8 +208,7 @@ public class OpcUaAdapter extends SpecificDataStreamAdapter 
{
 
         try {
             opc.connect();
-            List<OpcNode> res =  opc.browseNode();
-
+            List<OpcNode> res =  opc.browseNode(true);
 
             if (res.size() > 0) {
                 for (OpcNode opcNode : res) {
@@ -285,24 +286,35 @@ public class OpcUaAdapter extends 
SpecificDataStreamAdapter {
         this.nodeId = extractor.singleValueParameter(NODE_ID, String.class);
     }
 
-//    @Override
-//    public List<Option> resolveOptions(String requestId, 
StaticPropertyExtractor parameterExtractor) {
-//        String opcUaServer = 
parameterExtractor.singleValueParameter(OPC_SERVER_HOST, String.class);
-//        int port = parameterExtractor.singleValueParameter(OPC_SERVER_PORT, 
Integer.class);
-//        int namespaceIndex = 
parameterExtractor.singleValueParameter(NAMESPACE_INDEX, Integer.class);
-//
-//        OpcUa opc = new OpcUa(opcUaServer, port, namespaceIndex, 
Identifiers.RootFolder);
-//
-//        try {
-//            opc.connect();
-//            List<OpcNode> res =  opc.browseNode();
-//            System.out.println(res);
-//        } catch (Exception e) {
-//            e.printStackTrace();
-//        }
-//
-//        return new ArrayList<>();
-//    }
+
+    @Override
+    public List<Option> resolveOptions(String requestId, 
StaticPropertyExtractor parameterExtractor) {
+
+        try {
+            parameterExtractor.selectedAlternativeInternalId(OPC_HOST_OR_URL);
+            parameterExtractor.selectedAlternativeInternalId(ACCESS_MODE);
+        } catch (NullPointerException npe){
+            return new ArrayList<>();
+        }
+
+        OpcUa opc = OpcUa.from(parameterExtractor);
+
+        List<Option> nodes = new ArrayList<>();
+        try {
+            opc.connect();
+            this.allNodes =  opc.browseNode(false);
+
+            for (OpcNode opcNode: this.allNodes) {
+                nodes.add(new Option(opcNode.getLabel(), 
opcNode.nodeId.getIdentifier().toString()));
+            }
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return nodes;
+    }
+
 
 
     private String getRuntimeNameOfNode(NodeId nodeId) {

Reply via email to