/** * 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.rest; import java.util.List; import java.util.Map; import java.util.Set; import javax.ws.rs.Consumes; 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; import javax.ws.rs.QueryParam; import com.fasterxml.jackson.databind.ObjectMapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; 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. */ @Api(value = "/camel-connector-catalog", description = "Camel Connector Catalog REST API") @Path("/camel-connector-catalog") public class CamelConnectorCatalogRest { private CamelConnectorCatalog catalog = new DefaultCamelConnectorCatalog(); private MavenArtifactProvider maven = new DefaultMavenArtifactProvider(); public CamelConnectorCatalog getCatalog() { return catalog; } /** * To inject an existing {@link CamelConnectorCatalog} */ public void setCatalog(CamelConnectorCatalog catalog) { this.catalog = catalog; } @GET @Path("/findConnector") @Produces("application/json") @ApiOperation(value = "Find all the connectors from the catalog") public List<ConnectorDto> findConnector(@ApiParam(value = "Whether to include latest version only", defaultValue = "true") @QueryParam("latestVersionOnly") Boolean latestVersionOnly) { boolean latest = latestVersionOnly != null ? latestVersionOnly : true; return catalog.findConnector(latest); } @GET @Path("/findConnector/{filter}") @Produces("application/json") @ApiOperation(value = "Find all the connectors from the catalog") public List<ConnectorDto> findConnector(@ApiParam("Filter the connector matching by name, description or labels") @PathParam("filter") String filter, @ApiParam(value = "Whether to include latest version only", defaultValue = "true") @QueryParam("latestVersionOnly") Boolean latestVersionOnly) { boolean latest = latestVersionOnly != null ? latestVersionOnly : true; return catalog.findConnector(latest); } @GET @Path("/connectorJSon/{groupId}/{artifactId}/{version}") @Produces("application/json") @ApiOperation(value = "Returns the camel-connector json file for the given connector with the Maven coordinate") public String connectorJSon(@ApiParam(value = "Maven groupdId of the connector", required = true) @PathParam("groupId") String groupId, @ApiParam(value = "Maven artifactId of the connector", required = true) @PathParam("artifactId") String artifactId, @ApiParam(value = "Maven version of the connector", required = true) @PathParam("version") String version) { return catalog.connectorJSon(groupId, artifactId, version); } @GET @Path("/connectorSchemaJSon/{groupId}/{artifactId}/{version}") @Produces("application/json") @ApiOperation(value = "Returns the camel-connector-schema json file for the given connector with the Maven coordinate") public String connectorSchemaJSon(@ApiParam(value = "Maven groupdId of the connector", required = true) @PathParam("groupId") String groupId, @ApiParam(value = "Maven artifactId of the connector", required = true) @PathParam("artifactId") String artifactId, @ApiParam(value = "Maven version of the connector", required = true) @PathParam("version") String version) { return catalog.connectorSchemaJSon(groupId, artifactId, version); } @POST @Path("/asEndpointUri/{scheme}") @Consumes("application/json") @Produces("text/plain") @ApiOperation(value = "Creates an endpoint uri in Java style configured using the provided options in the JSon body") public String asEndpointUri(@ApiParam(value = "The component scheme", readOnly = true) @PathParam("scheme") String scheme, @ApiParam(value = "The options as a JSon map with key/value pairs", required = true) String json) { try { ObjectMapper mapper = new ObjectMapper(); Map map = mapper.readValue(json, Map.class); return catalog.asEndpointUri(scheme, map, true); } catch (Exception e) { return null; } } @POST @Path("/asEndpointUriXml/{scheme}") @Consumes("application/json") @Produces("text/plain") @ApiOperation(value = "Creates an endpoint uri in XML style configured using the provided options in the JSon body") public String asEndpointUriXml(@ApiParam(value = "The component scheme", readOnly = true) @PathParam("scheme") String scheme, @ApiParam(value = "The options as a JSon map with key/value pairs", required = true) String json) { try { ObjectMapper mapper = new ObjectMapper(); Map map = mapper.readValue(json, Map.class); return catalog.asEndpointUriXml(scheme, map, true); } catch (Exception e) { return null; } } @POST @Path("/mavenCacheDirectory/{name}") @ApiOperation(value = "Configures the Maven cache directory to use when downloading artifacts") public void mavenCacheDirectory(@ApiParam(value = "The name of the cache directory", required = true) @PathParam("name") String name) { maven.setCacheDirectory(name); } @POST @Path("/addMavenRepository/{name}/{url}") @ApiOperation(value = "Adds a third party Maven repository to use for downloading Maven artifacts") public void addMavenRepository(@ApiParam(value = "The name of the Maven repository", required = true) @PathParam("name") String name, @ApiParam(value = "The URL of the Maven repository", required = true) @PathParam("url") String url) { maven.addMavenRepository(name, url); } @POST @Path("/addConnectorFromMavenArtifact/{groupId}/{artifactId}/{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(value = "The Maven groupId", required = true) @PathParam("groupId") String groupId, @ApiParam(value = "The Maven artifactId", required = true) @PathParam("artifactId") String artifactId, @ApiParam(value = "The Maven version", required = true) @PathParam("version") String version) { return maven.addArtifactToCatalog(null, catalog, groupId, artifactId, version); } }