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 2017/02/27 13:07:55 UTC

[1/4] camel git commit: CAMEL-10898: camel-catalog - Allow to add custom component/connector by download JAR via maven

Repository: camel
Updated Branches:
  refs/heads/master 59170dd0f -> 4d9ad42bf


CAMEL-10898: camel-catalog - Allow to add custom component/connector by download JAR via maven


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/4d9ad42b
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/4d9ad42b
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/4d9ad42b

Branch: refs/heads/master
Commit: 4d9ad42bfedd1745f81d54520476847980883162
Parents: c9e4817
Author: Claus Ibsen <da...@apache.org>
Authored: Mon Feb 27 14:07:37 2017 +0100
Committer: Claus Ibsen <da...@apache.org>
Committed: Mon Feb 27 14:07:45 2017 +0100

----------------------------------------------------------------------
 .../maven/DefaultMavenArtifactProvider.java     | 34 ++++++++++----------
 .../catalog/maven/MavenArtifactProvider.java    |  8 +++--
 .../maven/MavenArtifactProviderTest.java        | 10 +++---
 .../camel/catalog/rest/CamelCatalogRest.java    | 10 +++---
 .../catalog/rest/CamelConnectorCatalogRest.java | 11 ++++---
 5 files changed, 39 insertions(+), 34 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/4d9ad42b/platforms/camel-catalog-maven/src/main/java/org/apache/camel/catalog/maven/DefaultMavenArtifactProvider.java
----------------------------------------------------------------------
diff --git a/platforms/camel-catalog-maven/src/main/java/org/apache/camel/catalog/maven/DefaultMavenArtifactProvider.java b/platforms/camel-catalog-maven/src/main/java/org/apache/camel/catalog/maven/DefaultMavenArtifactProvider.java
index 9933494..77ee431 100644
--- a/platforms/camel-catalog-maven/src/main/java/org/apache/camel/catalog/maven/DefaultMavenArtifactProvider.java
+++ b/platforms/camel-catalog-maven/src/main/java/org/apache/camel/catalog/maven/DefaultMavenArtifactProvider.java
@@ -18,8 +18,10 @@ package org.apache.camel.catalog.maven;
 
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.LinkedHashSet;
 import java.util.Map;
 import java.util.Properties;
+import java.util.Set;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -51,8 +53,10 @@ public class DefaultMavenArtifactProvider implements MavenArtifactProvider {
     }
 
     @Override
-    public boolean addArtifactToCatalog(CamelCatalog camelCatalog, CamelConnectorCatalog camelConnectorCatalog,
-                                        String groupId, String artifactId, String version) {
+    public Set<String> addArtifactToCatalog(CamelCatalog camelCatalog, CamelConnectorCatalog camelConnectorCatalog,
+                                            String groupId, String artifactId, String version) {
+        final Set<String> names = new LinkedHashSet<>();
+
         try {
             Grape.setEnableAutoDownload(true);
 
@@ -68,22 +72,21 @@ public class DefaultMavenArtifactProvider implements MavenArtifactProvider {
             Grape.grab(param);
 
             // the classloader can load content from the downloaded JAR
-            boolean found = false;
             if (camelCatalog != null) {
-                found |= scanCamelComponents(camelCatalog, classLoader);
+                scanCamelComponents(camelCatalog, classLoader, names);
             }
             if (camelConnectorCatalog != null) {
-                found |= scanCamelConnectors(camelConnectorCatalog, classLoader, groupId, artifactId, version);
+                scanCamelConnectors(camelConnectorCatalog, classLoader, groupId, artifactId, version, names);
             }
 
-            return found;
         } catch (Exception e) {
-            return false;
+            LOG.warn("Error during add components from artifact " + groupId + ":" + artifactId + ":" + version + " due " + e.getMessage(), e);
         }
+
+        return names;
     }
 
-    protected boolean scanCamelComponents(CamelCatalog camelCatalog, ClassLoader classLoader) {
-        boolean found = false;
+    protected void scanCamelComponents(CamelCatalog camelCatalog, ClassLoader classLoader, Set<String> names) {
         // is there any custom Camel components in this library?
         Properties properties = loadComponentProperties(classLoader);
         if (properties != null) {
@@ -99,20 +102,18 @@ public class DefaultMavenArtifactProvider implements MavenArtifactProvider {
                             if (json != null) {
                                 LOG.debug("Adding component: {}", scheme);
                                 camelCatalog.addComponent(scheme, javaType, json);
-                                found = true;
+                                names.add(scheme);
                             }
                         }
                     }
                 }
             }
         }
-        return found;
     }
 
