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

nferraro pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel-k.git


The following commit(s) were added to refs/heads/master by this push:
     new 8ce6226  add support for non java integrations
8ce6226 is described below

commit 8ce62264d701cf7249d34c9d09e7f1468a2203c6
Author: lburgazzoli <lburgazz...@gmail.com>
AuthorDate: Tue Sep 11 23:54:46 2018 +0200

    add support for non java integrations
---
 README.md                                          | 10 +++++--
 pkg/apis/camel/v1alpha1/types.go                   |  4 ++-
 pkg/apis/camel/v1alpha1/zz_generated.deepcopy.go   |  9 ++++--
 pkg/build/api/types.go                             |  7 ++++-
 pkg/build/build_manager_integration_test.go        | 13 ++++++---
 pkg/build/local/local_builder.go                   |  6 ++--
 pkg/build/local/local_builder_integration_test.go  | 19 ++++++++----
 pkg/client/cmd/run.go                              | 10 ++++++-
 pkg/stub/action/integration/build.go               |  5 +++-
 pkg/util/digest/digest.go                          |  9 +++---
 pkg/util/maven/maven.go                            | 27 +++++++++++++++++
 pkg/util/maven/mavent_test.go                      | 33 +++++++++++++++++++++
 pkg/util/maven/types.go                            | 18 ++++++++++--
 Sample.java => runtime/examples/Sample.java        |  6 +---
 runtime/examples/routes.js                         | 34 ++++++++++++++++++++++
 .../java/org/apache/camel/k/jvm/RouteLoaders.java  | 11 ++++---
 .../org/apache/camel/k/jvm/RouteLoadersTest.java   |  6 ++--
 17 files changed, 189 insertions(+), 38 deletions(-)

diff --git a/README.md b/README.md
index 7d9b496..228ef59 100644
--- a/README.md
+++ b/README.md
@@ -55,10 +55,16 @@ For Minishift, this means executing `oc login -u 
system:admin` then `kamel insta
 After the initial setup, you can run a Camel integration on the cluster 
executing:
 
 ```
