You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by GitBox <gi...@apache.org> on 2022/10/24 13:13:50 UTC

[GitHub] [camel] orpiske commented on a diff in pull request #8617: add camel-casper component

orpiske commented on code in PR #8617:
URL: https://github.com/apache/camel/pull/8617#discussion_r1003282129


##########
components/camel-casper/pom.xml:
##########
@@ -0,0 +1,383 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+	<modelVersion>4.0.0</modelVersion>
+
+   <parent>
+        <groupId>org.apache.camel</groupId>
+        <artifactId>components</artifactId>
+        <version>3.20.0-SNAPSHOT</version>
+    </parent>
+
+
+<artifactId>camel-casper</artifactId>
+    <packaging>jar</packaging>
+
+    <name>Camel :: Casper</name>
+    <description>Camel Casper blockchaine component</description>
+	<url>https://casperlabs.io/</url>
+
+
+	<properties>
+		<compiler.source>1.8</compiler.source>
+		<compiler.target>1.8</compiler.target>
+		<maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version>
+		<maven-resources-plugin.version>3.2.0</maven-resources-plugin.version>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+		<log4j2.version>2.13.3</log4j2.version>
+		<camel.version>3.14.2</camel.version>
+		<casper-java-sdk.version>0.3.0</casper-java-sdk.version>
+		<junit.version>4.13.2</junit.version>
+		<launchdarkly.version>2.3.2</launchdarkly.version>
+		<!-- SSE tests-->
+		<tomcat.version>9.0.54</tomcat.version>
+	</properties>
+
+	<licenses>
+		<license>
+			<name>MIT License</name>
+			<url>http://www.opensource.org/licenses/mit-license.php</url>
+		</license>
+	</licenses>

Review Comment:
   I think this is not correct/acceptable, though - in theory - it is a compatible license. 
   
   Waiting for others to comment on this one ...



##########
components/camel-casper/pom.xml:
##########
@@ -0,0 +1,383 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+	<modelVersion>4.0.0</modelVersion>
+
+   <parent>
+        <groupId>org.apache.camel</groupId>
+        <artifactId>components</artifactId>
+        <version>3.20.0-SNAPSHOT</version>
+    </parent>
+
+
+<artifactId>camel-casper</artifactId>
+    <packaging>jar</packaging>
+
+    <name>Camel :: Casper</name>
+    <description>Camel Casper blockchaine component</description>
+	<url>https://casperlabs.io/</url>
+
+
+	<properties>
+		<compiler.source>1.8</compiler.source>
+		<compiler.target>1.8</compiler.target>
+		<maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version>
+		<maven-resources-plugin.version>3.2.0</maven-resources-plugin.version>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+		<log4j2.version>2.13.3</log4j2.version>
+		<camel.version>3.14.2</camel.version>
+		<casper-java-sdk.version>0.3.0</casper-java-sdk.version>
+		<junit.version>4.13.2</junit.version>
+		<launchdarkly.version>2.3.2</launchdarkly.version>
+		<!-- SSE tests-->
+		<tomcat.version>9.0.54</tomcat.version>
+	</properties>
+
+	<licenses>
+		<license>
+			<name>MIT License</name>
+			<url>http://www.opensource.org/licenses/mit-license.php</url>
+		</license>
+	</licenses>
+
+	<developers>
+		<developer>
+			<id>mabahma</id>
+			<name>mabahma</name>
+			<email>elmabahma@gmail.com</email>
+		</developer>
+		
+	</developers>
+	<scm>
+		<connection>scm:git:git@github.com:abahmanem/camel-casper.git</connection>
+		<developerConnection>scm:git:git@github.com:abahmanem/camel-casper.git</developerConnection>
+		<url>https://github.com/abahmanem/camel-casper</url>
+	</scm>
+
+
+	<dependencyManagement>
+		<dependencies>
+			<dependency>
+				<groupId>org.apache.camel</groupId>
+				<artifactId>camel-bom</artifactId>
+				<version>${camel.version}</version>
+				<scope>import</scope>
+				<type>pom</type>
+			</dependency>
+		</dependencies>
+	</dependencyManagement>
+
+	<dependencies>
+
+		<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
+		<dependency>
+			<groupId>org.apache.commons</groupId>
+			<artifactId>commons-lang3</artifactId>
+			<version>3.11</version>
+		</dependency>
+		<!-- https://mvnrepository.com/artifact/commons-cli/commons-cli -->
+		<dependency>
+			<groupId>commons-cli</groupId>
+			<artifactId>commons-cli</artifactId>
+			<version>1.4</version>

