You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by nf...@apache.org on 2019/01/15 12:00:45 UTC

[camel-k] branch master updated: chore: refactor source inspector

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 97e5267  chore: refactor source inspector
97e5267 is described below

commit 97e5267e5afa8921370f913c1cb15858083eba33
Author: lburgazzoli <lb...@gmail.com>
AuthorDate: Tue Jan 15 01:33:17 2019 +0100

    chore: refactor source inspector
---
 pkg/metadata/dependencies.go             | 88 --------------------------------
 pkg/metadata/metadata.go                 | 38 +++++++-------
 pkg/metadata/types.go                    |  9 ++--
 pkg/util/source/inspector.go             | 81 ++++++++++++++++++++---------
 pkg/util/source/inspector_groovy.go      | 26 +++++-----
 pkg/util/source/inspector_java_script.go | 26 +++++-----
 pkg/util/source/inspector_java_source.go | 26 +++++-----
 pkg/util/source/inspector_kotlin.go      | 26 +++++-----
 pkg/util/source/inspector_xml.go         | 38 +++-----------
 pkg/util/source/inspector_yaml_flow.go   | 34 ++++--------
 pkg/{metadata => util/source}/types.go   | 11 ++--
 pkg/util/util.go                         | 37 ++++++++++++++
 12 files changed, 192 insertions(+), 248 deletions(-)