-    protected boolean scanCamelConnectors(CamelConnectorCatalog camelConnectorCatalog, ClassLoader classLoader,
-                                          String groupId, String artifactId, String version) {
-        boolean found = false;
-
+    protected void scanCamelConnectors(CamelConnectorCatalog camelConnectorCatalog, ClassLoader classLoader,
+                                          String groupId, String artifactId, String version,
+                                          Set<String> names) {
         String[] json = loadConnectorJSonSchema(classLoader);
         if (json != null) {
             if (!camelConnectorCatalog.hasConnector(groupId, artifactId, version)) {
@@ -132,13 +133,12 @@ public class DefaultMavenArtifactProvider implements MavenArtifactProvider {
                     camelConnectorCatalog.addConnector(groupId, artifactId, version,
                         name, description, csb.toString(), json[0], json[1]);
 
-                    found = true;
+                    names.add(name);
                 } catch (Throwable e) {
                     LOG.warn("Error parsing Connector JSon due " + e.getMessage(), e);
                 }
             }
         }
-        return found;
     }
 
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/4d9ad42b/platforms/camel-catalog-maven/src/main/java/org/apache/camel/catalog/maven/MavenArtifactProvider.java
----------------------------------------------------------------------
diff --git a/platforms/camel-catalog-maven/src/main/java/org/apache/camel/catalog/maven/MavenArtifactProvider.java b/platforms/camel-catalog-maven/src/main/java/org/apache/camel/catalog/maven/MavenArtifactProvider.java
index d88fc2d..309a463 100644
--- a/platforms/camel-catalog-maven/src/main/java/org/apache/camel/catalog/maven/MavenArtifactProvider.java
+++ b/platforms/camel-catalog-maven/src/main/java/org/apache/camel/catalog/maven/MavenArtifactProvider.java
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.catalog.maven;
 
+import java.util.Set;
+
 import org.apache.camel.catalog.CamelCatalog;
 import org.apache.camel.catalog.connector.CamelConnectorCatalog;
 
@@ -41,9 +43,9 @@ public interface MavenArtifactProvider {
      * @param groupId               Maven group id
      * @param artifactId            Maven artifact id
      * @param version               Maven version
-     * @return <tt>true</tt> if anything was added to the catalog, <tt>false</tt> if not.
+     * @return the names of the components that was added, or an empty set if none found or they already exists in the catalog
      */
-    boolean addArtifactToCatalog(CamelCatalog camelCatalog, CamelConnectorCatalog camelConnectorCatalog,
-                                 String groupId, String artifactId, String version);
+    Set<String> addArtifactToCatalog(CamelCatalog camelCatalog, CamelConnectorCatalog camelConnectorCatalog,
+                                     String groupId, String artifactId, String version);
 
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/4d9ad42b/platforms/camel-catalog-maven/src/test/java/org/apache/camel/catalog/maven/MavenArtifactProviderTest.java
----------------------------------------------------------------------
diff --git a/platforms/camel-catalog-maven/src/test/java/org/apache/camel/catalog/maven/MavenArtifactProviderTest.java b/platforms/camel-catalog-maven/src/test/java/org/apache/camel/catalog/maven/MavenArtifactProviderTest.java
index 93d7c12..bf83e1f 100644
--- a/platforms/camel-catalog-maven/src/test/java/org/apache/camel/catalog/maven/MavenArtifactProviderTest.java
+++ b/platforms/camel-catalog-maven/src/test/java/org/apache/camel/catalog/maven/MavenArtifactProviderTest.java
@@ -17,6 +17,7 @@
 package org.apache.camel.catalog.maven;
 
 import java.util.List;
+import java.util.Set;
 
 import junit.framework.TestCase;
 import org.apache.camel.catalog.CamelCatalog;
@@ -35,8 +36,8 @@ public class MavenArtifactProviderTest extends TestCase {
 
         int before = camelCatalog.findComponentNames().size();
 
-        boolean found = provider.addArtifactToCatalog(camelCatalog, null, "org.apache.camel", "dummy-component", camelCatalog.getCatalogVersion());
-        assertTrue(found);
+        Set<String> names = provider.addArtifactToCatalog(camelCatalog, null, "org.apache.camel", "dummy-component", camelCatalog.getCatalogVersion());
+        assertTrue(names.contains("dummy"));
 
         int after = camelCatalog.findComponentNames().size();
 
@@ -53,8 +54,8 @@ public class MavenArtifactProviderTest extends TestCase {
         List<ConnectorDto> list = camelConnectorCatalog.findConnector("foo", false);
         assertEquals(0, list.size());
 
-        boolean found = provider.addArtifactToCatalog(camelCatalog, camelConnectorCatalog, "org.apache.camel", "myfoo-connector", camelCatalog.getCatalogVersion());
-        assertTrue(found);
+        Set<String> names = provider.addArtifactToCatalog(camelCatalog, camelConnectorCatalog, "org.apache.camel", "myfoo-connector", camelCatalog.getCatalogVersion());
+        assertTrue(names.contains("MyFoo"));
 
         int after = camelCatalog.findComponentNames().size();
 
@@ -65,4 +66,5 @@ public class MavenArtifactProviderTest extends TestCase {
         assertEquals("MyFoo", list.get(0).getName());
         assertTrue(camelCatalog.findComponentNames().contains("my-foo"));
     }
+
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/4d9ad42b/platforms/camel-catalog-rest/src/main/java/org/apache/camel/catalog/rest/CamelCatalogRest.java
----------------------------------------------------------------------
diff --git a/platforms/camel-catalog-rest/src/main/java/org/apache/camel/catalog/rest/CamelCatalogRest.java b/platforms/camel-catalog-rest/src/main/java/org/apache/camel/catalog/rest/CamelCatalogRest.java
index 5690279..e81d795 100644
--- a/platforms/camel-catalog-rest/src/main/java/org/apache/camel/catalog/rest/CamelCatalogRest.java
+++ b/platforms/camel-catalog-rest/src/main/java/org/apache/camel/catalog/rest/CamelCatalogRest.java
@@ -298,11 +298,11 @@ public class CamelCatalogRest {
 
     @POST
     @Path("/addComponentFromMavenArtifact/{groupId}/{artifactId}/{version}")
-    @Produces("text/plain")
-    @ApiOperation(value = "Downloads the Maven artifact and scan for custom Camel components which will be added to the catalog")
-    public boolean addComponentFromMavenArtifact(@ApiParam("The Maven groupId") @PathParam("groupId") String groupId,
-                                                 @ApiParam("The Maven artifactId") @PathParam("artifactId") String artifactId,
-                                                 @ApiParam("The Maven version") @PathParam("version") String version) {
+    @Produces("application/json")
+    @ApiOperation(value = "Downloads the Maven artifact and scan for custom Camel components which will be added to the catalog and returns the names of the found components")
+    public Set<String> addComponentFromMavenArtifact(@ApiParam("The Maven groupId") @PathParam("groupId") String groupId,
+                                                     @ApiParam("The Maven artifactId") @PathParam("artifactId") String artifactId,
+                                                     @ApiParam("The Maven version") @PathParam("version") String version) {
         return maven.addArtifactToCatalog(catalog, null, groupId, artifactId, version);
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/4d9ad42b/platforms/camel-catalog-rest/src/main/java/org/apache/camel/catalog/rest/CamelConnectorCatalogRest.java
----------------------------------------------------------------------
diff --git a/platforms/camel-catalog-rest/src/main/java/org/apache/camel/catalog/rest/CamelConnectorCatalogRest.java b/platforms/camel-catalog-rest/src/main/java/org/apache/camel/catalog/rest/CamelConnectorCatalogRest.java
index 60b2455..e87124c 100644
--- a/platforms/camel-catalog-rest/src/main/java/org/apache/camel/catalog/rest/CamelConnectorCatalogRest.java
+++ b/platforms/camel-catalog-rest/src/main/java/org/apache/camel/catalog/rest/CamelConnectorCatalogRest.java
@@ -17,6 +17,7 @@
 package org.apache.camel.catalog.rest;
 
 import java.util.List;
+import java.util.Set;
 import javax.ws.rs.GET;
 import javax.ws.rs.POST;
 import javax.ws.rs.Path;
@@ -110,11 +111,11 @@ public class CamelConnectorCatalogRest {
 
     @POST
     @Path("/addConnectorFromMavenArtifact/{groupId}/{artifactId}/{version}")
-    @Produces("text/plain")
-    @ApiOperation(value = "Downloads the Maven artifact and scan for custom Camel connectors which will be added to the catalog")
-    public boolean addConnectorFromMavenArtifact(@ApiParam("The Maven groupId") @PathParam("groupId") String groupId,
-                                                 @ApiParam("The Maven artifactId") @PathParam("artifactId") String artifactId,
-                                                 @ApiParam("The Maven version") @PathParam("version") String version) {
+    @Produces("application/json")
+    @ApiOperation(value = "Downloads the Maven artifact and scan for custom Camel connectors which will be added to the catalog and returns the names of the found connectors")
+    public Set<String> addConnectorFromMavenArtifact(@ApiParam("The Maven groupId") @PathParam("groupId") String groupId,
+                                                     @ApiParam("The Maven artifactId") @PathParam("artifactId") String artifactId,
+                                                     @ApiParam("The Maven version") @PathParam("version") String version) {
         return maven.addArtifactToCatalog(null, catalog, groupId, artifactId, version);
     }
 


[2/4] camel git commit: CAMEL-10898: camel-catalog - Allow to add custom component/connector by download JAR via maven

Posted by da...@apache.org.
CAMEL-10898: camel-catalog - Allow to add custom component/connector by download JAR via maven


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/1df8a2a4
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/1df8a2a4
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/1df8a2a4

Branch: refs/heads/master
Commit: 1df8a2a4c2ce9b97da12e1aa13a104e7985677bb
Parents: eec3f84
Author: Claus Ibsen <da...@apache.org>
Authored: Mon Feb 27 13:38:19 2017 +0100
Committer: Claus Ibsen <da...@apache.org>
Committed: Mon Feb 27 14:07:45 2017 +0100

----------------------------------------------------------------------
 .../connector/CamelConnectorCatalog.java        | 10 +++
 .../catalog/connector/ConnectorDataStore.java   |  7 ++
 .../connector/DefaultCamelConnectorCatalog.java | 13 ++-
 .../connector/MemoryConnectorDataStore.java     |  5 ++
 .../connector/CamelConnectorCatalogTest.java    | 19 ++++-
 platforms/camel-catalog-maven/pom.xml           |  4 +
 .../catalog/maven/ConnectorArtifactHelper.java  | 59 ++++++++++++++
 .../maven/DefaultMavenArtifactProvider.java     | 54 +++++++++++--
 .../catalog/maven/MavenArtifactProvider.java    | 24 +++---
 .../maven/MavenArtifactProviderTest.java        | 30 ++++++-
 platforms/camel-catalog-nexus/pom.xml           |  4 +
 .../nexus/ComponentCatalogNexusRepository.java  | 83 ++++----------------
 12 files changed, 222 insertions(+), 90 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/1df8a2a4/platforms/camel-catalog-connector/src/main/java/org/apache/camel/catalog/connector/CamelConnectorCatalog.java
----------------------------------------------------------------------
diff --git a/platforms/camel-catalog-connector/src/main/java/org/apache/camel/catalog/connector/CamelConnectorCatalog.java b/platforms/camel-catalog-connector/src/main/java/org/apache/camel/catalog/connector/CamelConnectorCatalog.java
index 6e41646..c3b288f 100644
--- a/platforms/camel-catalog-connector/src/main/java/org/apache/camel/catalog/connector/CamelConnectorCatalog.java
+++ b/platforms/camel-catalog-connector/src/main/java/org/apache/camel/catalog/connector/CamelConnectorCatalog.java
@@ -31,6 +31,16 @@ public interface CamelConnectorCatalog {
     void setConnectorDataStore(ConnectorDataStore dataStore);
 
     /**
+     * Is the connector already registered in the catalog
+     *
+     * @param groupId               maven group id
+     * @param artifactId            maven artifact id
+     * @param version               maven version
+     * @return whether the catalog has the connector or not
+     */
+    boolean hasConnector(String groupId, String artifactId, String version);
+
+    /**
      * Adds or updates the connector to the catalog
      *
      * @param groupId               maven group id

http://git-wip-us.apache.org/repos/asf/camel/blob/1df8a2a4/platforms/camel-catalog-connector/src/main/java/org/apache/camel/catalog/connector/ConnectorDataStore.java
----------------------------------------------------------------------
diff --git a/platforms/camel-catalog-connector/src/main/java/org/apache/camel/catalog/connector/ConnectorDataStore.java b/platforms/camel-catalog-connector/src/main/java/org/apache/camel/catalog/connector/ConnectorDataStore.java
index f3ae803..fadfafb 100644
--- a/platforms/camel-catalog-connector/src/main/java/org/apache/camel/catalog/connector/ConnectorDataStore.java
+++ b/platforms/camel-catalog-connector/src/main/java/org/apache/camel/catalog/connector/ConnectorDataStore.java
@@ -33,6 +33,13 @@ public interface ConnectorDataStore {
     void addConnector(ConnectorDto dto, String connectorJson, String connectorSchemaJson);
 
     /**
+     * Is the connector already registered in the catalog
+     *
+     * @param dto  the connector dto
+     */
+    boolean hasConnector(ConnectorDto dto);
+
+    /**
      * Removes the connector from the catalog
      *
      * @param dto  the connector dto

http://git-wip-us.apache.org/repos/asf/camel/blob/1df8a2a4/platforms/camel-catalog-connector/src/main/java/org/apache/camel/catalog/connector/DefaultCamelConnectorCatalog.java
----------------------------------------------------------------------
diff --git a/platforms/camel-catalog-connector/src/main/java/org/apache/camel/catalog/connector/DefaultCamelConnectorCatalog.java b/platforms/camel-catalog-connector/src/main/java/org/apache/camel/catalog/connector/DefaultCamelConnectorCatalog.java
index d3272a2..e25af70 100644
--- a/platforms/camel-catalog-connector/src/main/java/org/apache/camel/catalog/connector/DefaultCamelConnectorCatalog.java
+++ b/platforms/camel-catalog-connector/src/main/java/org/apache/camel/catalog/connector/DefaultCamelConnectorCatalog.java
@@ -28,9 +28,17 @@ public class DefaultCamelConnectorCatalog implements CamelConnectorCatalog {
     }
 
     @Override
+    public boolean hasConnector(String groupId, String artifactId, String version) {
+        ConnectorDto dto = new ConnectorDto();
+        dto.setGroupId(groupId);
+        dto.setArtifactId(artifactId);
+        dto.setVersion(version);
+        return dataStore.hasConnector(dto);
+    }
+
+    @Override
     public void addConnector(String groupId, String artifactId, String version, String name, String description, String labels,
                              String connectorJson, String connectorSchemaJson) {
-
         ConnectorDto dto = new ConnectorDto();
         dto.setGroupId(groupId);
         dto.setArtifactId(artifactId);
@@ -38,18 +46,15 @@ public class DefaultCamelConnectorCatalog implements CamelConnectorCatalog {
         dto.setName(name);
         dto.setDescription(description);
         dto.setLabels(labels);
-
         dataStore.addConnector(dto, connectorJson, connectorSchemaJson);
     }
 
     @Override
     public void removeConnector(String groupId, String artifactId, String version) {
-
         ConnectorDto dto = new ConnectorDto();
         dto.setGroupId(groupId);
         dto.setArtifactId(artifactId);
         dto.setVersion(version);
-
         dataStore.removeConnector(dto);
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/1df8a2a4/platforms/camel-catalog-connector/src/main/java/org/apache/camel/catalog/connector/MemoryConnectorDataStore.java
----------------------------------------------------------------------
diff --git a/platforms/camel-catalog-connector/src/main/java/org/apache/camel/catalog/connector/MemoryConnectorDataStore.java b/platforms/camel-catalog-connector/src/main/java/org/apache/camel/catalog/connector/MemoryConnectorDataStore.java
index 495a7f7..ebb0a21 100644
--- a/platforms/camel-catalog-connector/src/main/java/org/apache/camel/catalog/connector/MemoryConnectorDataStore.java
+++ b/platforms/camel-catalog-connector/src/main/java/org/apache/camel/catalog/connector/MemoryConnectorDataStore.java
@@ -40,6 +40,11 @@ public class MemoryConnectorDataStore implements ConnectorDataStore {
     }
 
     @Override
+    public boolean hasConnector(ConnectorDto dto) {
+        return store.contains(new ConnectorDetails(dto, null, null));
+    }
+
+    @Override
     public void removeConnector(ConnectorDto dto) {
         store.remove(new ConnectorDetails(dto, null, null));
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/1df8a2a4/platforms/camel-catalog-connector/src/test/java/org/apache/camel/catalog/connector/CamelConnectorCatalogTest.java
----------------------------------------------------------------------
diff --git a/platforms/camel-catalog-connector/src/test/java/org/apache/camel/catalog/connector/CamelConnectorCatalogTest.java b/platforms/camel-catalog-connector/src/test/java/org/apache/camel/catalog/connector/CamelConnectorCatalogTest.java
index 972a2a6..2970fdd 100644
--- a/platforms/camel-catalog-connector/src/test/java/org/apache/camel/catalog/connector/CamelConnectorCatalogTest.java
+++ b/platforms/camel-catalog-connector/src/test/java/org/apache/camel/catalog/connector/CamelConnectorCatalogTest.java
@@ -16,10 +16,11 @@
  */
 package org.apache.camel.catalog.connector;
 
-import org.junit.Ignore;
 import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 
 public class CamelConnectorCatalogTest {
 
@@ -36,6 +37,22 @@ public class CamelConnectorCatalogTest {
     }
 
     @Test
+    public void testHasConnector() throws Exception {
+        CamelConnectorCatalog catalog = new DefaultCamelConnectorCatalog();
+
+        assertEquals(0, catalog.findConnector(false).size());
+
+        assertFalse(catalog.hasConnector("org.apache.camel", "myfoo-connector", "2.19.0"));
+
+        catalog.addConnector("org.apache.camel", "myfoo-connector", "2.19.0",
+            "MyFoo", "Something cool", "foo,timer", null, null);
+
+        assertEquals(1, catalog.findConnector(false).size());
+
+        assertTrue(catalog.hasConnector("org.apache.camel", "myfoo-connector", "2.19.0"));
+    }
+
+    @Test
     public void testRemoveConnector() throws Exception {
         CamelConnectorCatalog catalog = new DefaultCamelConnectorCatalog();
 

http://git-wip-us.apache.org/repos/asf/camel/blob/1df8a2a4/platforms/camel-catalog-maven/pom.xml
----------------------------------------------------------------------
diff --git a/platforms/camel-catalog-maven/pom.xml b/platforms/camel-catalog-maven/pom.xml
index e204c6a..f1f0ff9 100644
--- a/platforms/camel-catalog-maven/pom.xml
+++ b/platforms/camel-catalog-maven/pom.xml
@@ -42,6 +42,10 @@
       <groupId>org.apache.camel</groupId>
       <artifactId>camel-catalog</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.camel</groupId>
+      <artifactId>camel-catalog-connector</artifactId>
+    </dependency>
 
     <dependency>
       <groupId>org.slf4j</groupId>

http://git-wip-us.apache.org/repos/asf/camel/blob/1df8a2a4/platforms/camel-catalog-maven/src/main/java/org/apache/camel/catalog/maven/ConnectorArtifactHelper.java
----------------------------------------------------------------------
diff --git a/platforms/camel-catalog-maven/src/main/java/org/apache/camel/catalog/maven/ConnectorArtifactHelper.java b/platforms/camel-catalog-maven/src/main/java/org/apache/camel/catalog/maven/ConnectorArtifactHelper.java
new file mode 100644
index 0000000..98aeab0
--- /dev/null
+++ b/platforms/camel-catalog-maven/src/main/java/org/apache/camel/catalog/maven/ConnectorArtifactHelper.java
@@ -0,0 +1,59 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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 org.apache.camel.catalog.maven;
+
+import java.io.InputStream;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static org.apache.camel.catalog.CatalogHelper.loadText;
+
+public class ConnectorArtifactHelper {
+
+    private static final Logger LOG = LoggerFactory.getLogger(ComponentArtifactHelper.class);
+
+    private ConnectorArtifactHelper() {
+    }
+
+    public static String[] loadConnectorJSonSchema(ClassLoader classLoader) {
+        String[] answer = new String[2];
+
+        String path = "camel-connector.json";
+        try {
+            InputStream is = classLoader.getResourceAsStream(path);
+            if (is != null) {
+                answer[0] = loadText(is);
+            }
+        } catch (Throwable e) {
+            LOG.warn("Error loading " + path + " file", e);
+        }
+
+        path = "camel-connector-schema.json";
+        try {
+            InputStream is = classLoader.getResourceAsStream(path);
+            if (is != null) {
+                answer[1] = loadText(is);
+            }
+        } catch (Throwable e) {
+            LOG.warn("Error loading " + path + " file", e);
+        }
+
+        return answer;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/1df8a2a4/platforms/camel-catalog-maven/src/main/java/org/apache/camel/catalog/maven/DefaultMavenArtifactProvider.java
----------------------------------------------------------------------
diff --git a/platforms/camel-catalog-maven/src/main/java/org/apache/camel/catalog/maven/DefaultMavenArtifactProvider.java b/platforms/camel-catalog-maven/src/main/java/org/apache/camel/catalog/maven/DefaultMavenArtifactProvider.java
index cafbd4b..9933494 100644
--- a/platforms/camel-catalog-maven/src/main/java/org/apache/camel/catalog/maven/DefaultMavenArtifactProvider.java
+++ b/platforms/camel-catalog-maven/src/main/java/org/apache/camel/catalog/maven/DefaultMavenArtifactProvider.java
@@ -5,9 +5,9 @@
  * 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
- *
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
  * 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.
@@ -17,18 +17,24 @@
 package org.apache.camel.catalog.maven;
 
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.Map;
 import java.util.Properties;
 
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import groovy.grape.Grape;
 import groovy.lang.GroovyClassLoader;
 import org.apache.camel.catalog.CamelCatalog;
+import org.apache.camel.catalog.CollectionStringBuffer;
+import org.apache.camel.catalog.connector.CamelConnectorCatalog;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import static org.apache.camel.catalog.maven.ComponentArtifactHelper.extractComponentJavaType;
 import static org.apache.camel.catalog.maven.ComponentArtifactHelper.loadComponentJSonSchema;
 import static org.apache.camel.catalog.maven.ComponentArtifactHelper.loadComponentProperties;
+import static org.apache.camel.catalog.maven.ConnectorArtifactHelper.loadConnectorJSonSchema;
 
 /**
  * Default {@link MavenArtifactProvider} which uses Groovy Grape to download the artifact.
@@ -45,7 +51,8 @@ public class DefaultMavenArtifactProvider implements MavenArtifactProvider {
     }
 
     @Override
-    public boolean addArtifactToCatalog(CamelCatalog camelCatalog, String groupId, String artifactId, String version) {
+    public boolean addArtifactToCatalog(CamelCatalog camelCatalog, CamelConnectorCatalog camelConnectorCatalog,
+                                        String groupId, String artifactId, String version) {
         try {
             Grape.setEnableAutoDownload(true);
 
@@ -62,7 +69,12 @@ public class DefaultMavenArtifactProvider implements MavenArtifactProvider {
 
             // the classloader can load content from the downloaded JAR
             boolean found = false;
-            found |= scanCamelComponents(camelCatalog, classLoader);
+            if (camelCatalog != null) {
+                found |= scanCamelComponents(camelCatalog, classLoader);
+            }
+            if (camelConnectorCatalog != null) {
+                found |= scanCamelConnectors(camelConnectorCatalog, classLoader, groupId, artifactId, version);
+            }
 
             return found;
         } catch (Exception e) {
@@ -97,5 +109,37 @@ public class DefaultMavenArtifactProvider implements MavenArtifactProvider {
         return found;
     }
 
+    protected boolean scanCamelConnectors(CamelConnectorCatalog camelConnectorCatalog, ClassLoader classLoader,
+                                          String groupId, String artifactId, String version) {
+        boolean found = false;
+
+        String[] json = loadConnectorJSonSchema(classLoader);
+        if (json != null) {
+            if (!camelConnectorCatalog.hasConnector(groupId, artifactId, version)) {
+                try {
+                    ObjectMapper mapper = new ObjectMapper();
+                    JsonNode tree = mapper.readTree(json[0]);
+                    String name = tree.get("name").textValue();
+                    String description = tree.get("description").textValue();
+                    Iterator<JsonNode> it = tree.withArray("labels").iterator();
+
+                    CollectionStringBuffer csb = new CollectionStringBuffer(",");
+                    while (it.hasNext()) {
+                        String text = it.next().textValue();
+                        csb.append(text);
+                    }
+
+                    camelConnectorCatalog.addConnector(groupId, artifactId, version,
+                        name, description, csb.toString(), json[0], json[1]);
+
+                    found = true;
+                } catch (Throwable e) {
+                    LOG.warn("Error parsing Connector JSon due " + e.getMessage(), e);
+                }
+            }
+        }
+        return found;
+    }
+
 }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/1df8a2a4/platforms/camel-catalog-maven/src/main/java/org/apache/camel/catalog/maven/MavenArtifactProvider.java
----------------------------------------------------------------------
diff --git a/platforms/camel-catalog-maven/src/main/java/org/apache/camel/catalog/maven/MavenArtifactProvider.java b/platforms/camel-catalog-maven/src/main/java/org/apache/camel/catalog/maven/MavenArtifactProvider.java
index a96c2a8..d88fc2d 100644
--- a/platforms/camel-catalog-maven/src/main/java/org/apache/camel/catalog/maven/MavenArtifactProvider.java
+++ b/platforms/camel-catalog-maven/src/main/java/org/apache/camel/catalog/maven/MavenArtifactProvider.java
@@ -5,9 +5,9 @@
  * 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
- *
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
  * 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.
@@ -17,6 +17,7 @@
 package org.apache.camel.catalog.maven;
 
 import org.apache.camel.catalog.CamelCatalog;
+import org.apache.camel.catalog.connector.CamelConnectorCatalog;
 
 /**
  * Provider which allows downloading artifact using Maven and add content to the {@link CamelCatalog}.
@@ -33,13 +34,16 @@ public interface MavenArtifactProvider {
 
     /**
      * Downloads the artifact using the Maven coordinates and scans the JAR for Camel components
-     * which will be added to the CamelCatalog.
+     * which will be added to the CamelCatalog or CamelConnectorCatalog.
      *
-     * @param camelCatalog The Camel Catalog
-     * @param groupId      Maven group id
-     * @param artifactId   Maven artifact id
-     * @param version      Maven version
+     * @param camelCatalog          The Camel Catalog
+     * @param camelConnectorCatalog The Camel Connector Catalog
+     * @param groupId               Maven group id
+     * @param artifactId            Maven artifact id
+     * @param version               Maven version
      * @return <tt>true</tt> if anything was added to the catalog, <tt>false</tt> if not.
      */
-    boolean addArtifactToCatalog(CamelCatalog camelCatalog, String groupId, String artifactId, String version);
-}
+    boolean addArtifactToCatalog(CamelCatalog camelCatalog, CamelConnectorCatalog camelConnectorCatalog,
+                                 String groupId, String artifactId, String version);
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/1df8a2a4/platforms/camel-catalog-maven/src/test/java/org/apache/camel/catalog/maven/MavenArtifactProviderTest.java
----------------------------------------------------------------------
diff --git a/platforms/camel-catalog-maven/src/test/java/org/apache/camel/catalog/maven/MavenArtifactProviderTest.java b/platforms/camel-catalog-maven/src/test/java/org/apache/camel/catalog/maven/MavenArtifactProviderTest.java
index f1e42f0..93d7c12 100644
--- a/platforms/camel-catalog-maven/src/test/java/org/apache/camel/catalog/maven/MavenArtifactProviderTest.java
+++ b/platforms/camel-catalog-maven/src/test/java/org/apache/camel/catalog/maven/MavenArtifactProviderTest.java
@@ -16,9 +16,14 @@
  */
 package org.apache.camel.catalog.maven;
 
+import java.util.List;
+
 import junit.framework.TestCase;
 import org.apache.camel.catalog.CamelCatalog;
 import org.apache.camel.catalog.DefaultCamelCatalog;
+import org.apache.camel.catalog.connector.CamelConnectorCatalog;
+import org.apache.camel.catalog.connector.ConnectorDto;
+import org.apache.camel.catalog.connector.DefaultCamelConnectorCatalog;
 import org.junit.Test;
 
 public class MavenArtifactProviderTest extends TestCase {
@@ -30,11 +35,34 @@ public class MavenArtifactProviderTest extends TestCase {
 
         int before = camelCatalog.findComponentNames().size();
 
-        boolean found = provider.addArtifactToCatalog(camelCatalog, "org.apache.camel", "dummy-component", camelCatalog.getCatalogVersion());
+        boolean found = provider.addArtifactToCatalog(camelCatalog, null, "org.apache.camel", "dummy-component", camelCatalog.getCatalogVersion());
         assertTrue(found);
 
         int after = camelCatalog.findComponentNames().size();
 
         assertTrue("Should find 1 new component", after - before == 1);
     }
+
+    @Test
+    public void testAddConnector() {
+        CamelCatalog camelCatalog = new DefaultCamelCatalog();
+        CamelConnectorCatalog camelConnectorCatalog = new DefaultCamelConnectorCatalog();
+        MavenArtifactProvider provider = new DefaultMavenArtifactProvider();
+
+        int before = camelCatalog.findComponentNames().size();
+        List<ConnectorDto> list = camelConnectorCatalog.findConnector("foo", false);
+        assertEquals(0, list.size());
+
+        boolean found = provider.addArtifactToCatalog(camelCatalog, camelConnectorCatalog, "org.apache.camel", "myfoo-connector", camelCatalog.getCatalogVersion());
+        assertTrue(found);
+
+        int after = camelCatalog.findComponentNames().size();
+
+        assertTrue("Should find 1 new component", after - before == 1);
+
+        list = camelConnectorCatalog.findConnector("foo", false);
+        assertEquals(1, list.size());
+        assertEquals("MyFoo", list.get(0).getName());
+        assertTrue(camelCatalog.findComponentNames().contains("my-foo"));
+    }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/1df8a2a4/platforms/camel-catalog-nexus/pom.xml
----------------------------------------------------------------------
diff --git a/platforms/camel-catalog-nexus/pom.xml b/platforms/camel-catalog-nexus/pom.xml
index 0f5db2a..853226b 100644
--- a/platforms/camel-catalog-nexus/pom.xml
+++ b/platforms/camel-catalog-nexus/pom.xml
@@ -47,6 +47,10 @@
       <groupId>org.apache.camel</groupId>
       <artifactId>camel-catalog-connector</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.camel</groupId>
+      <artifactId>camel-catalog-maven</artifactId>
+    </dependency>
 
     <!-- testing -->
     <dependency>

http://git-wip-us.apache.org/repos/asf/camel/blob/1df8a2a4/platforms/camel-catalog-nexus/src/main/java/org/apache/camel/catalog/nexus/ComponentCatalogNexusRepository.java
----------------------------------------------------------------------
diff --git a/platforms/camel-catalog-nexus/src/main/java/org/apache/camel/catalog/nexus/ComponentCatalogNexusRepository.java b/platforms/camel-catalog-nexus/src/main/java/org/apache/camel/catalog/nexus/ComponentCatalogNexusRepository.java
index 72bcc9e..5d0d084 100644
--- a/platforms/camel-catalog-nexus/src/main/java/org/apache/camel/catalog/nexus/ComponentCatalogNexusRepository.java
+++ b/platforms/camel-catalog-nexus/src/main/java/org/apache/camel/catalog/nexus/ComponentCatalogNexusRepository.java
@@ -17,7 +17,6 @@
 package org.apache.camel.catalog.nexus;
 
 import java.io.IOException;
-import java.io.InputStream;
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.util.Properties;
@@ -25,7 +24,9 @@ import java.util.Set;
 
 import org.apache.camel.catalog.CamelCatalog;
 
-import static org.apache.camel.catalog.CatalogHelper.loadText;
+import static org.apache.camel.catalog.maven.ComponentArtifactHelper.extractComponentJavaType;
+import static org.apache.camel.catalog.maven.ComponentArtifactHelper.loadComponentJSonSchema;
+import static org.apache.camel.catalog.maven.ComponentArtifactHelper.loadComponentProperties;
 
 /**
  * Nexus repository that can scan for custom Camel components and add to the {@link org.apache.camel.catalog.CamelCatalog}.
@@ -94,19 +95,17 @@ public class ComponentCatalogNexusRepository extends BaseNexusRepository {
         try (URLClassLoader classLoader = new URLClassLoader(new URL[]{jarUrl})) {
             // is there any custom Camel components in this library?
             Properties properties = loadComponentProperties(classLoader);
-            if (properties != null) {
-                String components = (String) properties.get("components");
-                if (components != null) {
-                    String[] part = components.split("\\s");
-                    for (String scheme : part) {
-                        if (!getCamelCatalog().findComponentNames().contains(scheme)) {
-                            // find the class name
-                            String javaType = extractComponentJavaType(classLoader, scheme);
-                            if (javaType != null) {
-                                String json = loadComponentJSonSchema(classLoader, scheme);
-                                if (json != null) {
-                                    addComponent(dto, getCamelCatalog(), scheme, javaType, json);
-                                }
+            String components = (String) properties.get("components");
+            if (components != null) {
+                String[] part = components.split("\\s");
+                for (String scheme : part) {
+                    if (!getCamelCatalog().findComponentNames().contains(scheme)) {
+                        // find the class name
+                        String javaType = extractComponentJavaType(classLoader, scheme);
+                        if (javaType != null) {
+                            String json = loadComponentJSonSchema(classLoader, scheme);
+                            if (json != null) {
+                                addComponent(dto, getCamelCatalog(), scheme, javaType, json);
                             }
                         }
                     }
@@ -117,58 +116,4 @@ public class ComponentCatalogNexusRepository extends BaseNexusRepository {
         }
     }
 
-    private Properties loadComponentProperties(URLClassLoader classLoader) {
-        Properties answer = new Properties();
-        try {
-            // load the component files using the recommended way by a component.properties file
-            InputStream is = classLoader.getResourceAsStream("META-INF/services/org/apache/camel/component.properties");
-            if (is != null) {
-                answer.load(is);
-            }
-        } catch (Throwable e) {
-            log.warn("Error loading META-INF/services/org/apache/camel/component.properties file", e);
-        }
-        return answer;
-    }
-
-    private String extractComponentJavaType(URLClassLoader classLoader, String scheme) {
-        try {
-            InputStream is = classLoader.getResourceAsStream("META-INF/services/org/apache/camel/component/" + scheme);
-            if (is != null) {
-                Properties props = new Properties();
-                props.load(is);
-                return (String) props.get("class");
-            }
-        } catch (Throwable e) {
-            log.warn("Error loading META-INF/services/org/apache/camel/component/" + scheme + " file", e);
-        }
-
-        return null;
-    }
-
-    private String loadComponentJSonSchema(URLClassLoader classLoader, String scheme) {
-        String answer = null;
-
-        String path = null;
-        String javaType = extractComponentJavaType(classLoader, scheme);
-        if (javaType != null) {
-            int pos = javaType.lastIndexOf(".");
-            path = javaType.substring(0, pos);
-            path = path.replace('.', '/');
-            path = path + "/" + scheme + ".json";
-        }
-
-        if (path != null) {
-            try {
-                InputStream is = classLoader.getResourceAsStream(path);
-                if (is != null) {
-                    answer = loadText(is);
-                }
-            } catch (Throwable e) {
-                log.warn("Error loading " + path + " file", e);
-            }
-        }
-
-        return answer;
-    }
 }


[3/4] camel git commit: CAMEL-10898: camel-catalog - Allow to add custom component/connector by download JAR via maven

Posted by da...@apache.org.
CAMEL-10898: camel-catalog - Allow to add custom component/connector by download JAR via maven


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/c9e48179
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/c9e48179
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/c9e48179

Branch: refs/heads/master
Commit: c9e4817905ebd4d3ba985873845eff550104fdd0
Parents: 1df8a2a
Author: Claus Ibsen <da...@apache.org>
Authored: Mon Feb 27 13:56:27 2017 +0100
Committer: Claus Ibsen <da...@apache.org>
Committed: Mon Feb 27 14:07:45 2017 +0100

----------------------------------------------------------------------
 platforms/camel-catalog-rest/pom.xml            |  4 ++++
 .../camel/catalog/rest/CamelCatalogRest.java    | 22 ++++++++++++++++++++
 .../catalog/rest/CamelConnectorCatalogRest.java | 22 ++++++++++++++++++++
 3 files changed, 48 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/c9e48179/platforms/camel-catalog-rest/pom.xml
----------------------------------------------------------------------
diff --git a/platforms/camel-catalog-rest/pom.xml b/platforms/camel-catalog-rest/pom.xml
index 300ed6c..b84a0ad 100644
--- a/platforms/camel-catalog-rest/pom.xml
+++ b/platforms/camel-catalog-rest/pom.xml
@@ -40,6 +40,10 @@
       <groupId>org.apache.camel</groupId>
       <artifactId>camel-catalog-connector</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.camel</groupId>
+      <artifactId>camel-catalog-maven</artifactId>
+    </dependency>
 
     <!-- REST api -->
     <dependency>

http://git-wip-us.apache.org/repos/asf/camel/blob/c9e48179/platforms/camel-catalog-rest/src/main/java/org/apache/camel/catalog/rest/CamelCatalogRest.java
----------------------------------------------------------------------
diff --git a/platforms/camel-catalog-rest/src/main/java/org/apache/camel/catalog/rest/CamelCatalogRest.java b/platforms/camel-catalog-rest/src/main/java/org/apache/camel/catalog/rest/CamelCatalogRest.java
index d47ce27..5690279 100644
--- a/platforms/camel-catalog-rest/src/main/java/org/apache/camel/catalog/rest/CamelCatalogRest.java
+++ b/platforms/camel-catalog-rest/src/main/java/org/apache/camel/catalog/rest/CamelCatalogRest.java
@@ -19,6 +19,7 @@ package org.apache.camel.catalog.rest;
 import java.util.List;
 import java.util.Set;
 import javax.ws.rs.GET;
+import javax.ws.rs.POST;
 import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
@@ -28,6 +29,8 @@ import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import org.apache.camel.catalog.CamelCatalog;
 import org.apache.camel.catalog.DefaultCamelCatalog;
+import org.apache.camel.catalog.maven.DefaultMavenArtifactProvider;
+import org.apache.camel.catalog.maven.MavenArtifactProvider;
 
 /**
  * A REST based {@link CamelCatalog} service as a JAX-RS resource class.
@@ -37,6 +40,7 @@ import org.apache.camel.catalog.DefaultCamelCatalog;
 public class CamelCatalogRest {
 
     private CamelCatalog catalog = new DefaultCamelCatalog(true);
+    private MavenArtifactProvider maven = new DefaultMavenArtifactProvider();
 
     public CamelCatalog getCatalog() {
         return catalog;
@@ -284,4 +288,22 @@ public class CamelCatalogRest {
         return catalog.summaryAsJson();
     }
 
+    @POST
+    @Path("/addMavenRepository/{name}/{url}")
+    @ApiOperation(value = "Adds a third party Maven repository to use for downloading Maven artifacts")
+    public void addMavenRepository(@ApiParam("The name of the Maven repository") @PathParam("name") String name,
+                                   @ApiParam("The URL of the Maven repository") @PathParam("url") String url) {
+        maven.addMavenRepository(name, url);
+    }
+
+    @POST
+    @Path("/addComponentFromMavenArtifact/{groupId}/{artifactId}/{version}")
+    @Produces("text/plain")
+    @ApiOperation(value = "Downloads the Maven artifact and scan for custom Camel components which will be added to the catalog")
+    public boolean addComponentFromMavenArtifact(@ApiParam("The Maven groupId") @PathParam("groupId") String groupId,
+                                                 @ApiParam("The Maven artifactId") @PathParam("artifactId") String artifactId,
+                                                 @ApiParam("The Maven version") @PathParam("version") String version) {
+        return maven.addArtifactToCatalog(catalog, null, groupId, artifactId, version);
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/c9e48179/platforms/camel-catalog-rest/src/main/java/org/apache/camel/catalog/rest/CamelConnectorCatalogRest.java
----------------------------------------------------------------------
diff --git a/platforms/camel-catalog-rest/src/main/java/org/apache/camel/catalog/rest/CamelConnectorCatalogRest.java b/platforms/camel-catalog-rest/src/main/java/org/apache/camel/catalog/rest/CamelConnectorCatalogRest.java
index afe2445..60b2455 100644
--- a/platforms/camel-catalog-rest/src/main/java/org/apache/camel/catalog/rest/CamelConnectorCatalogRest.java
+++ b/platforms/camel-catalog-rest/src/main/java/org/apache/camel/catalog/rest/CamelConnectorCatalogRest.java
@@ -18,6 +18,7 @@ package org.apache.camel.catalog.rest;
 
 import java.util.List;
 import javax.ws.rs.GET;
+import javax.ws.rs.POST;
 import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
@@ -29,6 +30,8 @@ import io.swagger.annotations.ApiParam;
 import org.apache.camel.catalog.connector.CamelConnectorCatalog;
 import org.apache.camel.catalog.connector.ConnectorDto;
 import org.apache.camel.catalog.connector.DefaultCamelConnectorCatalog;
+import org.apache.camel.catalog.maven.DefaultMavenArtifactProvider;
+import org.apache.camel.catalog.maven.MavenArtifactProvider;
 
 /**
  * A REST based {@link CamelConnectorCatalog} service as a JAX-RS resource class.
@@ -38,6 +41,7 @@ import org.apache.camel.catalog.connector.DefaultCamelConnectorCatalog;
 public class CamelConnectorCatalogRest {
 
     private CamelConnectorCatalog catalog = new DefaultCamelConnectorCatalog();
+    private MavenArtifactProvider maven = new DefaultMavenArtifactProvider();
 
     public CamelConnectorCatalog getCatalog() {
         return catalog;
@@ -96,4 +100,22 @@ public class CamelConnectorCatalogRest {
         return catalog.connectorSchemaJSon(groupId, artifactId, version);
     }
 
+    @POST
+    @Path("/addMavenRepository/{name}/{url}")
+    @ApiOperation(value = "Adds a third party Maven repository to use for downloading Maven artifacts")
+    public void addMavenRepository(@ApiParam("The name of the Maven repository") @PathParam("name") String name,
+                                   @ApiParam("The URL of the Maven repository") @PathParam("url") String url) {
+        maven.addMavenRepository(name, url);
+    }
+
+    @POST
+    @Path("/addConnectorFromMavenArtifact/{groupId}/{artifactId}/{version}")
+    @Produces("text/plain")
+    @ApiOperation(value = "Downloads the Maven artifact and scan for custom Camel connectors which will be added to the catalog")
+    public boolean addConnectorFromMavenArtifact(@ApiParam("The Maven groupId") @PathParam("groupId") String groupId,
+                                                 @ApiParam("The Maven artifactId") @PathParam("artifactId") String artifactId,
+                                                 @ApiParam("The Maven version") @PathParam("version") String version) {
+        return maven.addArtifactToCatalog(null, catalog, groupId, artifactId, version);
+    }
+
 }


[4/4] camel git commit: CAMEL-10898: camel-catalog - Allow to add custom component/connector by download JAR via maven

Posted by da...@apache.org.
CAMEL-10898: camel-catalog - Allow to add custom component/connector by download JAR via maven


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/eec3f843
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/eec3f843
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/eec3f843

Branch: refs/heads/master
Commit: eec3f8436d6ef4db8ff3b76fca27c6880d00b1a9
Parents: 59170dd
Author: Claus Ibsen <da...@apache.org>
Authored: Mon Feb 27 13:12:47 2017 +0100
Committer: Claus Ibsen <da...@apache.org>
Committed: Mon Feb 27 14:07:45 2017 +0100

----------------------------------------------------------------------
 platforms/camel-catalog-maven/pom.xml           |   5 +
 .../catalog/maven/ComponentArtifactHelper.java  |  91 +++++++++++++++++
 .../maven/DefaultMavenArtifactProvider.java     | 101 +++++++++++++++++++
 .../catalog/maven/MavenArtifactProvider.java    |  45 +++++++++
 .../maven/MavenArtifactProviderTest.java        |  40 ++++++++
 5 files changed, 282 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/eec3f843/platforms/camel-catalog-maven/pom.xml
----------------------------------------------------------------------
diff --git a/platforms/camel-catalog-maven/pom.xml b/platforms/camel-catalog-maven/pom.xml
index cc82045..e204c6a 100644
--- a/platforms/camel-catalog-maven/pom.xml
+++ b/platforms/camel-catalog-maven/pom.xml
@@ -43,6 +43,11 @@
       <artifactId>camel-catalog</artifactId>
     </dependency>
 
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+    </dependency>
+
     <!-- use groovy grape to download JARs as that is easy to use -->
     <dependency>
       <groupId>org.codehaus.groovy</groupId>

http://git-wip-us.apache.org/repos/asf/camel/blob/eec3f843/platforms/camel-catalog-maven/src/main/java/org/apache/camel/catalog/maven/ComponentArtifactHelper.java
----------------------------------------------------------------------
diff --git a/platforms/camel-catalog-maven/src/main/java/org/apache/camel/catalog/maven/ComponentArtifactHelper.java b/platforms/camel-catalog-maven/src/main/java/org/apache/camel/catalog/maven/ComponentArtifactHelper.java
new file mode 100644
index 0000000..234ee69
--- /dev/null
+++ b/platforms/camel-catalog-maven/src/main/java/org/apache/camel/catalog/maven/ComponentArtifactHelper.java
@@ -0,0 +1,91 @@
+/**
+ * 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 org.apache.camel.catalog.maven;
+
+import java.io.InputStream;
+import java.util.Properties;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static org.apache.camel.catalog.CatalogHelper.loadText;
+
+/**
+ * Helper methods for loading content from Camel components that the {@link org.apache.camel.catalog.CamelCatalog} requires.
+ */
+public final class ComponentArtifactHelper {
+
+    private static final Logger LOG = LoggerFactory.getLogger(ComponentArtifactHelper.class);
+
+    private ComponentArtifactHelper() {
+    }
+
+    public static Properties loadComponentProperties(ClassLoader classLoader) {
+        Properties answer = new Properties();
+        try {
+            // load the component files using the recommended way by a component.properties file
+            InputStream is = classLoader.getResourceAsStream("META-INF/services/org/apache/camel/component.properties");
+            if (is != null) {
+                answer.load(is);
+            }
+        } catch (Throwable e) {
+            LOG.warn("Error loading META-INF/services/org/apache/camel/component.properties file", e);
+        }
+        return answer;
+    }
+
+    public static String extractComponentJavaType(ClassLoader classLoader, String scheme) {
+        try {
+            InputStream is = classLoader.getResourceAsStream("META-INF/services/org/apache/camel/component/" + scheme);
+            if (is != null) {
+                Properties props = new Properties();
+                props.load(is);
+                return (String) props.get("class");
+            }
+        } catch (Throwable e) {
+            LOG.warn("Error loading META-INF/services/org/apache/camel/component/" + scheme + " file", e);
+        }
+
+        return null;
+    }
+
+    public static String loadComponentJSonSchema(ClassLoader classLoader, String scheme) {
+        String answer = null;
+
+        String path = null;
+        String javaType = extractComponentJavaType(classLoader, scheme);
+        if (javaType != null) {
+            int pos = javaType.lastIndexOf(".");
+            path = javaType.substring(0, pos);
+            path = path.replace('.', '/');
+            path = path + "/" + scheme + ".json";
+        }
+
+        if (path != null) {
+            try {
+                InputStream is = classLoader.getResourceAsStream(path);
+                if (is != null) {
+                    answer = loadText(is);
+                }
+            } catch (Throwable e) {
+                LOG.warn("Error loading " + path + " file", e);
+            }
+        }
+
+        return answer;
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/eec3f843/platforms/camel-catalog-maven/src/main/java/org/apache/camel/catalog/maven/DefaultMavenArtifactProvider.java
----------------------------------------------------------------------
diff --git a/platforms/camel-catalog-maven/src/main/java/org/apache/camel/catalog/maven/DefaultMavenArtifactProvider.java b/platforms/camel-catalog-maven/src/main/java/org/apache/camel/catalog/maven/DefaultMavenArtifactProvider.java
new file mode 100644
index 0000000..cafbd4b
--- /dev/null
+++ b/platforms/camel-catalog-maven/src/main/java/org/apache/camel/catalog/maven/DefaultMavenArtifactProvider.java
@@ -0,0 +1,101 @@
+/**
+ * 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 org.apache.camel.catalog.maven;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+import groovy.grape.Grape;
+import groovy.lang.GroovyClassLoader;
+import org.apache.camel.catalog.CamelCatalog;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static org.apache.camel.catalog.maven.ComponentArtifactHelper.extractComponentJavaType;
+import static org.apache.camel.catalog.maven.ComponentArtifactHelper.loadComponentJSonSchema;
+import static org.apache.camel.catalog.maven.ComponentArtifactHelper.loadComponentProperties;
+
+/**
+ * Default {@link MavenArtifactProvider} which uses Groovy Grape to download the artifact.
+ */
+public class DefaultMavenArtifactProvider implements MavenArtifactProvider {
+
+    private static final Logger LOG = LoggerFactory.getLogger(DefaultMavenArtifactProvider.class);
+
+    public void addMavenRepository(String name, String url) {
+        Map<String, Object> repo = new HashMap<>();
+        repo.put("name", name);
+        repo.put("root", url);
+        Grape.addResolver(repo);
+    }
+
+    @Override
+    public boolean addArtifactToCatalog(CamelCatalog camelCatalog, String groupId, String artifactId, String version) {
+        try {
+            Grape.setEnableAutoDownload(true);
+
+            final ClassLoader classLoader = new GroovyClassLoader();
+
+            Map<String, Object> param = new HashMap<>();
+            param.put("classLoader", classLoader);
+            param.put("group", groupId);
+            param.put("module", artifactId);
+            param.put("version", version);
+
+            LOG.debug("Downloading {}:{}:{}", groupId, artifactId, version);
+            Grape.grab(param);
+
+            // the classloader can load content from the downloaded JAR
+            boolean found = false;
+            found |= scanCamelComponents(camelCatalog, classLoader);
+
+            return found;
+        } catch (Exception e) {
+            return false;
+        }
+    }
+
+    protected boolean scanCamelComponents(CamelCatalog camelCatalog, ClassLoader classLoader) {
+        boolean found = false;
+        // is there any custom Camel components in this library?
+        Properties properties = loadComponentProperties(classLoader);
+        if (properties != null) {
+            String components = (String) properties.get("components");
+            if (components != null) {
+                String[] part = components.split("\\s");
+                for (String scheme : part) {
+                    if (!camelCatalog.findComponentNames().contains(scheme)) {
+                        // find the class name
+                        String javaType = extractComponentJavaType(classLoader, scheme);
+                        if (javaType != null) {
+                            String json = loadComponentJSonSchema(classLoader, scheme);
+                            if (json != null) {
+                                LOG.debug("Adding component: {}", scheme);
+                                camelCatalog.addComponent(scheme, javaType, json);
+                                found = true;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return found;
+    }
+
+}
+

http://git-wip-us.apache.org/repos/asf/camel/blob/eec3f843/platforms/camel-catalog-maven/src/main/java/org/apache/camel/catalog/maven/MavenArtifactProvider.java
----------------------------------------------------------------------
diff --git a/platforms/camel-catalog-maven/src/main/java/org/apache/camel/catalog/maven/MavenArtifactProvider.java b/platforms/camel-catalog-maven/src/main/java/org/apache/camel/catalog/maven/MavenArtifactProvider.java
new file mode 100644
index 0000000..a96c2a8
--- /dev/null
+++ b/platforms/camel-catalog-maven/src/main/java/org/apache/camel/catalog/maven/MavenArtifactProvider.java
@@ -0,0 +1,45 @@
+/**
+ * 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 org.apache.camel.catalog.maven;
+
+import org.apache.camel.catalog.CamelCatalog;
+
+/**
+ * Provider which allows downloading artifact using Maven and add content to the {@link CamelCatalog}.
+ */
+public interface MavenArtifactProvider {
+
+    /**
+     * To add a 3rd party Maven repository.
+     *
+     * @param name the repository name
+     * @param url  the repository url
+     */
+    void addMavenRepository(String name, String url);
+
+    /**
+     * Downloads the artifact using the Maven coordinates and scans the JAR for Camel components
+     * which will be added to the CamelCatalog.
+     *
+     * @param camelCatalog The Camel Catalog
+     * @param groupId      Maven group id
+     * @param artifactId   Maven artifact id
+     * @param version      Maven version
+     * @return <tt>true</tt> if anything was added to the catalog, <tt>false</tt> if not.
+     */
+    boolean addArtifactToCatalog(CamelCatalog camelCatalog, String groupId, String artifactId, String version);
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/eec3f843/platforms/camel-catalog-maven/src/test/java/org/apache/camel/catalog/maven/MavenArtifactProviderTest.java
----------------------------------------------------------------------
diff --git a/platforms/camel-catalog-maven/src/test/java/org/apache/camel/catalog/maven/MavenArtifactProviderTest.java b/platforms/camel-catalog-maven/src/test/java/org/apache/camel/catalog/maven/MavenArtifactProviderTest.java
new file mode 100644
index 0000000..f1e42f0
--- /dev/null
+++ b/platforms/camel-catalog-maven/src/test/java/org/apache/camel/catalog/maven/MavenArtifactProviderTest.java
@@ -0,0 +1,40 @@
+/**
+ * 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 org.apache.camel.catalog.maven;
+
+import junit.framework.TestCase;
+import org.apache.camel.catalog.CamelCatalog;
+import org.apache.camel.catalog.DefaultCamelCatalog;
+import org.junit.Test;
+
+public class MavenArtifactProviderTest extends TestCase {
+
+    @Test
+    public void testAddComponent() {
+        CamelCatalog camelCatalog = new DefaultCamelCatalog();
+        MavenArtifactProvider provider = new DefaultMavenArtifactProvider();
+
+        int before = camelCatalog.findComponentNames().size();
+
+        boolean found = provider.addArtifactToCatalog(camelCatalog, "org.apache.camel", "dummy-component", camelCatalog.getCatalogVersion());
+        assertTrue(found);
+
+        int after = camelCatalog.findComponentNames().size();
+
+        assertTrue("Should find 1 new component", after - before == 1);
+    }
+}