-kamel run Sample.java
+kamel run runtime/examples/Sample.java
 ```
 
-A "Sample.java" file is included in the root of this repository. You can 
change the content of the file and execute the command again to see the changes.
+A "Sample.java" file is included in the folder runtime/examples of this 
repository. You can change the content of the file and execute the command 
again to see the changes.
+
+A JavaScript integration has also been provided as example, to run it:
+
+```
+kamel run runtime/examples/routes.js
+```
 
 ### Monitoring the Status
 
diff --git a/pkg/apis/camel/v1alpha1/types.go b/pkg/apis/camel/v1alpha1/types.go
index efdd022..324d056 100644
--- a/pkg/apis/camel/v1alpha1/types.go
+++ b/pkg/apis/camel/v1alpha1/types.go
@@ -45,7 +45,9 @@ type IntegrationSpec struct {
 }
 
 type SourceSpec struct {
-       Code *string `json:"code,omitempty"`
+       Name     *string `json:"name,omitempty"`
+       Content  *string `json:"content,omitempty"`
+       Language *string `json:"language,omitempty"`
 }
 
 type IntegrationStatus struct {
diff --git a/pkg/apis/camel/v1alpha1/zz_generated.deepcopy.go 
b/pkg/apis/camel/v1alpha1/zz_generated.deepcopy.go
index d29a234..8b16b1e 100644
--- a/pkg/apis/camel/v1alpha1/zz_generated.deepcopy.go
+++ b/pkg/apis/camel/v1alpha1/zz_generated.deepcopy.go
@@ -267,8 +267,13 @@ func (in *PropertySpec) DeepCopy() *PropertySpec {
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, 
writing into out. in must be non-nil.
 func (in *SourceSpec) DeepCopyInto(out *SourceSpec) {
        *out = *in
-       if in.Code != nil {
-               in, out := &in.Code, &out.Code
+       if in.Name != nil {
+               in, out := &in.Name, &out.Name
+               *out = new(string)
+               **out = **in
+       }
+       if in.Content != nil {
+               in, out := &in.Content, &out.Content
                *out = new(string)
                **out = **in
        }
diff --git a/pkg/build/api/types.go b/pkg/build/api/types.go
index 892e526..b94a9e7 100644
--- a/pkg/build/api/types.go
+++ b/pkg/build/api/types.go
@@ -20,7 +20,7 @@ package api
 // a request to build a specific code
 type BuildSource struct {
        Identifier BuildIdentifier
-       Code       string
+       Code       Code
 }
 
 type BuildIdentifier struct {
@@ -28,6 +28,11 @@ type BuildIdentifier struct {
        Digest string
 }
 
+type Code struct {
+       Name    string
+       Content string
+}
+
 // represents the result of a build
 type BuildResult struct {
        Source *BuildSource
diff --git a/pkg/build/build_manager_integration_test.go 
b/pkg/build/build_manager_integration_test.go
index 932b315..11deca7 100644
--- a/pkg/build/build_manager_integration_test.go
+++ b/pkg/build/build_manager_integration_test.go
@@ -21,12 +21,13 @@ package build
 
 import (
        "context"
+       "testing"
+       "time"
+
        build "github.com/apache/camel-k/pkg/build/api"
        "github.com/apache/camel-k/pkg/util/digest"
        "github.com/apache/camel-k/pkg/util/test"
        "github.com/stretchr/testify/assert"
-       "testing"
-       "time"
 )
 
 func TestBuild(t *testing.T) {
@@ -38,7 +39,9 @@ func TestBuild(t *testing.T) {
        }
        buildManager.Start(build.BuildSource{
                Identifier: identifier,
-               Code:       code(),
+               Code: build.Code{
+                       Content: code(),
+               },
        })
 
        deadline := time.Now().Add(5 * time.Minute)
@@ -66,7 +69,9 @@ func TestFailedBuild(t *testing.T) {
        }
        buildManager.Start(build.BuildSource{
                Identifier: identifier,
-               Code:       code() + "XX",
+               Code: build.Code{
+                       Content: code() + "XX",
+               },
        })
 
        deadline := time.Now().Add(5 * time.Minute)
diff --git a/pkg/build/local/local_builder.go b/pkg/build/local/local_builder.go
index daa5483..38a9812 100644
--- a/pkg/build/local/local_builder.go
+++ b/pkg/build/local/local_builder.go
@@ -127,12 +127,12 @@ func (b *localBuilder) execute(source build.BuildSource) 
(string, error) {
                                },
                        },
                },
-               JavaSources: map[string]string{
-                       "kamel/Routes.java": source.Code,
+               Resources: map[string]string{
+                       source.Code.Name: source.Code.Content,
                },
                Env: map[string]string{
                        "JAVA_MAIN_CLASS":    
"org.apache.camel.k.jvm.Application",
-                       "CAMEL_K_ROUTES_URI": "classpath:kamel.Routes",
+                       "CAMEL_K_ROUTES_URI": "classpath:" + source.Code.Name,
                },
        }
 
diff --git a/pkg/build/local/local_builder_integration_test.go 
b/pkg/build/local/local_builder_integration_test.go
index 8ab1460..8c4f4a4 100644
--- a/pkg/build/local/local_builder_integration_test.go
+++ b/pkg/build/local/local_builder_integration_test.go
@@ -21,11 +21,12 @@ package local
 
 import (
        "context"
+       "testing"
+
        build "github.com/apache/camel-k/pkg/build/api"
        "github.com/apache/camel-k/pkg/util/digest"
        "github.com/apache/camel-k/pkg/util/test"
        "github.com/stretchr/testify/assert"
-       "testing"
 )
 
 func TestBuild(t *testing.T) {
@@ -38,7 +39,9 @@ func TestBuild(t *testing.T) {
                        Name:   "test0",
                        Digest: digest.Random(),
                },
-               Code: code(),
+               Code: build.Code{
+                       Content: code(),
+               },
        })
 
        res := <-execution
@@ -56,7 +59,9 @@ func TestDoubleBuild(t *testing.T) {
                        Name:   "test1",
                        Digest: digest.Random(),
                },
-               Code: code(),
+               Code: build.Code{
+                       Content: code(),
+               },
        })
 
        execution2 := builder.Build(build.BuildSource{
@@ -64,7 +69,9 @@ func TestDoubleBuild(t *testing.T) {
                        Name:   "test2",
                        Digest: digest.Random(),
                },
-               Code: code(),
+               Code: build.Code{
+                       Content: code(),
+               },
        })
 
        res1 := <-execution1
@@ -84,7 +91,9 @@ func TestFailedBuild(t *testing.T) {
                        Name:   "test3",
                        Digest: digest.Random(),
                },
-               Code: code() + "-",
+               Code: build.Code{
+                       Content: code() + "-",
+               },
        })
 
        res := <-execution
diff --git a/pkg/client/cmd/run.go b/pkg/client/cmd/run.go
index 889b326..5ec40d7 100644
--- a/pkg/client/cmd/run.go
+++ b/pkg/client/cmd/run.go
@@ -23,6 +23,7 @@ import (
        "io/ioutil"
        "os"
        "strconv"
+       "strings"
 
        "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
        "github.com/apache/camel-k/pkg/util/kubernetes"
@@ -81,6 +82,11 @@ func (o *RunCmdOptions) run(cmd *cobra.Command, args 
[]string) error {
                name = "integration"
        }
 
+       codeName := args[0]
+       if idx := strings.LastIndexByte(args[0], os.PathSeparator); idx > -1 {
+               codeName = codeName[idx:]
+       }
+
        integration := v1alpha1.Integration{
                TypeMeta: v1.TypeMeta{
                        Kind:       "Integration",
@@ -92,7 +98,9 @@ func (o *RunCmdOptions) run(cmd *cobra.Command, args 
[]string) error {
                },
                Spec: v1alpha1.IntegrationSpec{
                        Source: v1alpha1.SourceSpec{
-                               Code: &code,
+                               Name:     &codeName,
+                               Content:  &code,
+                               Language: &o.Language,
                        },
                },
        }
diff --git a/pkg/stub/action/integration/build.go 
b/pkg/stub/action/integration/build.go
index 98b71d4..25747cc 100644
--- a/pkg/stub/action/integration/build.go
+++ b/pkg/stub/action/integration/build.go
@@ -54,7 +54,10 @@ func (b *BuildAction) Handle(integration 
*v1alpha1.Integration) error {
        if buildResult.Status == api.BuildStatusNotRequested {
                b.buildManager.Start(api.BuildSource{
                        Identifier: buildIdentifier,
-                       Code:       *integration.Spec.Source.Code, // FIXME 
possible panic
+                       Code: api.Code{
+                               Name:    *integration.Spec.Source.Name,
+                               Content: *integration.Spec.Source.Content,
+                       }, // FIXME possible panic
                })
                logrus.Info("Build started")
        } else if buildResult.Status == api.BuildStatusError {
diff --git a/pkg/util/digest/digest.go b/pkg/util/digest/digest.go
index ad10e6c..09bec1c 100644
--- a/pkg/util/digest/digest.go
+++ b/pkg/util/digest/digest.go
@@ -20,10 +20,11 @@ package digest
 import (
        "crypto/sha256"
        "encoding/base64"
-       "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
-       "github.com/apache/camel-k/version"
        "math/rand"
        "strconv"
+
+       "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+       "github.com/apache/camel-k/version"
 )
 
 // Compute a digest of the fields that are relevant for the deployment
@@ -33,8 +34,8 @@ func Compute(integration *v1alpha1.Integration) string {
        // Operator version is relevant
        hash.Write([]byte(version.Version))
        // Integration relevant fields
-       if integration.Spec.Source.Code != nil {
-               hash.Write([]byte(*integration.Spec.Source.Code))
+       if integration.Spec.Source.Content != nil {
+               hash.Write([]byte(*integration.Spec.Source.Content))
        }
        // Add a letter at the beginning and use URL safe encoding
        return "v" + base64.RawURLEncoding.EncodeToString(hash.Sum(nil))
diff --git a/pkg/util/maven/maven.go b/pkg/util/maven/maven.go
index 262f275..f474f58 100644
--- a/pkg/util/maven/maven.go
+++ b/pkg/util/maven/maven.go
@@ -26,6 +26,8 @@ import (
        "os"
        "os/exec"
        "path"
+       "regexp"
+       "strings"
 
        "github.com/pkg/errors"
        "github.com/sirupsen/logrus"
@@ -246,3 +248,28 @@ func pomFileContent(project Project) (string, error) {
 
        return w.String(), nil
 }
+
+func ParseGAV(gav string) (Dependency, error) {
+       // 
<groupId>:<artifactId>[:<packagingType>[:<classifier>]]:(<version>|'?')
+       dep := Dependency{}
+       rex := regexp.MustCompile("([^: ]+):([^: ]+)(:([^: ]*)(:([^: 
]+))?)?(:([^: ]+))?")
+       res := rex.FindStringSubmatch(gav)
+
+       dep.GroupId = res[1]
+       dep.ArtifactId = res[2]
+       dep.Type = "jar"
+
+       cnt := strings.Count(gav, ":")
+       if cnt == 2 {
+               dep.Version = res[4]
+       } else if cnt == 3 {
+               dep.Type = res[4]
+               dep.Version = res[6]
+       } else {
+               dep.Type = res[4]
+               dep.Classifier = res[6]
+               dep.Version = res[8]
+       }
+
+       return dep, nil
+}
diff --git a/pkg/util/maven/mavent_test.go b/pkg/util/maven/mavent_test.go
index 8a84910..3092e4a 100644
--- a/pkg/util/maven/mavent_test.go
+++ b/pkg/util/maven/mavent_test.go
@@ -67,3 +67,36 @@ func TestPomGeneration(t *testing.T) {
 
        assert.Equal(t, pom, expectedPom)
 }
+
+func TestParseSimpleGAV(t *testing.T) {
+       dep, err := ParseGAV("org.apache.camel:camel-core:2.21.1")
+
+       assert.Nil(t, err)
+       assert.Equal(t, dep.GroupId, "org.apache.camel")
+       assert.Equal(t, dep.ArtifactId, "camel-core")
+       assert.Equal(t, dep.Version, "2.21.1")
+       assert.Equal(t, dep.Type, "jar")
+       assert.Equal(t, dep.Classifier, "")
+}
+
+func TestParseGAVWithType(t *testing.T) {
+       dep, err := ParseGAV("org.apache.camel:camel-core:war:2.21.1")
+
+       assert.Nil(t, err)
+       assert.Equal(t, dep.GroupId, "org.apache.camel")
+       assert.Equal(t, dep.ArtifactId, "camel-core")
+       assert.Equal(t, dep.Version, "2.21.1")
+       assert.Equal(t, dep.Type, "war")
+       assert.Equal(t, dep.Classifier, "")
+}
+
+func TestParseGAVWithClassifierAndType(t *testing.T) {
+       dep, err := ParseGAV("org.apache.camel:camel-core:war:test:2.21.1")
+
+       assert.Nil(t, err)
+       assert.Equal(t, dep.GroupId, "org.apache.camel")
+       assert.Equal(t, dep.ArtifactId, "camel-core")
+       assert.Equal(t, dep.Version, "2.21.1")
+       assert.Equal(t, dep.Type, "war")
+       assert.Equal(t, dep.Classifier, "test")
+}
diff --git a/pkg/util/maven/types.go b/pkg/util/maven/types.go
index 68796aa..1ebebe0 100644
--- a/pkg/util/maven/types.go
+++ b/pkg/util/maven/types.go
@@ -17,7 +17,9 @@ limitations under the License.
 
 package maven
 
-import "encoding/xml"
+import (
+       "encoding/xml"
+)
 
 type ProjectDefinition struct {
        Project     Project
@@ -45,5 +47,17 @@ type Dependencies struct {
 type Dependency struct {
        GroupId    string `xml:"groupId"`
        ArtifactId string `xml:"artifactId"`
-       Version    string `xml:"version"`
+       Version    string `xml:"version,omitempty"`
+       Type       string `xml:"type,omitempty"`
+       Classifier string `xml:"classifier,omitempty"`
+}
+
+func NewDependency(groupId string, artifactId string, version string) 
Dependency {
+       return Dependency{
+               GroupId:    groupId,
+               ArtifactId: artifactId,
+               Version:    version,
+               Type:       "jar",
+               Classifier: "",
+       }
 }
diff --git a/Sample.java b/runtime/examples/Sample.java
similarity index 83%
rename from Sample.java
rename to runtime/examples/Sample.java
index 4ba8c88..cf1be6a 100644
--- a/Sample.java
+++ b/runtime/examples/Sample.java
@@ -1,14 +1,10 @@
-package kamel;
-
 import org.apache.camel.builder.RouteBuilder;
 
-public class Routes extends RouteBuilder {
-
+public class Sample extends RouteBuilder {
   @Override
   public void configure() throws Exception {
          from("timer:tick")
     .setBody(constant("-\n             r\n             o\n             
c\nHello! Camel K\n             s\n             !\n"))
                .to("log:info?skipBodyLineSeparator=false");
   }
-
 }
\ No newline at end of file
diff --git a/runtime/examples/routes.js b/runtime/examples/routes.js
new file mode 100644
index 0000000..a020511
--- /dev/null
+++ b/runtime/examples/routes.js
@@ -0,0 +1,34 @@
+
+// ****************
+//
+// Setup
+//
+// ****************
+
+l = components.get('log')
+l.exchangeFormatter = function(e) {
+    return "log - body=" + e.in.body + ", headers=" + e.in.headers
+}
+
+// ****************
+//
+// Functions
+//
+// ****************
+
+function proc(e) {
+    e.getIn().setHeader('RandomValue', Math.floor((Math.random() * 100) + 1))
+}
+
+// ****************
+//
+// Route
+//
+// ****************
+
+from('timer:js?period=1s')
+    .routeId('js')
+    .setBody()
+        .constant('Hello Camel K')
+    .process(proc)
+    .to('log:info')
\ No newline at end of file
diff --git a/runtime/jvm/src/main/java/org/apache/camel/k/jvm/RouteLoaders.java 
b/runtime/jvm/src/main/java/org/apache/camel/k/jvm/RouteLoaders.java
index 77cd3bc..48a3fb6 100644
--- a/runtime/jvm/src/main/java/org/apache/camel/k/jvm/RouteLoaders.java
+++ b/runtime/jvm/src/main/java/org/apache/camel/k/jvm/RouteLoaders.java
@@ -95,7 +95,7 @@ public enum RouteLoaders implements RoutesLoader {
                     // Exposed to the underlying script, but maybe better to 
have
                     // a nice dsl
                     bindings.put("context", context);
-                    bindings.put("components", context);
+                    bindings.put("components", new Components(context));
                     bindings.put("from", (Function<String, RouteDefinition>) 
uri -> from(uri));
 
                     try (InputStream is = is(resource)) {
@@ -166,9 +166,12 @@ public enum RouteLoaders implements RoutesLoader {
 
     private static InputStream is(String resource) throws IOException {
         if (resource.startsWith(Application.SCHEME_CLASSPATH)) {
-            return Application.class.getResourceAsStream(
-                resource.substring(Application.SCHEME_CLASSPATH.length())
-            );
+            String location = StringUtils.removeStart(resource, 
Application.SCHEME_CLASSPATH);
+            if (!location.startsWith("/")) {
+                location = "/" + location;
+            }
+
+            return Application.class.getResourceAsStream(location);
         } else {
             return Files.newInputStream(
                 Paths.get(resource.substring(Application.SCHEME_FILE.length()))
diff --git 
a/runtime/jvm/src/test/java/org/apache/camel/k/jvm/RouteLoadersTest.java 
b/runtime/jvm/src/test/java/org/apache/camel/k/jvm/RouteLoadersTest.java
index 4dcea3b..8701558 100644
--- a/runtime/jvm/src/test/java/org/apache/camel/k/jvm/RouteLoadersTest.java
+++ b/runtime/jvm/src/test/java/org/apache/camel/k/jvm/RouteLoadersTest.java
@@ -46,7 +46,7 @@ public class RouteLoadersTest {
 
     @Test
     public void testLoadJava() throws Exception {
-        String resource = "classpath:/MyRoutes.java";
+        String resource = "classpath:MyRoutes.java";
         RoutesLoader loader = RouteLoaders.loaderFor(resource);
         RouteBuilder builder = loader.load(resource);
 
@@ -63,7 +63,7 @@ public class RouteLoadersTest {
 
     @Test
     public void testLoadJavaScript() throws Exception {
-        String resource = "classpath:/routes.js";
+        String resource = "classpath:routes.js";
         RoutesLoader loader = RouteLoaders.loaderFor(resource);
         RouteBuilder builder = loader.load(resource);
 
@@ -80,7 +80,7 @@ public class RouteLoadersTest {
 
     @Test
     public void testLoadGroovy() throws Exception {
-        String resource = "classpath:/routes.groovy";
+        String resource = "classpath:routes.groovy";
         RoutesLoader loader = RouteLoaders.loaderFor(resource);
         RouteBuilder builder = loader.load(resource);
 

Reply via email to