You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cd...@apache.org on 2020/05/15 13:50:01 UTC
[plc4x] branch rel/0.7 updated: - Merged changes from the develop
branch
This is an automated email from the ASF dual-hosted git repository.
cdutz pushed a commit to branch rel/0.7
in repository https://gitbox.apache.org/repos/asf/plc4x.git
The following commit(s) were added to refs/heads/rel/0.7 by this push:
new 41ebb4d - Merged changes from the develop branch
41ebb4d is described below
commit 41ebb4db731464eb981c720b4f1122125313f30d
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Fri May 15 15:49:47 2020 +0200
- Merged changes from the develop branch
---
plc4j/integrations/apache-camel/pom.xml | 12 ++-
.../apache-camel/src/main/docs/PLC4X.adoc | 46 ++++++++-
.../java/org/apache/plc4x/camel/Constants.java | 3 +-
.../org/apache/plc4x/camel/Plc4XComponent.java | 16 ++-
.../java/org/apache/plc4x/camel/Plc4XConsumer.java | 111 +++++++++++++++------
.../java/org/apache/plc4x/camel/Plc4XEndpoint.java | 93 +++++++++++------
.../apache/plc4x/camel/Plc4XPollingConsumer.java | 27 +++--
.../java/org/apache/plc4x/camel/Plc4XProducer.java | 27 ++---
.../main/java/org/apache/plc4x/camel/TagData.java | 12 +++
.../org/apache/plc4x/camel/Plc4XComponentTest.java | 10 +-
plc4j/karaf-features/camel/pom.xml | 2 +-
plc4j/tools/scraper/pom.xml | 14 ---
.../triggerhandler/TriggerConfiguration.java | 12 +--
.../triggeredscraper/TriggeredScraperImplTest.java | 3 +-
.../test/resources/example_triggered_scraper.yml | 8 +-
.../src/test/resources/mock-scraper-config.yml | 4 +-
pom.xml | 2 +-
17 files changed, 273 insertions(+), 129 deletions(-)
diff --git a/plc4j/integrations/apache-camel/pom.xml b/plc4j/integrations/apache-camel/pom.xml
index 1a9057b..53c2b05 100644
--- a/plc4j/integrations/apache-camel/pom.xml
+++ b/plc4j/integrations/apache-camel/pom.xml
@@ -135,6 +135,17 @@
</dependency>
<dependency>
+ <groupId>org.apache.plc4x</groupId>
+ <artifactId>plc4j-connection-pool</artifactId>
+ <version>0.7.0-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.plc4x</groupId>
+ <artifactId>plc4j-scraper</artifactId>
+ <version>0.7.0-SNAPSHOT</version>
+ </dependency>
+
+ <dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-core-engine</artifactId>
<version>${camel.version}</version>
@@ -160,7 +171,6 @@
<version>${camel.version}</version>
</dependency>
-
<!-- Support camel documentation-->
<!-- TODO: Do we need this? -->
<!--dependency>
diff --git a/plc4j/integrations/apache-camel/src/main/docs/PLC4X.adoc b/plc4j/integrations/apache-camel/src/main/docs/PLC4X.adoc
index 3aa5fe8..4b0dfc8 100644
--- a/plc4j/integrations/apache-camel/src/main/docs/PLC4X.adoc
+++ b/plc4j/integrations/apache-camel/src/main/docs/PLC4X.adoc
@@ -15,8 +15,50 @@
// limitations under the License.
//
-// component options: START
-// component options: END
+:icons: font
+
+== Camel-PLC4X Component
+The Camel Component for PLC4X allows you to create routes using the PLC4X API to read from a PLC device or write to it.
+
+=== Maven dependency
+To use the Camel component, just add following dependency to your project
+----
+<dependency>
+ <groupId>org.apache.plc4x</groupId>
+ <artifactId>plc4j-apache-camel</artifactId>
+ <version>{current-last-released-version}</version>
+</dependency>
+----
+
+== Endpoint
+[cols="2"]
+|===
+|Name |Value
+
+|*Tags* | The tags to read as `Map<String,String>` containing the tagname associated to its query
+|*Trigger*|(*Consumer*) Query to a trigger. On a rising edge of the trigger, the tags will be read once
+|*Period* |(*Consumer*) Interval on which the Trigger should be checked
+|*Driver parameters* | Every Parameter unknown to the Component will be passed to the driver
+|===
+=== URI Format
+----
+plc4x:[driver-code]://[IP|host][?parameters]
+----
+Note that sometimes you want to add the `Transport` code after the `Driver` code:
+
+----
+plc4x:[driver-code]:[transport-code]://[IP|host][?parameters]
+----
+== Consumer
+The consumer supports one-time reading or Triggered Reading. (_Schedulded Reading using Period only soon_).To read from
+the PLC, use a `Map<String,String>` containing the Alias and Queries for the Data you want.
+
+The Body create by the Consumer will be a `Map<String,Object>` containing the Aliases and there associated value
+read from the PLC.
+
+== Producer
+To write data to the PLC, we also use a `Map`. The difference with the Producer is that the `Value` of the Map has also to
+be a Map. Also, this `Map` has to be set into the `Body` of the `Message`
// endpoint options: START
// endpoint options: END
\ No newline at end of file
diff --git a/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Constants.java b/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Constants.java
index 733e269..e5bfd12 100644
--- a/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Constants.java
+++ b/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Constants.java
@@ -22,7 +22,8 @@ public class Constants {
public static final String FIELD_NAME_HEADER = "fieldName";
public static final String FIELD_QUERY_HEADER = "fieldQuery";
-
+ public final static String TRIGGER = "TRIGGER_VAR";
+ public final static String PLC_NAME = "PLC";
private Constants() {
throw new IllegalStateException("Utility class!");
}
diff --git a/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XComponent.java b/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XComponent.java
index 82763ff..b629bd2 100644
--- a/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XComponent.java
+++ b/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XComponent.java
@@ -21,11 +21,10 @@ package org.apache.plc4x.camel;
import org.apache.camel.Endpoint;
import org.apache.camel.support.DefaultComponent;
import org.apache.camel.util.IntrospectionSupport;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.util.ArrayList;
-import java.util.List;
import java.util.Map;
public class Plc4XComponent extends DefaultComponent {
@@ -34,10 +33,21 @@ public class Plc4XComponent extends DefaultComponent {
@Override
protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
Endpoint endpoint = new Plc4XEndpoint(uri, this);
- List<TagData>tags = getAndRemoveOrResolveReferenceParameter(parameters,"tags", List.class);
+ //Tags have a Name, a query and an optional value (for writing)
+ //Reading --> Map<String,String>
+ //Writing --> Map<String,Map.Entry<String,Object>>
+ Map<String, Object> tags = getAndRemoveOrResolveReferenceParameter(parameters, "tags", Map.class);
if(tags!=null){
((Plc4XEndpoint)endpoint).setTags(tags);
}
+ String trigger = getAndRemoveOrResolveReferenceParameter(parameters,"trigger",String.class);
+ if(trigger!=null){
+ ((Plc4XEndpoint)endpoint).setTrigger(trigger);
+ }
+ Object period = getAndRemoveOrResolveReferenceParameter(parameters,"period",Integer.class);
+ if(period!=null && period instanceof Integer){
+ ((Plc4XEndpoint)endpoint).setPeriod((int)period);
+ }
setProperties(endpoint,parameters);
return endpoint;
}
diff --git a/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XConsumer.java b/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XConsumer.java
index 18161db..c81fe66 100644
--- a/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XConsumer.java
+++ b/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XConsumer.java
@@ -25,15 +25,22 @@ import org.apache.camel.support.DefaultConsumer;
import org.apache.camel.spi.ExceptionHandler;
import org.apache.plc4x.java.api.PlcConnection;
import org.apache.plc4x.java.api.exceptions.PlcException;
+import org.apache.plc4x.java.api.exceptions.PlcIncompatibleDatatypeException;
import org.apache.plc4x.java.api.messages.PlcReadRequest;
import org.apache.plc4x.java.api.messages.PlcSubscriptionResponse;
+import org.apache.plc4x.java.scraper.ScrapeJob;
+import org.apache.plc4x.java.scraper.config.JobConfigurationImpl;
+import org.apache.plc4x.java.scraper.config.ScraperConfiguration;
+import org.apache.plc4x.java.scraper.config.triggeredscraper.ScraperConfigurationTriggeredImpl;
+import org.apache.plc4x.java.scraper.exception.ScraperException;
+import org.apache.plc4x.java.scraper.triggeredscraper.TriggeredScrapeJobImpl;
+import org.apache.plc4x.java.scraper.triggeredscraper.TriggeredScraperImpl;
+import org.apache.plc4x.java.scraper.triggeredscraper.triggerhandler.collector.TriggerCollector;
+import org.apache.plc4x.java.scraper.triggeredscraper.triggerhandler.collector.TriggerCollectorImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
import java.util.concurrent.*;
public class Plc4XConsumer extends DefaultConsumer {
@@ -41,19 +48,23 @@ public class Plc4XConsumer extends DefaultConsumer {
private ExceptionHandler exceptionHandler;
private PlcConnection plcConnection;
- private List<TagData> tags;
- private Map parameters;
+ private Map<String,Object> tags;
+ private String trigger;
private PlcSubscriptionResponse subscriptionResponse;
private Plc4XEndpoint plc4XEndpoint;
private ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
private ScheduledFuture<?> future;
+
+
public Plc4XConsumer(Plc4XEndpoint endpoint, Processor processor) throws PlcException {
super(endpoint, processor);
plc4XEndpoint =endpoint;
this.plcConnection = endpoint.getConnection();
this.tags = endpoint.getTags();
+ this.trigger= endpoint.getTrigger();
+ plc4XEndpoint=endpoint;
}
@Override
@@ -76,41 +87,75 @@ public class Plc4XConsumer extends DefaultConsumer {
@Override
protected void doStart() throws InterruptedException, ExecutionException {
- PlcReadRequest.Builder builder = plcConnection.readRequestBuilder();
- if (tags.size()==1){
- TagData tag = tags.get(0);
- builder.addItem(tag.getTagName(),tag.getQuery());
-
- }
- else{
- for(TagData tag : tags){
- builder.addItem(tag.getTagName(),tag.getQuery());
- }
- }
- PlcReadRequest request = builder.build();
- future = executorService.schedule(() -> {
- request.execute().thenAccept(response -> {
+ if(trigger==null) {
+ PlcReadRequest.Builder builder = plcConnection.readRequestBuilder();
+ for( String tag : tags.keySet()){
+ try{
+ String query = (String)tags.get(tag);
+ builder.addItem(tag,query);
+ }
+ catch (PlcIncompatibleDatatypeException e){
+ LOGGER.error("For consumer, please use Map<String,String>, currently using {}",tags.getClass().getSimpleName());
+ }
+ }
+ PlcReadRequest request = builder.build();
+ future = executorService.schedule(() -> {
+ request.execute().thenAccept(response -> {
try {
Exchange exchange = plc4XEndpoint.createExchange();
- if (tags.size()>1){
- List<TagData> values = new ArrayList<>();
- for(TagData tag : tags){
- tag.setValue(response.getObject(tag.getTagName()));
- values.add(tag);
- }
- exchange.getIn().setBody(values);
- }
- else {
- TagData tag = tags.get(0);
- tag.setValue(response.getAllObjects(tag.getTagName()));
- exchange.getIn().setBody(tag);
+ Map<String,Object> rsp = new HashMap<>();
+ for(String field : response.getFieldNames()){
+ rsp.put(field,response.getObject(field));
}
+ exchange.getIn().setBody(rsp);
getProcessor().process(exchange);
} catch (Exception e) {
exceptionHandler.handleException(e);
}
});
- }, 500, TimeUnit.MILLISECONDS);
+ }, 500, TimeUnit.MILLISECONDS);
+ }
+ else{
+ try {
+ ScraperConfiguration configuration = getScraperConfig(validateTags());
+ TriggerCollector collector = new TriggerCollectorImpl(plc4XEndpoint.getPlcDriverManager());
+
+ TriggeredScraperImpl scraper = new TriggeredScraperImpl(configuration, (job, alias, response) -> {
+ try {
+ Exchange exchange = plc4XEndpoint.createExchange();
+ exchange.getIn().setBody(response);
+ getProcessor().process(exchange);
+ } catch (Exception e) {
+ exceptionHandler.handleException(e);
+ };
+ },collector);
+ scraper.start();
+ collector.start();
+ } catch (ScraperException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ private Map<String, String> validateTags() {
+ Map<String, String> map = new HashMap<>();
+ for(Map.Entry<String,Object>tag: tags.entrySet()){
+ if(tag.getValue() instanceof String){
+ map.put(tag.getKey(),(String)tag.getValue());
+ }
+ }
+ if(map.size()!=tags.size()){
+ LOGGER.error("At least one entry does not match the format : Map.Entry<String,String> ");
+ return null;
+ }
+ else return map;
+ }
+
+ private ScraperConfigurationTriggeredImpl getScraperConfig(Map<String,String> tagList){
+ String config = "(TRIGGER_VAR,"+plc4XEndpoint.getPeriod()+",("+ plc4XEndpoint.getTrigger() +")==(true))";
+ List<JobConfigurationImpl> job = Collections.singletonList(new JobConfigurationImpl("PLC4X-Camel",config,0,Collections.singletonList(Constants.PLC_NAME),tagList));
+ Map<String,String> source = Collections.singletonMap(Constants.PLC_NAME,plc4XEndpoint.getUri());
+ return new ScraperConfigurationTriggeredImpl(source,job);
}
@Override
diff --git a/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XEndpoint.java b/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XEndpoint.java
index c7e6a0e..e14e9f5 100644
--- a/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XEndpoint.java
+++ b/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XEndpoint.java
@@ -24,10 +24,11 @@ import org.apache.camel.spi.Metadata;
import org.apache.camel.spi.UriEndpoint;
import org.apache.camel.spi.UriParam;
import org.apache.camel.spi.UriPath;
+import org.apache.commons.math3.util.Pair;
import org.apache.plc4x.java.PlcDriverManager;
import org.apache.plc4x.java.api.PlcConnection;
import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
-import org.slf4j.LoggerFactory;
+import org.apache.plc4x.java.utils.connectionpool.PooledPlcDriverManager;
import java.util.List;
import java.util.Map;
@@ -36,26 +37,60 @@ import java.util.Objects;
@UriEndpoint(scheme = "plc4x", title = "PLC4X", syntax = "plc4x:driver", label = "plc4x")
public class Plc4XEndpoint extends DefaultEndpoint {
- @UriPath @Metadata(required = true)
+ @UriPath
+ @Metadata(required = true)
private String driver;
@UriParam
- private List<TagData> tags;
+ private Map<String, Object> tags;
+ @UriParam
+ private String trigger;
+
+ @UriParam
+ private int period;
+
+ public int getPeriod() {
+ return period;
+ }
+
+ public void setPeriod(int period) {
+ this.period = period;
+ }
- private final PlcDriverManager plcDriverManager;
- private PlcConnection connection;
+ private PlcDriverManager plcDriverManager;
+ private PlcConnection connection;
private String uri;
+ public String getUri() {
+ return uri;
+ }
+
+ public String getTrigger() {
+ return trigger;
+ }
+
+ public void setTrigger(String trigger) {
+ this.trigger = trigger;
+ plcDriverManager = new PooledPlcDriverManager();
+ String plc4xURI = uri.replaceFirst("plc4x:/?/?", "");
+ uri=plc4xURI;
+ try {
+ connection = plcDriverManager.getConnection(plc4xURI);
+ } catch (PlcConnectionException e) {
+ e.printStackTrace();
+ }
+ }
+
public Plc4XEndpoint(String endpointUri, Component component) {
super(endpointUri, component);
- plcDriverManager= new PlcDriverManager();
+ plcDriverManager = new PlcDriverManager();
uri = endpointUri;
-
//Here we establish the connection in the endpoint, as it is created once during the context
// to avoid disconnecting and reconnecting for every request
try {
String plc4xURI = uri.replaceFirst("plc4x:/?/?", "");
+ uri = plc4xURI;
connection = plcDriverManager.getConnection(plc4xURI);
} catch (PlcConnectionException e) {
@@ -75,11 +110,10 @@ public class Plc4XEndpoint extends DefaultEndpoint {
@Override
public Producer createProducer() throws Exception {
//Checking if connection is still up and reconnecting if not
- if(!connection.isConnected()){
- try{
- connection= plcDriverManager.getConnection(uri.replaceFirst("plc4x:/?/?", ""));
- }
- catch (Exception e){
+ if (!connection.isConnected()) {
+ try {
+ connection = plcDriverManager.getConnection(uri.replaceFirst("plc4x:/?/?", ""));
+ } catch (Exception e) {
e.printStackTrace();
}
}
@@ -89,11 +123,10 @@ public class Plc4XEndpoint extends DefaultEndpoint {
@Override
public Consumer createConsumer(Processor processor) throws Exception {
//Checking if connection is still up and reconnecting if not
- if(!connection.isConnected()){
- try{
- connection= plcDriverManager.getConnection(uri.replaceFirst("plc4x:/?/?", ""));
- }
- catch (Exception e){
+ if (!connection.isConnected()) {
+ try {
+ connection = plcDriverManager.getConnection(uri.replaceFirst("plc4x:/?/?", ""));
+ } catch (Exception e) {
e.printStackTrace();
}
}
@@ -103,11 +136,10 @@ public class Plc4XEndpoint extends DefaultEndpoint {
@Override
public PollingConsumer createPollingConsumer() throws Exception {
//Checking if connection is still up and reconnecting if not
- if(!connection.isConnected()){
- try{
- connection= plcDriverManager.getConnection(uri.replaceFirst("plc4x:/?/?", ""));
- }
- catch (Exception e){
+ if (!connection.isConnected()) {
+ try {
+ connection = plcDriverManager.getConnection(uri.replaceFirst("plc4x:/?/?", ""));
+ } catch (Exception e) {
e.printStackTrace();
}
}
@@ -131,11 +163,11 @@ public class Plc4XEndpoint extends DefaultEndpoint {
this.driver = driver;
}
- public List<TagData> getTags() {
+ public Map<String, Object> getTags() {
return tags;
}
- public void setTags(List<TagData> tags) {
+ public void setTags(Map<String, Object> tags) {
this.tags = tags;
}
@@ -158,20 +190,19 @@ public class Plc4XEndpoint extends DefaultEndpoint {
@Override
public int hashCode() {
- return Objects.hash(super.hashCode(), getDriver(), getTags(),getPlcDriverManager());
+ return Objects.hash(super.hashCode(), getDriver(), getTags(), getPlcDriverManager());
}
@Override
- public void doStop(){
+ public void doStop() {
//Shutting down the connection when leaving the Context
- try{
- if(connection!=null){
- if(connection.isConnected()){
+ try {
+ if (connection != null) {
+ if (connection.isConnected()) {
connection.close();
}
}
- }
- catch (Exception e){
+ } catch (Exception e) {
e.printStackTrace();
}
}
diff --git a/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XPollingConsumer.java b/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XPollingConsumer.java
index a261606..c6c369e 100644
--- a/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XPollingConsumer.java
+++ b/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XPollingConsumer.java
@@ -26,8 +26,14 @@ import org.apache.camel.spi.ExceptionHandler;
import org.apache.camel.support.LoggingExceptionHandler;
import org.apache.plc4x.java.api.PlcConnection;
import org.apache.plc4x.java.api.exceptions.PlcException;
+import org.apache.plc4x.java.api.exceptions.PlcIncompatibleDatatypeException;
import org.apache.plc4x.java.api.messages.PlcReadRequest;
import org.apache.plc4x.java.api.messages.PlcReadResponse;
+import org.apache.plc4x.java.scraper.config.ScraperConfiguration;
+import org.apache.plc4x.java.scraper.exception.ScraperException;
+import org.apache.plc4x.java.scraper.triggeredscraper.TriggeredScraperImpl;
+import org.apache.plc4x.java.scraper.triggeredscraper.triggerhandler.collector.TriggerCollector;
+import org.apache.plc4x.java.scraper.triggeredscraper.triggerhandler.collector.TriggerCollectorImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -44,14 +50,17 @@ public class Plc4XPollingConsumer implements PollingConsumer {
private ExceptionHandler exceptionHandler;
private PlcConnection plcConnection;
private PlcReadRequest.Builder requestBuilder;
- private Map parameters;
-
+ private Map<String,Object> tags;
+ private String trigger;
+//TODO Is this still needed with the scraper working?
public Plc4XPollingConsumer(Plc4XEndpoint endpoint) throws PlcException {
plc4XEndpoint=endpoint;
this.exceptionHandler = new LoggingExceptionHandler(endpoint.getCamelContext(), getClass());
String plc4xURI = endpoint.getEndpointUri().replaceFirst("plc4x:/?/?", "");
this.plcConnection = endpoint.getConnection();
+ this.tags = endpoint.getTags();
+ this.trigger= endpoint.getTrigger();
}
@Override
@@ -73,7 +82,7 @@ public class Plc4XPollingConsumer implements PollingConsumer {
}
@Override
- public Exchange receive() {
+ public Exchange receive() {/**
Exchange exchange = plc4XEndpoint.createExchange();
try {
PlcReadResponse read = createReadRequest().execute().get();
@@ -96,7 +105,8 @@ public class Plc4XPollingConsumer implements PollingConsumer {
} catch (ExecutionException e) {
exchange.setException(e);
}
- return exchange;
+ return exchange;*/
+ return null;
}
@Override
@@ -105,7 +115,7 @@ public class Plc4XPollingConsumer implements PollingConsumer {
}
@Override
- public Exchange receive(long timeout) {
+ public Exchange receive(long timeout) {/**
Exchange exchange = plc4XEndpoint.createExchange();
CompletableFuture<? extends PlcReadResponse> read = createReadRequest().execute();
try {
@@ -129,11 +139,12 @@ public class Plc4XPollingConsumer implements PollingConsumer {
} catch(ExecutionException | TimeoutException e){
exchange.setException(e);
}
- return exchange;
+ return exchange;*/
+ return null;
}
- private PlcReadRequest createReadRequest() {
+ private PlcReadRequest createReadRequest() {/**
requestBuilder = plcConnection.readRequestBuilder();
if (plc4XEndpoint.getTags().size()>1){
for(TagData tag : plc4XEndpoint.getTags()){
@@ -145,7 +156,7 @@ public class Plc4XPollingConsumer implements PollingConsumer {
requestBuilder.addItem(tag.getTagName(),tag.getQuery());
}
return requestBuilder.build();
- }
+ */return null;}
private Object unwrapIfSingle(Collection collection) {
if (collection.isEmpty()) {
diff --git a/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XProducer.java b/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XProducer.java
index 2dd64ba..2325d3a 100644
--- a/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XProducer.java
+++ b/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XProducer.java
@@ -22,6 +22,7 @@ import org.apache.camel.AsyncCallback;
import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.apache.camel.support.DefaultAsyncProducer;
+import org.apache.commons.math3.util.Pair;
import org.apache.plc4x.java.api.PlcConnection;
import org.apache.plc4x.java.api.exceptions.PlcException;
import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
@@ -30,7 +31,8 @@ import org.apache.plc4x.java.api.messages.PlcWriteResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.util.List;
+import java.util.Iterator;
+import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.atomic.AtomicInteger;
@@ -54,20 +56,19 @@ public class Plc4XProducer extends DefaultAsyncProducer {
Message in = exchange.getIn();
Object body = in.getBody();
PlcWriteRequest.Builder builder = plcConnection.writeRequestBuilder();
- if (body instanceof List) { //Check if we have a List
- if(((List) body).get(0) instanceof TagData){ //Check if this List contains TagData
- List<TagData> tags =(List<TagData>) body;
- for(TagData tag : tags){
- builder.addItem(tag.getTagName(),tag.getQuery(),tag.getValue());
- }
+ if (body instanceof Map) { //Check if we have a Map
+ Map<String, Map<String, Object>> tags = (Map<String, Map<String, Object>>) body;
+ for (Map.Entry<String, Map<String, Object>> entry : tags.entrySet()) {
+ //Tags are stored like this --> Map<Tagname,Map<Query,Value>> for writing
+ String name = entry.getKey();
+ String query = entry.getValue().keySet().iterator().next();
+ Object value = entry.getValue().get(query);
+ builder.addItem(name,query,value);
}
- else {
- throw new PlcInvalidFieldException("Parameter 'tags' has to be a List of TagData");
- }
- }
- else {
- throw new PlcInvalidFieldException("Parameter 'tags' has to be a List");
+ } else {
+ throw new PlcInvalidFieldException("The body must contain a Map<String,Map<String,Object>");
}
+
CompletableFuture<? extends PlcWriteResponse> completableFuture = builder.build().execute();
int currentlyOpenRequests = openRequests.incrementAndGet();
try {
diff --git a/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/TagData.java b/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/TagData.java
index f57774f..c6b5d53 100644
--- a/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/TagData.java
+++ b/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/TagData.java
@@ -18,7 +18,10 @@ under the License.
*/
package org.apache.plc4x.camel;
+import org.slf4j.LoggerFactory;
+
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.function.Predicate;
@@ -114,4 +117,13 @@ public class TagData {
}
+
+ public static Map<String,String> toMap(List<TagData> tags){
+ Map<String,String> map = new HashMap<>();
+ LoggerFactory.getLogger(TagData.class).info("Classloader {} ", Thread.currentThread().getContextClassLoader());
+ for(TagData tag : tags){
+ map.put(tag.getTagName(),tag.getQuery());
+ }
+ return map;
+ }
}
diff --git a/plc4j/integrations/apache-camel/src/test/java/org/apache/plc4x/camel/Plc4XComponentTest.java b/plc4j/integrations/apache-camel/src/test/java/org/apache/plc4x/camel/Plc4XComponentTest.java
index 168e2e5..7d8f78d 100644
--- a/plc4j/integrations/apache-camel/src/test/java/org/apache/plc4x/camel/Plc4XComponentTest.java
+++ b/plc4j/integrations/apache-camel/src/test/java/org/apache/plc4x/camel/Plc4XComponentTest.java
@@ -25,10 +25,7 @@ import org.apache.camel.test.junit5.CamelTestSupport;
import org.apache.plc4x.java.api.model.PlcField;
import org.junit.jupiter.api.Test;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
+import java.util.*;
import java.util.concurrent.TimeUnit;
public class Plc4XComponentTest extends CamelTestSupport {
@@ -49,9 +46,8 @@ public class Plc4XComponentTest extends CamelTestSupport {
protected RouteBuilder createRouteBuilder() {
return new RouteBuilder() {
public void configure() {
- List<TagData> tags = new ArrayList<>();
- tags.add(new TagData("testTagName","testTagAddress"));
- tags.add(new TagData("testTagName2","testTagAddress2"));
+ Map<String,Object> tags = new HashMap<>();
+ tags.put("Test1","%TestQuery");
Plc4XEndpoint producer = getContext().getEndpoint("plc4x:mock:10.10.10.1/1/1", Plc4XEndpoint.class);
producer.setTags(tags);
from("direct:plc4x")
diff --git a/plc4j/karaf-features/camel/pom.xml b/plc4j/karaf-features/camel/pom.xml
index bbedb00..8c17998 100644
--- a/plc4j/karaf-features/camel/pom.xml
+++ b/plc4j/karaf-features/camel/pom.xml
@@ -29,7 +29,7 @@
<modelVersion>4.0.0</modelVersion>
- <artifactId>camel-feature</artifactId>
+ <artifactId>camel-plc4x</artifactId>
<name>PLC4J: Karaf-Features: Camel</name>
<packaging>pom</packaging>
diff --git a/plc4j/tools/scraper/pom.xml b/plc4j/tools/scraper/pom.xml
index c5d1ff4..b577758 100644
--- a/plc4j/tools/scraper/pom.xml
+++ b/plc4j/tools/scraper/pom.xml
@@ -104,18 +104,4 @@
</dependency>
</dependencies>
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-dependency-plugin</artifactId>
- <configuration>
- <usedDependencies combine.children="append">
- <!--usedDependency>org.apache.plc4x:plc4j-driver-s7</usedDependency-->
- </usedDependencies>
- </configuration>
- </plugin>
- </plugins>
- </build>
-
</project>
\ No newline at end of file
diff --git a/plc4j/tools/scraper/src/main/java/org/apache/plc4x/java/scraper/triggeredscraper/triggerhandler/TriggerConfiguration.java b/plc4j/tools/scraper/src/main/java/org/apache/plc4x/java/scraper/triggeredscraper/triggerhandler/TriggerConfiguration.java
index 0f3ddc3..8035270 100644
--- a/plc4j/tools/scraper/src/main/java/org/apache/plc4x/java/scraper/triggeredscraper/triggerhandler/TriggerConfiguration.java
+++ b/plc4j/tools/scraper/src/main/java/org/apache/plc4x/java/scraper/triggeredscraper/triggerhandler/TriggerConfiguration.java
@@ -40,7 +40,6 @@ import java.util.regex.Pattern;
public class TriggerConfiguration{
private static final Logger logger = LoggerFactory.getLogger(TriggerConfiguration.class);
- //private static final String S_7_TRIGGER_VAR = "S7_TRIGGER_VAR";
private static final String TRIGGER = "TRIGGER_VAR";
private static final String SCHEDULED = "SCHEDULED";
private static final String PREVIOUS_DEF = "PREV";
@@ -56,7 +55,7 @@ public class TriggerConfiguration{
private List<TriggerElement> triggerElementList;
/**
- * default constructor when an S7Field should be used for triggering
+ * default constructor when an Field should be used for triggering
* @param triggerType type of trigger from enum
* @param scrapeInterval scrape interval of triggered variable
* @param triggerElementList list of triggerElemts with concat that combined is used as triger
@@ -75,10 +74,10 @@ public class TriggerConfiguration{
String exceptionMessage;
- if(this.triggerType.equals(TriggerType.S7_TRIGGER_VAR) ||this.triggerType.equals(TriggerType.TRIGGER_VAR) ) {
+ if(this.triggerType.equals(TriggerType.TRIGGER_VAR) ) {
//test for valid field-connection string, on exception quit job and return message to user
if(this.triggerElementList.isEmpty()){
- exceptionMessage = String.format("No items in trigger List for trigger-type S7_TRIGGER_VAR for Job %s!", triggeredScrapeJobImpl.getJobName());
+ exceptionMessage = String.format("No items in trigger List for trigger-type TRIGGER_VAR for Job %s!", triggeredScrapeJobImpl.getJobName());
throw new ScraperConfigurationException(exceptionMessage);
}
checkTriggerVarList();
@@ -150,7 +149,7 @@ public class TriggerConfiguration{
/**
* defines the used base type for comparison
* @return the detected base type
- * @throws ScraperException when an unsupported S7-Type is chosen,which is not (yet) implemented for comparison
+ * @throws ScraperException when an unsupported Type is chosen,which is not (yet) implemented for comparison
* ToDo check how to handle time-variables if needed
*/
private static Class<?> validateDataType(PlcField plcField) throws ScraperConfigurationException {
@@ -541,12 +540,11 @@ public class TriggerConfiguration{
this.plcConnectionString = plcConnectionString;
if(triggerStrategy.equals(TRIGGER)){
try {
- //this.plcField = S7Field.of(this.plcFieldString);
this.plcField = prepareField(plcFieldString);
}
catch (Exception e){
if(logger.isDebugEnabled()) {
- logger.debug("Exception occurred parsing a S7Field");
+ logger.debug("Exception occurred parsing a PlcField");
}
throw new ScraperConfigurationException("Exception on parsing S7Field (" + plcField + "): " + e.getMessage());
}
diff --git a/plc4j/tools/scraper/src/test/java/org/apache/plc4x/java/scraper/triggeredscraper/TriggeredScraperImplTest.java b/plc4j/tools/scraper/src/test/java/org/apache/plc4x/java/scraper/triggeredscraper/TriggeredScraperImplTest.java
index a35dd12..691fd7f 100644
--- a/plc4j/tools/scraper/src/test/java/org/apache/plc4x/java/scraper/triggeredscraper/TriggeredScraperImplTest.java
+++ b/plc4j/tools/scraper/src/test/java/org/apache/plc4x/java/scraper/triggeredscraper/TriggeredScraperImplTest.java
@@ -32,6 +32,7 @@ import org.apache.plc4x.java.scraper.triggeredscraper.triggerhandler.collector.T
import org.apache.plc4x.java.scraper.triggeredscraper.triggerhandler.collector.TriggerCollectorImpl;
import org.apache.plc4x.java.spi.messages.utils.ResponseItem;
import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
@@ -73,7 +74,7 @@ public class TriggeredScraperImplTest {
/**
* Test is added because we assume some strange behavior.
*/
- //@Test
+ @Test
public void scrapeMultipleTargets() throws ScraperException, IOException, InterruptedException {
// Prepare the Mocking
// Scrate Jobs 1 and 2
diff --git a/plc4j/tools/scraper/src/test/resources/example_triggered_scraper.yml b/plc4j/tools/scraper/src/test/resources/example_triggered_scraper.yml
index ec79e17..30ab0af 100644
--- a/plc4j/tools/scraper/src/test/resources/example_triggered_scraper.yml
+++ b/plc4j/tools/scraper/src/test/resources/example_triggered_scraper.yml
@@ -29,14 +29,14 @@ jobs:
test1: '%DB810:DBB0:USINT'
- name: triggered-demo-job1
- triggerConfig: (S7_TRIGGER_VAR,10,(%M0.3:BOOL)==(true))
+ triggerConfig: (TRIGGER_VAR,10,(%M0.3:BOOL)==(true))
sources:
- S7_PI
fields:
test1: '%DB810:DBW0:INT'
- name: triggered-demo-job2
- triggerConfig: (S7_TRIGGER_VAR,1000,(%M0.7:BOOL)==(true))
+ triggerConfig: (TRIGGER_VAR,1000,(%M0.7:BOOL)==(true))
sources:
- S7_PI
fields:
@@ -60,14 +60,14 @@ jobs:
- name: triggered-demo-job3-prev_value
- triggerConfig: (S7_TRIGGER_VAR,500,(%M0:USINT)>=(PREV))
+ triggerConfig: (TRIGGER_VAR,500,(%M0:USINT)>=(PREV))
sources:
- S7_PI
fields:
test1: '%DB810:DBW0:INT'
- name: triggered-demo-job4-combinded-condition
- triggerConfig: (S7_TRIGGER_VAR,5,(%M0.1:BOOL)==(true)OR(%M0.2:BOOL)==(true))
+ triggerConfig: (TRIGGER_VAR,5,(%M0.1:BOOL)==(true)OR(%M0.2:BOOL)==(true))
sources:
- S7_PI
fields:
diff --git a/plc4j/tools/scraper/src/test/resources/mock-scraper-config.yml b/plc4j/tools/scraper/src/test/resources/mock-scraper-config.yml
index face235..af9163a 100644
--- a/plc4j/tools/scraper/src/test/resources/mock-scraper-config.yml
+++ b/plc4j/tools/scraper/src/test/resources/mock-scraper-config.yml
@@ -40,7 +40,7 @@ jobs:
- name: triggered-demo-job1
- triggerConfig: (S7_TRIGGER_VAR,10,(%M0.3:BOOL)==(true))
+ triggerConfig: (TRIGGER_VAR,10,(%M0.3:BOOL)==(true))
sources:
- MOCK_1
- MOCK_2
@@ -49,7 +49,7 @@ jobs:
- name: triggered-demo-job2
- triggerConfig: (S7_TRIGGER_VAR,10,(%M0.7:BOOL)==(true))
+ triggerConfig: (TRIGGER_VAR,10,(%M0.7:BOOL)==(true))
sources:
- MOCK_1
- MOCK_2
diff --git a/pom.xml b/pom.xml
index d466ac3..8dadd50 100644
--- a/pom.xml
+++ b/pom.xml
@@ -155,7 +155,7 @@
<pcap4j.version>1.8.2</pcap4j.version>
<scala.version>2.12.6</scala.version>
<slf4j.version>1.7.25</slf4j.version>
- <snakeyaml.version>1.23</snakeyaml.version>
+ <snakeyaml.version>1.24</snakeyaml.version>
<spock-reports.version>1.6.1</spock-reports.version>
<spock.version>1.2-groovy-2.5</spock.version>
<t-digest.version>3.2</t-digest.version>