/**
* 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 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.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.
*/
@Api(value = "/camel-catalog", description = "Camel Catalog REST API")
@Path("/camel-catalog")
public class CamelCatalogRest {
private CamelCatalog catalog = new DefaultCamelCatalog(true);
private MavenArtifactProvider maven = new DefaultMavenArtifactProvider();
public CamelCatalog getCatalog() {
return catalog;
}
/**
* To inject an existing {@link CamelCatalog}
*/
public void setCatalog(CamelCatalog catalog) {
this.catalog = catalog;
}
@GET
@Path("/catalogVersion")
@Produces("text/plain")
@ApiOperation(value = "The version of this Camel Catalog")
public String getCatalogVersion() {
return catalog.getCatalogVersion();
}
@GET
@Path("/findComponentNames")
@Produces("application/json")
@ApiOperation(value = "Find all the component names from the Camel catalog")
public List<String> findComponentNames() {
return catalog.findComponentNames();
}
@GET
@Path("/findDataFormatNames")
@Produces("application/json")
@ApiOperation(value = "Find all the data format names from the Camel catalog")
public List<String> findDataFormatNames() {
return catalog.findDataFormatNames();
}
@GET
@Path("/findLanguageNames")
@Produces("application/json")
@ApiOperation(value = "Find all the language names from the Camel catalog")
public List<String> findLanguageNames() {
return catalog.findLanguageNames();
}
@GET
@Path("/findModelNames")
@Produces("application/json")
@ApiOperation(value = "Find all the model (EIP) names from the Camel catalog")
public List<String> findModelNames() {
return catalog.findModelNames();
}
@GET
@Path("/findComponentNames/{filter}")
@Produces("application/json")
@ApiOperation(value = "Find all the component names from the Camel catalog that matches the label")
public List<String> findComponentNames(@ApiParam("Filter used to only return component names that matches by their labels")
@PathParam("filter") String filter) {
return catalog.findComponentNames(filter);
}
@GET
@Path("/findDataFormatNames/{filter}")
@Produces("application/json")
@ApiOperation(value = "Find all the data format names from the Camel catalog that matches the label")
public List<String> findDataFormatNames(@ApiParam("Filter used to only return data format names that matches by their labels")
@PathParam("filter") String filter) {
return catalog.findDataFormatNames(filter);
}
@GET
@Path("/findLanguageNames/{filter}")
@Produces("application/json")
@ApiOperation(value = "Find all the language names from the Camel catalog that matches the label")
public List<String> findLanguageNames(@ApiParam("Filter used to only return language names that matches by their labels")
@PathParam("filter") String filter) {
return catalog.findLanguageNames(filter);
}
@GET
@Path("/findModelNames/{filter}")
@Produces("application/json")
@ApiOperation(value = "Find all the model (EIP) names from the Camel catalog that matches the label")
public List<String> findModelNames(@ApiParam("Filter used to only return model (EIP) names that matches by their labels")
@PathParam("filter") String filter) {
return catalog.findModelNames(filter);
}
@GET
@Path("/componentJSonSchema/{name}")
@Produces("application/json")
@ApiOperation(value = "Returns the component information as JSon format")
public String componentJSonSchema(@ApiParam(value = "The name of the component", required = true)
@PathParam("name") String name) {
return catalog.componentJSonSchema(name);
}
@GET
@Path("/dataFormatJSonSchema/{name}")
@Produces("application/json")
@ApiOperation(value = "Returns the data format information as JSon format")
public String dataFormatJSonSchema(@ApiParam(value = "The name of the data format", required = true)
@PathParam("name") String name) {
return catalog.dataFormatJSonSchema(name);
}
@GET
@Path("/languageJSonSchema/{name}")
@Produces("application/json")
@ApiOperation(value = "Returns the language information as JSon format")
public String languageJSonSchema(@ApiParam(value = "The name of the language", required = true)
@PathParam("name") String name) {
return catalog.languageJSonSchema(name);
}
@GET
@Path("/modelJSonSchema/{name}")
@Produces("application/json")
@ApiOperation(value = "Returns the model (EIP) information as JSon format")
public String modelJSonSchema(@ApiParam(value = "The name of the model (EIP)", required = true)
@PathParam("name") String name) {
return catalog.modelJSonSchema(name);
}
@GET
@Path("/componentAsciiDoc/{name}")
@Produces("text/plain")
@ApiOperation(value = "Returns the component documentation as Ascii doc format")
public String componentAsciiDoc(@ApiParam(value = "The name of the component", required = true)
@PathParam("name") String name) {
return catalog.componentAsciiDoc(name);
}
@GET
@Path("/dataFormatAsciiDoc/{name}")
@Produces("text/plain")
@ApiOperation(value = "Returns the data format documentation as Ascii doc format")
public String dataFormatAsciiDoc(@ApiParam(value = "The name of the data format", required = true)
@PathParam("name") String name) {
return catalog.dataFormatAsciiDoc(name);
}
@GET
@Path("/languageAsciiDoc/{name}")
@Produces("text/plain")
@ApiOperation(value = "Returns the language documentation as Ascii doc format")
public String languageAsciiDoc(@ApiParam(value = "The name of the language", required = true)
@PathParam("name") String name) {
return catalog.languageAsciiDoc(name);
}
@GET
@Path("/findComponentLabels")
@Produces("application/json")
@ApiOperation(value = "Find all the unique label names all the components are using")
public Set<String> findComponentLabels() {
return catalog.findComponentLabels();
}
@GET
@Path("/findDataFormatLabels")
@Produces("application/json")
@ApiOperation(value = "Find all the unique label names all the data formats are using")
public Set<String> findDataFormatLabels() {
return catalog.findDataFormatLabels();
}
@GET
@Path("/findLanguageLabels")
@Produces("application/json")
@ApiOperation(value = "Find all the unique label names all the languages are using")
public Set<String> findLanguageLabels() {
return catalog.findLanguageLabels();
}
@GET
@Path("/findModelLabels")
@Produces("application/json")
@ApiOperation(value = "Find all the unique label names all the models (EIP) are using.")
public Set<String> findModelLabels() {
return catalog.findModelLabels();
}
@GET
@Path("/archetypeCatalogAsXml")
@Produces("application/xml")
@ApiOperation(value = "Returns the Apache Camel Maven Archetype catalog in XML format")
public String archetypeCatalogAsXml() {
return catalog.archetypeCatalogAsXml();
}
@GET
@Path("/springSchemaAsXml")
@Produces("application/xml")
@ApiOperation(value = "Returns the Camel Spring XML schema")
public String springSchemaAsXml() {
return catalog.springSchemaAsXml();
}
@GET
@Path("/blueprintSchemaAsXml")
@Produces("application/xml")
@ApiOperation(value = "Returns the Camel Blueprint XML schema")
public String blueprintSchemaAsXml() {
return catalog.blueprintSchemaAsXml();
}
@GET
@Path("/listComponentsAsJson")
@Produces("application/json")
@ApiOperation(value = "Lists all the components summary details in JSon")
public String listComponentsAsJson() {
return catalog.listComponentsAsJson();
}
@GET
@Path("/listDataFormatsAsJson")
@Produces("application/json")
@ApiOperation(value = "Lists all the data formats summary details in JSon")
public String listDataFormatsAsJson() {
return catalog.listDataFormatsAsJson();
}
@GET
@Path("/listLanguagesAsJson")
@Produces("application/json")
@ApiOperation(value = "Lists all the languages summary details in JSon")
public String listLanguagesAsJson() {
return catalog.listLanguagesAsJson();
}
@GET
@Path("/listModelsAsJson")
@Produces("application/json")
@ApiOperation(value = "Lists all the models (EIP) summary details in JSon")
public String listModelsAsJson() {
return catalog.listModelsAsJson();
}
@GET
@Path("/summaryAsJson")
@Produces("application/json")
@ApiOperation(value = "Reports a summary what the catalog contains in JSon")
public String summaryAsJson() {
return catalog.summaryAsJson();
}
@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("/addComponentFromMavenArtifact/{groupId}/{artifactId}/{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(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(catalog, null, groupId, artifactId, version);
}
}