You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2022/05/08 09:08:35 UTC

[camel] 02/02: CAMEL-18080: camel-jbang - Run from clipboard

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

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git

commit cfeffd58405740f74e646424eb13dd42163c723c
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sun May 8 11:08:11 2022 +0200

    CAMEL-18080: camel-jbang - Run from clipboard
---
 .../modules/ROOT/pages/camel-jbang.adoc            | 31 ++++++++++++++++++++++
 .../apache/camel/dsl/jbang/core/commands/Run.java  | 23 +++++++++++++---
 2 files changed, 51 insertions(+), 3 deletions(-)

diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc b/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
index 0d8914836f6..6023ffd6d22 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
@@ -268,6 +268,37 @@ Can be run with camel:
 camel run joke.yaml
 ----
 
+=== Run from clipboard
+
+You can also run Camel routes directly from the OS clipboard. This allows to copy some code,
+and then quickly run this.
+
+The syntax is
+
+[source,bash]
+----
+camel run clipboard.<extension>
+----
+
+Where `<extension>` is what kind of file the content of the clipboard is, such as `java`, `xml`, or `yaml` etc.
+
+For example. you can copy this to your clipboard and then run it afterwards:
+
+[source,xml]
+----
+<route>
+  <from uri="timer:foo"/>
+  <log message="Hello World"/>
+</route>
+----
+
+[source,bash]
+----
+camel run clipboard.xml
+----
+
+
+
 === Using platform-http component
 
 When a route is started from `platform-http` then CamelJBang will automatically include a VertX HTTP server
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
index 3b9e035bae4..6b3bb801cc6 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
@@ -16,6 +16,9 @@
  */
 package org.apache.camel.dsl.jbang.core.commands;
 
+import java.awt.*;
+import java.awt.datatransfer.Clipboard;
+import java.awt.datatransfer.DataFlavor;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
@@ -73,6 +76,7 @@ class Run implements Callable<Integer> {
             = new String[] { "properties", "java", "groovy", "js", "jsh", "kts", "xml", "yaml" };
 
     private static final String OPENAPI_GENERATED_FILE = ".camel-jbang/generated-openapi.yaml";
+    private static final String CLIPBOARD_GENERATED_FILE = ".camel-jbang/generated-clipboard";
 
     private CamelContext context;
     private File lockFile;
@@ -382,10 +386,23 @@ class Run implements Callable<Integer> {
         if (files != null) {
             for (String file : files) {
 
-                if (skipFile(file)) {
+                if (file.startsWith("clipboard")) {
+                    // run from clipboard
+                    String ext = FileUtil.onlyExt(file, true);
+                    if (ext == null || ext.isEmpty()) {
+                        throw new IllegalArgumentException(
+                                "When running from clipboard, an extension is required to let Camel know what kind of file to use");
+                    }
+                    Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
+                    Object t = c.getData(DataFlavor.stringFlavor);
+                    if (t != null) {
+                        String fn = CLIPBOARD_GENERATED_FILE + "." + ext;
+                        Files.write(Paths.get(fn), t.toString().getBytes(StandardCharsets.UTF_8));
+                        file = "file:" + fn;
+                    }
+                } else if (skipFile(file)) {
                     continue;
-                }
-                if (!knownFile(file)) {
+                } else if (!knownFile(file)) {
                     // non known files to be added on classpath
                     sjClasspathFiles.add(file);
                     continue;