Review Comment:
   If possible / compatible should use `${commons-cli-version}` to be aligned with the rest of the code base.
   
   



##########
components/camel-casper/pom.xml:
##########
@@ -0,0 +1,383 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+	<modelVersion>4.0.0</modelVersion>
+
+   <parent>
+        <groupId>org.apache.camel</groupId>
+        <artifactId>components</artifactId>
+        <version>3.20.0-SNAPSHOT</version>
+    </parent>
+
+
+<artifactId>camel-casper</artifactId>
+    <packaging>jar</packaging>
+
+    <name>Camel :: Casper</name>
+    <description>Camel Casper blockchaine component</description>
+	<url>https://casperlabs.io/</url>
+
+
+	<properties>
+		<compiler.source>1.8</compiler.source>
+		<compiler.target>1.8</compiler.target>
+		<maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version>
+		<maven-resources-plugin.version>3.2.0</maven-resources-plugin.version>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+		<log4j2.version>2.13.3</log4j2.version>
+		<camel.version>3.14.2</camel.version>
+		<casper-java-sdk.version>0.3.0</casper-java-sdk.version>
+		<junit.version>4.13.2</junit.version>
+		<launchdarkly.version>2.3.2</launchdarkly.version>
+		<!-- SSE tests-->
+		<tomcat.version>9.0.54</tomcat.version>
+	</properties>
+
+	<licenses>
+		<license>
+			<name>MIT License</name>
+			<url>http://www.opensource.org/licenses/mit-license.php</url>
+		</license>
+	</licenses>
+
+	<developers>
+		<developer>
+			<id>mabahma</id>
+			<name>mabahma</name>
+			<email>elmabahma@gmail.com</email>
+		</developer>
+		
+	</developers>
+	<scm>
+		<connection>scm:git:git@github.com:abahmanem/camel-casper.git</connection>
+		<developerConnection>scm:git:git@github.com:abahmanem/camel-casper.git</developerConnection>
+		<url>https://github.com/abahmanem/camel-casper</url>
+	</scm>
+
+
+	<dependencyManagement>
+		<dependencies>
+			<dependency>
+				<groupId>org.apache.camel</groupId>
+				<artifactId>camel-bom</artifactId>
+				<version>${camel.version}</version>
+				<scope>import</scope>
+				<type>pom</type>
+			</dependency>
+		</dependencies>
+	</dependencyManagement>
+
+	<dependencies>
+
+		<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
+		<dependency>
+			<groupId>org.apache.commons</groupId>
+			<artifactId>commons-lang3</artifactId>
+			<version>3.11</version>
+		</dependency>
+		<!-- https://mvnrepository.com/artifact/commons-cli/commons-cli -->
+		<dependency>
+			<groupId>commons-cli</groupId>
+			<artifactId>commons-cli</artifactId>
+			<version>1.4</version>
+		</dependency>
+
+		<!--//////////////////////////////////// Camel dependencies //////////////////////////////////// -->
+
+		<dependency>
+			<groupId>org.apache.camel</groupId>
+			<artifactId>camel-jackson</artifactId>
+			<version>${camel.version}</version>
+
+		</dependency>
+		<dependency>
+			<groupId>org.apache.camel</groupId>
+			<artifactId>camel-core</artifactId>
+			<version>${camel.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.camel</groupId>
+			<artifactId>camel-main</artifactId>
+			<version>${camel.version}</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.apache.camel</groupId>
+			<artifactId>camel-jsonpath</artifactId>
+			<version>${camel.version}</version>
+		</dependency>
+
+
+		<dependency>
+			<groupId>org.json</groupId>
+			<artifactId>json</artifactId>
+			<version>20211205</version>

Review Comment:
   Versions should preferably be added to the parent and camel-dependencies pom for easier management on our side.



##########
components/camel-casper/pom.xml:
##########
@@ -0,0 +1,383 @@
+<?xml version="1.0" encoding="UTF-8"?>

Review Comment:
   Missing license header.



##########
components/camel-casper/src/main/java/org/apache/camel/component/casper/CasperEventHandler.java:
##########
@@ -0,0 +1,134 @@
+package org.apache.camel.component.casper;
+
+import org.apache.camel.Exchange;
+import org.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.launchdarkly.eventsource.EventHandler;
+import com.launchdarkly.eventsource.MessageEvent;
+
+/**
+ * Event handler for the consumer
+ * 
+ * @author mabahma
+ *
+ */
+public class CasperEventHandler implements EventHandler {
+
+	public static final Logger logger = LoggerFactory.getLogger(CasperEventHandler.class);
+	private final CasperConsumer consumer;
+	private final CasperEndPoint endpoint;
+
+	public CasperEventHandler(CasperConsumer consumer) {
+		super();
+		this.consumer = consumer;
+		this.endpoint = this.consumer.getEndpoint();
+	}
+
+	@Override
+	public void onOpen() throws Exception {
+		logger.info("The event stream has been opened");
+	}
+
+	@Override
+	public void onClosed() throws Exception {
+		logger.info("The event stream has been closed");
+	}
+
+	/**
+	 * 
+	 */
+	@Override
+	public void onMessage(String evt, MessageEvent messageEvent) throws Exception {
+		JSONObject json = new JSONObject(messageEvent.getData());
+		String firstJsonPropertyKey = "";
+
+		if (json.keys().hasNext())
+			firstJsonPropertyKey = json.keys().next();

Review Comment:
   Please use `{` and `}` for code blocks to comply with our coding standards defined in our checkstyle.



##########
components/camel-casper/src/test/java/org/apache/camel/component/casper/producer/CasperProducerWith_BLOCK_TRANSFERS_OperationTest.java:
##########
@@ -0,0 +1,70 @@
+package org.apache.camel.component.casper.producer;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.util.List;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Produce;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.casper.CasperConstants;
+import org.apache.camel.component.casper.CasperTestSupport;
+import org.junit.jupiter.api.Test;
+
+import com.syntifi.casper.sdk.model.deploy.executabledeploy.Transfer;
+
+@SuppressWarnings("unchecked")
+class CasperProducerWith_BLOCK_TRANSFERS_OperationTest extends CasperTestSupport {
+	@Produce("direct:start")
+	protected ProducerTemplate template;
+
+	@Override
+	public boolean isUseAdviceWith() {
+		return false;
+	}
+
+	@Test
+	void testCallWithout_parameters() throws Exception {
+		Exchange exchange = createExchangeWithBodyAndHeader(null, CasperConstants.OPERATION, CasperConstants.BLOCK_TRANSFERS);
+		template.send(exchange);
+		Object body = exchange.getIn().getBody();
+		// assert Object is a List
+		assertTrue(body instanceof List);

Review Comment:
   I think you can use something like `assertIsInstance` (or a similar one) for this check. 



##########
components/camel-casper/src/main/java/org/apache/camel/component/casper/examples/DemoApp.java:
##########
@@ -0,0 +1,201 @@
+package org.apache.camel.component.casper.examples;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.casper.CasperConstants;
+import org.apache.camel.component.jackson.JacksonDataFormat;
+import org.apache.camel.impl.DefaultCamelContext;
+
+import com.syntifi.casper.sdk.model.auction.AuctionState;
+import com.syntifi.casper.sdk.model.balance.BalanceData;
+import com.syntifi.casper.sdk.model.block.JsonBlock;
+import com.syntifi.casper.sdk.model.era.JsonEraValidators;
+import com.syntifi.casper.sdk.model.stateroothash.StateRootHashData;
+
+/**
+ * Demo Class loading Casper components example routes  
+ * @author p35862
+ *
+ */
+
+@SuppressWarnings("deprecation")
+public class DemoApp {
+
+	/**
+	 * loads route 1
+	 * @param cntxt : Camel context
+	 * @param temp : producerTemplate
+	 * @throws Exception : exception
+	 */
+	private static void loadroute1(CamelContext cntxt, ProducerTemplate temp) throws Exception {
+		cntxt.addRoutes(new RouteBuilder() {
+			public void configure() throws Exception {
+				from("direct:" + CasperConstants.STATE_ROOT_HASH).routeId("STATE_ROOT_HASH")
+						.to("casper:http://65.21.227.180:7777/?operation=" + CasperConstants.STATE_ROOT_HASH)
+						.process(new Processor() {
+
+							@Override
+							public void process(Exchange exchange) throws Exception {
+								StateRootHashData state = (StateRootHashData) exchange.getIn().getBody();
+								System.err.println("* Current STATE_ROOT_HASH is : " + state.getStateRootHash());
+							}
+						});
+			}
+		});
+
+		cntxt.start();
+		temp.sendBody("direct:" + CasperConstants.STATE_ROOT_HASH, "This is a test message");
+		cntxt.stop();
+
+	}
+
+	/**
+	 * loads route 2
+	 * @param cntxt : Camel context
+	 * @param temp : producerTemplate
+	 * @throws Exception : exception
+	 */
+	private static void loadroute2(CamelContext cntxt, ProducerTemplate temp) throws Exception {
+		cntxt.addRoutes(new RouteBuilder() {
+			public void configure() throws Exception {
+				from("file:src/main/resources/datas/?fileName=get_block.txt&charset=utf-8&noop=true")
+						.convertBodyTo(String.class).routeId(CasperConstants.BLOCK).setHeader("BLOCK_HASH", body())
+						.to("casper:http://65.21.227.180:7777/?operation=" + CasperConstants.BLOCK)
+
+						.process(new Processor() {
+
+							@Override
+							public void process(Exchange exchange) throws Exception {
+								JsonBlock block = (JsonBlock) exchange.getIn().getBody();
+								String blockHash = (String) exchange.getIn().getHeader("BLOCK_HASH");
+								System.err.println("* getBlock was called with parameter block Hash = " + blockHash);
+								System.err.println("* getBlock retrieved a block that was minted at era ="
+										+ block.getHeader().getEraId() + " and has as parent hash = "
+										+ block.getHeader().getParentHash());
+
+							}
+						});
+
+			}
+
+		});
+
+		cntxt.start();
+		Thread.sleep(5000);

Review Comment:
   Please avoid using `Thread.sleep` as much as possible. Instead, please try to replace the code with Awaitility or, in case of synchronization / concurrency, latches and other concurrency handling mechanisms.



##########
components/camel-casper/src/main/java/org/apache/camel/component/casper/CasperConsumer.java:
##########
@@ -0,0 +1,78 @@
+package org.apache.camel.component.casper;
+
+import java.net.URI;
+import java.time.Duration;
+import java.util.concurrent.CountDownLatch;
+
+import org.apache.camel.Processor;
+import org.apache.camel.ShutdownRunningTask;
+import org.apache.camel.Suspendable;
+import org.apache.camel.spi.ShutdownAware;
+import org.apache.camel.support.DefaultConsumer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.launchdarkly.eventsource.EventHandler;
+import com.launchdarkly.eventsource.EventSource;
+
+/**
+ * Camel CasperComsumer Component
+ * 
+ * @author mabahma
+ *
+ */
+
+public class CasperConsumer extends DefaultConsumer implements ShutdownAware, Suspendable {
+	public static final Logger logger = LoggerFactory.getLogger(CasperConsumer.class);

Review Comment:
   Checkstyle will catch this, but as a general comment: the `logger` variable needs to comply with the naming standards defined in our checkstyle rules. As such, I suggest naming it as `LOG`. 



##########
components/camel-casper/src/main/java/org/apache/camel/component/casper/examples/CasperProcessor.java:
##########
@@ -0,0 +1,27 @@
+package org.apache.camel.component.casper.examples;
+
+import java.util.Map;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+
+/**
+ * Camel processor for Demo
+ * 
+ * @author p35862
+ *
+ */
+public class CasperProcessor implements Processor {
+
+	@Override
+	public void process(Exchange exchange) throws Exception {
+
+		Map<String, Object> map = exchange.getMessage().getHeaders();
+
+		for (String key : map.keySet()) {
+			System.out.println(key + ":" + map.get(key));

Review Comment:
   This output should go to a logger. 



##########
components/camel-casper/pom.xml:
##########
@@ -0,0 +1,383 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+	<modelVersion>4.0.0</modelVersion>
+
+   <parent>
+        <groupId>org.apache.camel</groupId>
+        <artifactId>components</artifactId>
+        <version>3.20.0-SNAPSHOT</version>
+    </parent>
+
+
+<artifactId>camel-casper</artifactId>
+    <packaging>jar</packaging>
+
+    <name>Camel :: Casper</name>
+    <description>Camel Casper blockchaine component</description>
+	<url>https://casperlabs.io/</url>
+
+
+	<properties>
+		<compiler.source>1.8</compiler.source>
+		<compiler.target>1.8</compiler.target>
+		<maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version>
+		<maven-resources-plugin.version>3.2.0</maven-resources-plugin.version>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+		<log4j2.version>2.13.3</log4j2.version>
+		<camel.version>3.14.2</camel.version>
+		<casper-java-sdk.version>0.3.0</casper-java-sdk.version>
+		<junit.version>4.13.2</junit.version>
+		<launchdarkly.version>2.3.2</launchdarkly.version>
+		<!-- SSE tests-->
+		<tomcat.version>9.0.54</tomcat.version>
+	</properties>
+
+	<licenses>
+		<license>
+			<name>MIT License</name>
+			<url>http://www.opensource.org/licenses/mit-license.php</url>
+		</license>
+	</licenses>
+
+	<developers>
+		<developer>
+			<id>mabahma</id>
+			<name>mabahma</name>
+			<email>elmabahma@gmail.com</email>
+		</developer>
+		
+	</developers>
+	<scm>
+		<connection>scm:git:git@github.com:abahmanem/camel-casper.git</connection>
+		<developerConnection>scm:git:git@github.com:abahmanem/camel-casper.git</developerConnection>
+		<url>https://github.com/abahmanem/camel-casper</url>
+	</scm>
+
+
+	<dependencyManagement>
+		<dependencies>
+			<dependency>
+				<groupId>org.apache.camel</groupId>
+				<artifactId>camel-bom</artifactId>
+				<version>${camel.version}</version>
+				<scope>import</scope>
+				<type>pom</type>
+			</dependency>
+		</dependencies>
+	</dependencyManagement>
+
+	<dependencies>
+
+		<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
+		<dependency>
+			<groupId>org.apache.commons</groupId>
+			<artifactId>commons-lang3</artifactId>
+			<version>3.11</version>

Review Comment:
   If possible / compatible should use `${commons-lang3-version}` to be aligned with the rest of the code base.



##########
components/camel-casper/pom.xml:
##########
@@ -0,0 +1,383 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+	<modelVersion>4.0.0</modelVersion>
+
+   <parent>
+        <groupId>org.apache.camel</groupId>
+        <artifactId>components</artifactId>
+        <version>3.20.0-SNAPSHOT</version>
+    </parent>
+
+
+<artifactId>camel-casper</artifactId>
+    <packaging>jar</packaging>
+
+    <name>Camel :: Casper</name>
+    <description>Camel Casper blockchaine component</description>
+	<url>https://casperlabs.io/</url>
+
+
+	<properties>
+		<compiler.source>1.8</compiler.source>
+		<compiler.target>1.8</compiler.target>
+		<maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version>
+		<maven-resources-plugin.version>3.2.0</maven-resources-plugin.version>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+		<log4j2.version>2.13.3</log4j2.version>
+		<camel.version>3.14.2</camel.version>
+		<casper-java-sdk.version>0.3.0</casper-java-sdk.version>
+		<junit.version>4.13.2</junit.version>
+		<launchdarkly.version>2.3.2</launchdarkly.version>
+		<!-- SSE tests-->
+		<tomcat.version>9.0.54</tomcat.version>
+	</properties>
+
+	<licenses>
+		<license>
+			<name>MIT License</name>
+			<url>http://www.opensource.org/licenses/mit-license.php</url>
+		</license>
+	</licenses>
+
+	<developers>
+		<developer>
+			<id>mabahma</id>
+			<name>mabahma</name>
+			<email>elmabahma@gmail.com</email>
+		</developer>
+		
+	</developers>
+	<scm>
+		<connection>scm:git:git@github.com:abahmanem/camel-casper.git</connection>
+		<developerConnection>scm:git:git@github.com:abahmanem/camel-casper.git</developerConnection>
+		<url>https://github.com/abahmanem/camel-casper</url>
+	</scm>

Review Comment:
   This is incorrect, as it is referring to an external project that is not Apache Camel.



##########
components/camel-casper/src/main/java/org/apache/camel/component/casper/CasperComponent.java:
##########
@@ -0,0 +1,44 @@
+package org.apache.camel.component.casper;

Review Comment:
   Missing license header.



##########
components/camel-casper/src/main/docs/casper-component.adoc:
##########
@@ -0,0 +1,64 @@
+= Casper Camel Connector Component
+:doctitle: Casper Camel Connector
+:shortname: casper
+:artifactid: camel-casper
+:description: Camel casper endpoint : to interract with Casper nodes
+:since: 3.14.2

Review Comment:
   Should be 3.20.0.



##########
components/camel-casper/src/test/java/org/apache/camel/component/casper/producer/CasperProducerWith_ACCOUNT_BALANCE_OperationTest.java:
##########
@@ -0,0 +1,100 @@
+package org.apache.camel.component.casper.producer;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.math.BigInteger;
+
+import org.apache.camel.CamelExchangeException;
+import org.apache.camel.Exchange;
+import org.apache.camel.Produce;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.casper.CasperConstants;
+import org.apache.camel.component.casper.CasperTestSupport;
+import org.apache.commons.cli.MissingArgumentException;
+import org.junit.jupiter.api.Test;
+
+import com.syntifi.casper.sdk.model.balance.BalanceData;
+
+class CasperProducerWith_ACCOUNT_BALANCE_OperationTest extends CasperTestSupport {
+	@Produce("direct:start")
+	protected ProducerTemplate template;
+
+	@Override
+	public boolean isUseAdviceWith() {
+		return false;
+	}
+
+
+	@Test
+	void testCallWith_STATE_ROOT_HASH_KEY_Parameters() throws Exception {
+
+		Exchange exchange = createExchangeWithBodyAndHeader(null, CasperConstants.OPERATION, CasperConstants.ACCOUNT_BALANCE);
+		exchange.getIn().setHeader(CasperConstants.STATE_ROOT_HASH,
+				"30cE5146268305AeeFdCC05a5f7bE7aa6dAF187937Eed9BB55Af90e1D49B7956");
+		exchange.getIn().setHeader(CasperConstants.PURSE_UREF,
+				"uref-9cC68775d07c211e44068D5dCc2cC28A67Cb582C3e239E83Bb0c3d067C4D0363-007");
+		template.send(exchange);
+		Object body = exchange.getIn().getBody();
+		// assert Object is a BalanceData
+		assertTrue(body instanceof BalanceData);
+		BalanceData balance = (BalanceData) body;
+		assertNotNull(balance);
+		//assert balance value
+		assertEquals(new BigInteger("869077209920") , balance.getValue());
+	}
+
+
+	@Test
+	 void testCallWithout_UREF_PURSE_KEY_Parameter() throws Exception {
+
+		Exchange exchange = createExchangeWithBodyAndHeader(null, CasperConstants.OPERATION, CasperConstants.ACCOUNT_BALANCE);
+		exchange.getIn().setHeader(CasperConstants.STATE_ROOT_HASH,
+				"30cE5146268305AeeFdCC05a5f7bE7aa6dAF187937Eed9BB55Af90e1D49B7956");
+		template.send(exchange);
+		Exception exception = exchange.getException();
+		assertTrue(exception instanceof CamelExchangeException);
+		String expectedMessage = "purseUref parameter is required   with endpoint operation " + CasperConstants.ACCOUNT_BALANCE;
+		String actualMessage = exception.getMessage();
+
+		// assert Exception message
+		assertTrue(actualMessage.contains(expectedMessage));
+		// Cause
+		Object cause = exchange.getMessage().getHeader(CasperConstants.ERROR_CAUSE);
+		assertTrue(cause instanceof MissingArgumentException);
+	}
+
+
+	@Test
+	 void testCallWithout_STATE_ROOT_HASH_Parameter() throws Exception {
+
+		Exchange exchange = createExchangeWithBodyAndHeader(null, CasperConstants.OPERATION, CasperConstants.ACCOUNT_BALANCE);
+		exchange.getIn().setHeader(CasperConstants.PURSE_UREF,
+				"uref-9cC68775d07c211e44068D5dCc2cC28A67Cb582C3e239E83Bb0c3d067C4D0363-007");
+
+		template.send(exchange);
+		Exception exception = exchange.getException();
+		assertTrue(exception instanceof CamelExchangeException);
+		String expectedMessage = "stateRootHash parameter is required   with endpoint operation " + CasperConstants.ACCOUNT_BALANCE;
+		String actualMessage = exception.getMessage();
+
+		// assert Exception message
+		System.err.println(actualMessage+  "  "+expectedMessage.toLowerCase());

Review Comment:
   Output in tests should also go to a logger.



##########
components/camel-casper/src/test/java/org/apache/camel/component/casper/producer/CasperProducerWith_NETWORK_PEERS_OperationTest.java:
##########
@@ -0,0 +1,50 @@
+package org.apache.camel.component.casper.producer;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import java.util.List;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Produce;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.casper.CasperConstants;
+import org.apache.camel.component.casper.CasperTestSupport;
+import org.junit.jupiter.api.Test;
+
+import com.syntifi.casper.sdk.model.peer.PeerEntry;
+
+@SuppressWarnings("unchecked")
+class CasperProducerWith_NETWORK_PEERS_OperationTest extends CasperTestSupport {
+	@Produce("direct:start")
+	protected ProducerTemplate template;
+
+	@Override
+	public boolean isUseAdviceWith() {
+		return false;
+	}
+
+	@Test
+	void testCall() throws Exception {
+		Exchange exchange = createExchangeWithBodyAndHeader(null, CasperConstants.OPERATION, CasperConstants.NETWORK_PEERS);
+		template.send(exchange);
+		Object body = exchange.getIn().getBody();
+		// assert Object is a List
+		assertTrue(body instanceof List);
+		List<PeerEntry> peers = (List<PeerEntry>) (body);
+		assertTrue(!peers.isEmpty());
+		// assert our List contains our node
+		//URI ourTestNode = new URI(CasperConstants.TESTNET_NODE_URL);
+		// assertTrue(peers.stream().anyMatch(s ->
+		// s.getAddress().substring(s.getAddress().indexOf(":")).equals(ourTestnode.getHost())));

Review Comment:
   Commented code should be removed. 



##########
components/camel-casper/src/test/java/org/apache/camel/component/casper/consumer/sse/DataSetController.java:
##########
@@ -0,0 +1,144 @@
+package org.apache.camel.component.casper.consumer.sse;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+import org.apache.camel.component.casper.consumer.sse.model.block.BlockData;
+import org.apache.camel.component.casper.consumer.sse.model.deploy.accepted.DeployAcceptedData;
+import org.apache.camel.component.casper.consumer.sse.model.deploy.expired.DeployExpiredData;
+import org.apache.camel.component.casper.consumer.sse.model.deploy.processed.DeployProcessedData;
+import org.apache.camel.component.casper.consumer.sse.model.fault.FaultData;
+import org.apache.camel.component.casper.consumer.sse.model.sig.FinalitySignatureData;
+import org.apache.camel.component.casper.consumer.sse.model.step.StepData;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+/**
+ * MVC Controler with casper sse channels
+ * 
+ * @author p35862
+ *
+ */
+@RestController
+public class DataSetController {
+
+	private final DataSetService dataSetService;
+	ObjectMapper objectMapper = new ObjectMapper();
+
+	public DataSetController(DataSetService dataSetService) {
+		this.dataSetService = dataSetService;
+	}
+
+	@GetMapping("/events/main")
+	public SseEmitter fetchmain() {
+		SseEmitter emitter = new SseEmitter(6000l);
+
+		ExecutorService executor = Executors.newSingleThreadExecutor();
+		executor.execute(() -> {
+			List<BlockData> dataSets = dataSetService.getBlocks();
+			try {
+
+				// emit added blocks events
+				for (BlockData dataSet : dataSets) {
+					randomDelay();
+					emitter.send(objectMapper.writeValueAsString(dataSet));
+				}
+
+				// emit processed deploys events
+				List<DeployProcessedData> datas = dataSetService.getProcessedDeploys();
+				for (DeployProcessedData dat : datas) {
+					randomDelay();
+					emitter.send(objectMapper.writeValueAsString(dat));
+
+				}
+
+				// emit steps events
+				List<StepData> steps = dataSetService.getSteps();
+				for (StepData step : steps) {
+					randomDelay();
+					emitter.send(objectMapper.writeValueAsString(step));
+				}
+
+				// emit fault events
+				List<FaultData> faults = dataSetService.getFaults();
+				for (FaultData fault : faults) {
+					randomDelay();
+					emitter.send(objectMapper.writeValueAsString(fault));
+				}
+
+				List<DeployExpiredData> expireds = dataSetService.getDeploysExpired();
+				// emit expired deploys events
+				for (DeployExpiredData exp : expireds) {
+					randomDelay();
+					emitter.send(objectMapper.writeValueAsString(exp));
+				}
+
+				emitter.complete();
+			} catch (IOException e) {
+				emitter.completeWithError(e);
+			}
+		});
+		executor.shutdown();
+		return emitter;
+	}
+
+	@GetMapping("/events/deploys")
+	public SseEmitter fetchdeploys() {
+		SseEmitter emitter = new SseEmitter(5000l);
+
+		ExecutorService executor = Executors.newSingleThreadExecutor();
+		executor.execute(() -> {
+			List<DeployAcceptedData> dataSets = dataSetService.getAcceptedDeploys();
+			try {
+
+				// emit accepetd deploys events
+				for (DeployAcceptedData dataSet : dataSets) {
+					randomDelay();
+					emitter.send(objectMapper.writeValueAsString(dataSet));
+				}
+
+				emitter.complete();
+			} catch (IOException e) {
+				emitter.completeWithError(e);
+			}
+		});
+		executor.shutdown();
+
+		return emitter;
+	}
+
+	@GetMapping("/events/sigs")
+	public SseEmitter fetchsigs() {
+		SseEmitter emitter = new SseEmitter(5000l);
+		// emit finality signatures events
+		ExecutorService executor = Executors.newSingleThreadExecutor();
+		executor.execute(() -> {
+			List<FinalitySignatureData> dataSets = dataSetService.getFinalitySignatures();
+			try {
+				for (FinalitySignatureData dataSet : dataSets) {
+					randomDelay();
+					emitter.send(dataSet);
+				}
+
+				emitter.complete();
+			} catch (IOException e) {
+				emitter.completeWithError(e);
+			}
+		});
+		executor.shutdown();
+		return emitter;
+	}
+
+	private void randomDelay() {
+		try {
+			Thread.sleep(0);

Review Comment:
   Please avoid using `Thread.sleep` as much as possible. Instead, please try to replace the code with Awaitility or, in case of synchronization / concurrency, latches and other concurrency handling mechanisms.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org