diff --git a/pkg/metadata/dependencies.go b/pkg/metadata/dependencies.go
deleted file mode 100644
index f70efdd..0000000
--- a/pkg/metadata/dependencies.go
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one or more
-contributor license agreements.  See the NOTICE file distributed with
-this work for additional information regarding copyright ownership.
-The ASF licenses this file to You under the Apache License, Version 2.0
-(the "License"); you may not use this file except in compliance with
-the License.  You may obtain a copy of the License at
-
-   http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package metadata
-
-import (
-	"regexp"
-	"sort"
-	"strings"
-
-	"github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
-	"github.com/apache/camel-k/pkg/util/camel"
-)
-
-var (
-	additionalDependencies = map[string]string{
-		".*JsonLibrary\\.Jackson.*": "camel:jackson",
-	}
-)
-
-// discoverDependencies returns a list of dependencies required by the given source code
-func discoverDependencies(source v1alpha1.SourceSpec, fromURIs []string, toURIs []string) []string {
-	candidateMap := make(map[string]bool)
-	uris := make([]string, 0, len(fromURIs)+len(toURIs))
-	uris = append(uris, fromURIs...)
-	uris = append(uris, toURIs...)
-	for _, uri := range uris {
-		candidateComp := decodeComponent(uri)
-		if candidateComp != "" {
-			candidateMap[candidateComp] = true
-		}
-	}
-	additional := findAdditionalDependencies(source)
-	for _, dep := range additional {
-		candidateMap[dep] = true
-	}
-	// Remove duplicates and sort
-	candidateComponents := make([]string, 0, len(candidateMap))
-	for cmp := range candidateMap {
-		candidateComponents = append(candidateComponents, cmp)
-	}
-	sort.Strings(candidateComponents)
-	return candidateComponents
-}
-
-func decodeComponent(uri string) string {
-	uriSplit := strings.SplitN(uri, ":", 2)
-	if len(uriSplit) < 2 {
-		return ""
-	}
-	uriStart := uriSplit[0]
-	if component := camel.Runtime.GetArtifactByScheme(uriStart); component != nil {
-		artifactID := component.ArtifactID
-		if component.GroupID == "org.apache.camel" && strings.HasPrefix(artifactID, "camel-") {
-			return "camel:" + artifactID[6:]
-		}
-		if component.GroupID == "org.apache.camel.k" && strings.HasPrefix(artifactID, "camel-") {
-			return "camel-k:" + artifactID[6:]
-		}
-		return "mvn:" + component.GroupID + ":" + artifactID + ":" + component.Version
-	}
-	return ""
-}
-
-func findAdditionalDependencies(source v1alpha1.SourceSpec) []string {
-	additional := make([]string, 0)
-	for pattern, dep := range additionalDependencies {
-		pat := regexp.MustCompile(pattern)
-		if pat.MatchString(source.Content) {
-			additional = append(additional, dep)
-		}
-	}
-	return additional
-}
diff --git a/pkg/metadata/metadata.go b/pkg/metadata/metadata.go
index bbdacfd..5b2940c 100644
--- a/pkg/metadata/metadata.go
+++ b/pkg/metadata/metadata.go
@@ -28,9 +28,11 @@ import (
 func ExtractAll(sources []v1alpha1.SourceSpec) IntegrationMetadata {
 	// neutral metadata
 	meta := IntegrationMetadata{
-		Dependencies:        []string{},
-		FromURIs:            []string{},
-		ToURIs:              []string{},
+		Metadata: src.Metadata{
+			FromURIs:     []string{},
+			ToURIs:       []string{},
+			Dependencies: []string{},
+		},
 		PassiveEndpoints:    true,
 		RequiresHTTPService: false,
 	}
@@ -54,9 +56,11 @@ func merge(m1 IntegrationMetadata, m2 IntegrationMetadata) IntegrationMetadata {
 	}
 	sort.Strings(allDependencies)
 	return IntegrationMetadata{
-		FromURIs:            append(m1.FromURIs, m2.FromURIs...),
-		ToURIs:              append(m1.ToURIs, m2.ToURIs...),
-		Dependencies:        allDependencies,
+		Metadata: src.Metadata{
+			FromURIs:     append(m1.FromURIs, m2.FromURIs...),
+			ToURIs:       append(m1.ToURIs, m2.ToURIs...),
+			Dependencies: allDependencies,
+		},
 		RequiresHTTPService: m1.RequiresHTTPService || m2.RequiresHTTPService,
 		PassiveEndpoints:    m1.PassiveEndpoints && m2.PassiveEndpoints,
 	}
@@ -65,20 +69,16 @@ func merge(m1 IntegrationMetadata, m2 IntegrationMetadata) IntegrationMetadata {
 // Extract returns metadata information from the source code
 func Extract(source v1alpha1.SourceSpec) IntegrationMetadata {
 	language := source.InferLanguage()
+
+	m := IntegrationMetadata{}
+
 	// TODO: handle error
-	fromURIs, _ := src.InspectorForLanguage(language).FromURIs(source)
-	// TODO:: handle error
-	toURIs, _ := src.InspectorForLanguage(language).ToURIs(source)
-	dependencies := discoverDependencies(source, fromURIs, toURIs)
-	requiresHTTPService := requiresHTTPService(source, fromURIs)
-	passiveEndpoints := hasOnlyPassiveEndpoints(source, fromURIs)
-	return IntegrationMetadata{
-		FromURIs:            fromURIs,
-		ToURIs:              toURIs,
-		Dependencies:        dependencies,
-		RequiresHTTPService: requiresHTTPService,
-		PassiveEndpoints:    passiveEndpoints,
-	}
+	_ = src.InspectorForLanguage(language).Extract(source, &m.Metadata)
+
+	m.RequiresHTTPService = requiresHTTPService(source, m.FromURIs)
+	m.PassiveEndpoints = hasOnlyPassiveEndpoints(source, m.FromURIs)
+
+	return m
 }
 
 // Each --
diff --git a/pkg/metadata/types.go b/pkg/metadata/types.go
index af81ef1..538553f 100644
--- a/pkg/metadata/types.go
+++ b/pkg/metadata/types.go
@@ -17,14 +17,11 @@ limitations under the License.
 
 package metadata
 
+import "github.com/apache/camel-k/pkg/util/source"
+
 // IntegrationMetadata contains aggregate metadata about all Camel routes in a integrations
 type IntegrationMetadata struct {
-	// All starting URIs of defined routes
-	FromURIs []string
-	// All end URIs of defined routes
-	ToURIs []string
-	// All inferred dependencies required to run the integration
-	Dependencies []string
+	source.Metadata
 	// RequiresHTTPService indicates if the integration needs to be invoked through HTTP
 	RequiresHTTPService bool
 	// PassiveEndpoints indicates that the integration contains only passive endpoints that are activated from
diff --git a/pkg/util/source/inspector.go b/pkg/util/source/inspector.go
index db76c49..550f064 100644
--- a/pkg/util/source/inspector.go
+++ b/pkg/util/source/inspector.go
@@ -19,8 +19,13 @@ package source
 
 import (
 	"regexp"
+	"sort"
+	"strings"
 
 	"github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+	"github.com/apache/camel-k/pkg/util"
+	"github.com/apache/camel-k/pkg/util/camel"
+	"github.com/scylladb/go-set/strset"
 )
 
 var (
@@ -32,12 +37,15 @@ var (
 	doubleQuotedTo   = regexp.MustCompile(`\.to\s*\(\s*"([a-z0-9-]+:[^"]+)"\s*\)`)
 	doubleQuotedToD  = regexp.MustCompile(`\.toD\s*\(\s*"([a-z0-9-]+:[^"]+)"\s*\)`)
 	doubleQuotedToF  = regexp.MustCompile(`\.toF\s*\(\s*"([a-z0-9-]+:[^"]+)"[^)]*\)`)
+
+	additionalDependencies = map[string]string{
+		".*JsonLibrary\\.Jackson.*": "camel:jackson",
+	}
 )
 
 // Inspector --
 type Inspector interface {
-	FromURIs(v1alpha1.SourceSpec) ([]string, error)
-	ToURIs(v1alpha1.SourceSpec) ([]string, error)
+	Extract(v1alpha1.SourceSpec, *Metadata) error
 }
 
 // InspectorForLanguage --
@@ -56,34 +64,57 @@ func InspectorForLanguage(language v1alpha1.Language) Inspector {
 	case v1alpha1.LanguageYamlFlow:
 		return &YAMLFlowInspector{}
 	}
-	return &noInspector{}
+	return &baseInspector{}
 }
 
-func findAllDistinctStringSubmatch(data string, regexps ...*regexp.Regexp) []string {
-	candidates := make([]string, 0)
-	alreadyFound := make(map[string]bool)
-	for _, reg := range regexps {
-		hits := reg.FindAllStringSubmatch(data, -1)
-		for _, hit := range hits {
-			if len(hit) > 1 {
-				for _, match := range hit[1:] {
-					if _, ok := alreadyFound[match]; !ok {
-						alreadyFound[match] = true
-						candidates = append(candidates, match)
-					}
-				}
-			}
-		}
-	}
-	return candidates
+type baseInspector struct {
 }
 
-type noInspector struct {
+func (i baseInspector) Extract(v1alpha1.SourceSpec, *Metadata) error {
+	return nil
 }
 
-func (i noInspector) FromURIs(source v1alpha1.SourceSpec) ([]string, error) {
-	return []string{}, nil
+// discoverDependencies returns a list of dependencies required by the given source code
+func (i *baseInspector) discoverDependencies(source v1alpha1.SourceSpec, meta *Metadata) []string {
+	uris := util.StringSliceJoin(meta.FromURIs, meta.ToURIs)
+	candidates := strset.New()
+
+	for _, uri := range uris {
+		candidateComp := i.decodeComponent(uri)
+		if candidateComp != "" {
+			candidates.Add(candidateComp)
+		}
+	}
+
+	for pattern, dep := range additionalDependencies {
+		pat := regexp.MustCompile(pattern)
+		if pat.MatchString(source.Content) {
+			candidates.Add(dep)
+		}
+	}
+
+	components := candidates.List()
+
+	sort.Strings(components)
+
+	return components
 }
-func (i noInspector) ToURIs(source v1alpha1.SourceSpec) ([]string, error) {
-	return []string{}, nil
+
+func (i *baseInspector) decodeComponent(uri string) string {
+	uriSplit := strings.SplitN(uri, ":", 2)
+	if len(uriSplit) < 2 {
+		return ""
+	}
+	uriStart := uriSplit[0]
+	if component := camel.Runtime.GetArtifactByScheme(uriStart); component != nil {
+		artifactID := component.ArtifactID
+		if component.GroupID == "org.apache.camel" && strings.HasPrefix(artifactID, "camel-") {
+			return "camel:" + artifactID[6:]
+		}
+		if component.GroupID == "org.apache.camel.k" && strings.HasPrefix(artifactID, "camel-") {
+			return "camel-k:" + artifactID[6:]
+		}
+		return "mvn:" + component.GroupID + ":" + artifactID + ":" + component.Version
+	}
+	return ""
 }
diff --git a/pkg/util/source/inspector_groovy.go b/pkg/util/source/inspector_groovy.go
index ddcd874..62db629 100644
--- a/pkg/util/source/inspector_groovy.go
+++ b/pkg/util/source/inspector_groovy.go
@@ -17,26 +17,24 @@ limitations under the License.
 
 package source
 
-import "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+import (
+	"github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+	"github.com/apache/camel-k/pkg/util"
+)
 
 // GroovyInspector --
 type GroovyInspector struct {
+	baseInspector
 }
 
-// FromURIs --
-func (i GroovyInspector) FromURIs(source v1alpha1.SourceSpec) ([]string, error) {
-	answer := findAllDistinctStringSubmatch(
+// Extract --
+func (i GroovyInspector) Extract(source v1alpha1.SourceSpec, meta *Metadata) error {
+	from := util.FindAllDistinctStringSubmatch(
 		source.Content,
 		singleQuotedFrom,
 		doubleQuotedFrom,
 	)
-
-	return answer, nil
-}
-
-// ToURIs --
-func (i GroovyInspector) ToURIs(source v1alpha1.SourceSpec) ([]string, error) {
-	answer := findAllDistinctStringSubmatch(
+	to := util.FindAllDistinctStringSubmatch(
 		source.Content,
 		singleQuotedTo,
 		doubleQuotedTo,
@@ -46,5 +44,9 @@ func (i GroovyInspector) ToURIs(source v1alpha1.SourceSpec) ([]string, error) {
 		doubleQuotedToF,
 	)
 
-	return answer, nil
+	meta.FromURIs = append(meta.FromURIs, from...)
+	meta.ToURIs = append(meta.ToURIs, to...)
+	meta.Dependencies = i.discoverDependencies(source, meta)
+
+	return nil
 }
diff --git a/pkg/util/source/inspector_java_script.go b/pkg/util/source/inspector_java_script.go
index 913fc8d..87d53ea 100644
--- a/pkg/util/source/inspector_java_script.go
+++ b/pkg/util/source/inspector_java_script.go
@@ -17,26 +17,24 @@ limitations under the License.
 
 package source
 
-import "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+import (
+	"github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+	"github.com/apache/camel-k/pkg/util"
+)
 
 // JavaScriptInspector --
 type JavaScriptInspector struct {
+	baseInspector
 }
 
-// FromURIs --
-func (i JavaScriptInspector) FromURIs(source v1alpha1.SourceSpec) ([]string, error) {
-	answer := findAllDistinctStringSubmatch(
+// Extract --
+func (i JavaScriptInspector) Extract(source v1alpha1.SourceSpec, meta *Metadata) error {
+	from := util.FindAllDistinctStringSubmatch(
 		source.Content,
 		singleQuotedFrom,
 		doubleQuotedFrom,
 	)
-
-	return answer, nil
-}
-
-// ToURIs --
-func (i JavaScriptInspector) ToURIs(source v1alpha1.SourceSpec) ([]string, error) {
-	answer := findAllDistinctStringSubmatch(
+	to := util.FindAllDistinctStringSubmatch(
 		source.Content,
 		singleQuotedTo,
 		doubleQuotedTo,
@@ -46,5 +44,9 @@ func (i JavaScriptInspector) ToURIs(source v1alpha1.SourceSpec) ([]string, error
 		doubleQuotedToF,
 	)
 
-	return answer, nil
+	meta.FromURIs = append(meta.FromURIs, from...)
+	meta.ToURIs = append(meta.ToURIs, to...)
+	meta.Dependencies = i.discoverDependencies(source, meta)
+
+	return nil
 }
diff --git a/pkg/util/source/inspector_java_source.go b/pkg/util/source/inspector_java_source.go
index 4a22953..938e75b 100644
--- a/pkg/util/source/inspector_java_source.go
+++ b/pkg/util/source/inspector_java_source.go
@@ -17,30 +17,32 @@ limitations under the License.
 
 package source
 
-import "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+import (
+	"github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+	"github.com/apache/camel-k/pkg/util"
+)
 
 // JavaSourceInspector --
 type JavaSourceInspector struct {
+	baseInspector
 }
 
-// FromURIs --
-func (i JavaSourceInspector) FromURIs(source v1alpha1.SourceSpec) ([]string, error) {
-	answer := findAllDistinctStringSubmatch(
+// Extract --
+func (i JavaSourceInspector) Extract(source v1alpha1.SourceSpec, meta *Metadata) error {
+	from := util.FindAllDistinctStringSubmatch(
 		source.Content,
 		doubleQuotedFrom,
 	)
-
-	return answer, nil
-}
-
-// ToURIs --
-func (i JavaSourceInspector) ToURIs(source v1alpha1.SourceSpec) ([]string, error) {
-	answer := findAllDistinctStringSubmatch(
+	to := util.FindAllDistinctStringSubmatch(
 		source.Content,
 		doubleQuotedTo,
 		doubleQuotedToD,
 		doubleQuotedToF,
 	)
 
-	return answer, nil
+	meta.FromURIs = append(meta.FromURIs, from...)
+	meta.ToURIs = append(meta.ToURIs, to...)
+	meta.Dependencies = i.discoverDependencies(source, meta)
+
+	return nil
 }
diff --git a/pkg/util/source/inspector_kotlin.go b/pkg/util/source/inspector_kotlin.go
index 111bf14..9277f9b 100644
--- a/pkg/util/source/inspector_kotlin.go
+++ b/pkg/util/source/inspector_kotlin.go
@@ -17,30 +17,32 @@ limitations under the License.
 
 package source
 
-import "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+import (
+	"github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+	"github.com/apache/camel-k/pkg/util"
+)
 
 // KotlinInspector --
 type KotlinInspector struct {
+	baseInspector
 }
 
-// FromURIs --
-func (i KotlinInspector) FromURIs(source v1alpha1.SourceSpec) ([]string, error) {
-	answer := findAllDistinctStringSubmatch(
+// Extract --
+func (i KotlinInspector) Extract(source v1alpha1.SourceSpec, meta *Metadata) error {
+	from := util.FindAllDistinctStringSubmatch(
 		source.Content,
 		doubleQuotedFrom,
 	)
-
-	return answer, nil
-}
-
-// ToURIs --
-func (i KotlinInspector) ToURIs(source v1alpha1.SourceSpec) ([]string, error) {
-	answer := findAllDistinctStringSubmatch(
+	to := util.FindAllDistinctStringSubmatch(
 		source.Content,
 		doubleQuotedTo,
 		doubleQuotedToD,
 		doubleQuotedToF,
 	)
 
-	return answer, nil
+	meta.FromURIs = append(meta.FromURIs, from...)
+	meta.ToURIs = append(meta.ToURIs, to...)
+	meta.Dependencies = i.discoverDependencies(source, meta)
+
+	return nil
 }
diff --git a/pkg/util/source/inspector_xml.go b/pkg/util/source/inspector_xml.go
index b2bd2e8..923bd40 100644
--- a/pkg/util/source/inspector_xml.go
+++ b/pkg/util/source/inspector_xml.go
@@ -26,15 +26,14 @@ import (
 
 // XMLInspector --
 type XMLInspector struct {
+	baseInspector
 }
 
-// FromURIs --
-func (i XMLInspector) FromURIs(source v1alpha1.SourceSpec) ([]string, error) {
+// Extract --
+func (i XMLInspector) Extract(source v1alpha1.SourceSpec, meta *Metadata) error {
 	content := strings.NewReader(source.Content)
 	decoder := xml.NewDecoder(content)
 
-	uris := make([]string, 0)
-
 	for {
 		// Read tokens from the XML document in a stream.
 		t, _ := decoder.Token()
@@ -47,41 +46,20 @@ func (i XMLInspector) FromURIs(source v1alpha1.SourceSpec) ([]string, error) {
 			case "from", "fromF":
 				for _, a := range se.Attr {
 					if a.Name.Local == "uri" {
-						uris = append(uris, a.Value)
+						meta.FromURIs = append(meta.FromURIs, a.Value)
 					}
 				}
-			}
-		}
-	}
-
-	return uris, nil
-}
-
-// ToURIs --
-func (i XMLInspector) ToURIs(source v1alpha1.SourceSpec) ([]string, error) {
-	content := strings.NewReader(source.Content)
-	decoder := xml.NewDecoder(content)
-
-	uris := make([]string, 0)
-
-	for {
-		// Read tokens from the XML document in a stream.
-		t, _ := decoder.Token()
-		if t == nil {
-			break
-		}
-
-		if se, ok := t.(xml.StartElement); ok {
-			switch se.Name.Local {
 			case "to", "toD", "toF":
 				for _, a := range se.Attr {
 					if a.Name.Local == "uri" {
-						uris = append(uris, a.Value)
+						meta.ToURIs = append(meta.ToURIs, a.Value)
 					}
 				}
 			}
 		}
 	}
 
-	return uris, nil
+	meta.Dependencies = i.discoverDependencies(source, meta)
+
+	return nil
 }
diff --git a/pkg/util/source/inspector_yaml_flow.go b/pkg/util/source/inspector_yaml_flow.go
index e677b4d..89475fc 100644
--- a/pkg/util/source/inspector_yaml_flow.go
+++ b/pkg/util/source/inspector_yaml_flow.go
@@ -19,49 +19,35 @@ package source
 
 import (
 	"github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
-	yaml "gopkg.in/yaml.v2"
+	"gopkg.in/yaml.v2"
 )
 
 // YAMLFlowInspector --
 type YAMLFlowInspector struct {
+	baseInspector
 }
 
-// FromURIs --
-func (i YAMLFlowInspector) FromURIs(source v1alpha1.SourceSpec) ([]string, error) {
+// Extract --
+func (i YAMLFlowInspector) Extract(source v1alpha1.SourceSpec, meta *Metadata) error {
 	var flows []v1alpha1.Flow
 
 	if err := yaml.Unmarshal([]byte(source.Content), &flows); err != nil {
-		return []string{}, nil
+		return nil
 	}
 
-	uris := make([]string, 0)
-
 	for _, flow := range flows {
 		if flow.Steps[0].URI != "" {
-			uris = append(uris, flow.Steps[0].URI)
+			meta.FromURIs = append(meta.FromURIs, flow.Steps[0].URI)
 		}
 
-	}
-	return uris, nil
-}
-
-// ToURIs --
-func (i YAMLFlowInspector) ToURIs(source v1alpha1.SourceSpec) ([]string, error) {
-	var flows []v1alpha1.Flow
-
-	if err := yaml.Unmarshal([]byte(source.Content), &flows); err != nil {
-		return []string{}, nil
-	}
-
-	uris := make([]string, 0)
-
-	for _, flow := range flows {
 		for i := 1; i < len(flow.Steps); i++ {
 			if flow.Steps[i].URI != "" {
-				uris = append(uris, flow.Steps[i].URI)
+				meta.ToURIs = append(meta.ToURIs, flow.Steps[i].URI)
 			}
 		}
 	}
 
-	return uris, nil
+	meta.Dependencies = i.discoverDependencies(source, meta)
+
+	return nil
 }
diff --git a/pkg/metadata/types.go b/pkg/util/source/types.go
similarity index 66%
copy from pkg/metadata/types.go
copy to pkg/util/source/types.go
index af81ef1..1b89b12 100644
--- a/pkg/metadata/types.go
+++ b/pkg/util/source/types.go
@@ -15,19 +15,14 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-package metadata
+package source
 
-// IntegrationMetadata contains aggregate metadata about all Camel routes in a integrations
-type IntegrationMetadata struct {
+// Metadata --
+type Metadata struct {
 	// All starting URIs of defined routes
 	FromURIs []string
 	// All end URIs of defined routes
 	ToURIs []string
 	// All inferred dependencies required to run the integration
 	Dependencies []string
-	// RequiresHTTPService indicates if the integration needs to be invoked through HTTP
-	RequiresHTTPService bool
-	// PassiveEndpoints indicates that the integration contains only passive endpoints that are activated from
-	// external calls, including HTTP (useful to determine if the integration can scale to 0)
-	PassiveEndpoints bool
 }
diff --git a/pkg/util/util.go b/pkg/util/util.go
index 7cd9712..150b1ab 100644
--- a/pkg/util/util.go
+++ b/pkg/util/util.go
@@ -21,13 +21,33 @@ import (
 	"os"
 	"os/signal"
 	"path"
+	"regexp"
 	"syscall"
 
+	"github.com/scylladb/go-set/strset"
+
 	"k8s.io/api/core/v1"
 
 	"github.com/pkg/errors"
 )
 
+// StringSliceJoin --
+func StringSliceJoin(slices ...[]string) []string {
+	size := 0
+
+	for _, s := range slices {
+		size += len(s)
+	}
+
+	result := make([]string, 0, size)
+
+	for _, s := range slices {
+		result = append(result, s...)
+	}
+
+	return result
+}
+
 // StringSliceContains --
 func StringSliceContains(slice []string, items []string) bool {
 	for i := 0; i < len(items); i++ {
@@ -116,3 +136,20 @@ func LookupEnvVar(vars []v1.EnvVar, name string) *v1.EnvVar {
 
 	return nil
 }
+
+// FindAllDistinctStringSubmatch ..
+func FindAllDistinctStringSubmatch(data string, regexps ...*regexp.Regexp) []string {
+	submatchs := strset.New()
+
+	for _, reg := range regexps {
+		hits := reg.FindAllStringSubmatch(data, -1)
+		for _, hit := range hits {
+			if len(hit) > 1 {
+				for _, match := range hit[1:] {
+					submatchs.Add(match)
+				}
+			}
+		}
+	}
+	return submatchs.List()
+}