blob: 4fde3460e0f58a49558154495b37dcd73429c487 [file] [log] [blame]
/**
* 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;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.regex.PatternSyntaxException;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
/**
* Default {@link CamelCatalog}.
*/
public class DefaultCamelCatalog extends AbstractCamelCatalog implements CamelCatalog {
private static final String MODELS_CATALOG = "org/apache/camel/catalog/models.properties";
private static final String MODEL_DIR = "org/apache/camel/catalog/models";
private static final String DOC_DIR = "org/apache/camel/catalog/docs";
private static final String ARCHETYPES_CATALOG = "org/apache/camel/catalog/archetypes/archetype-catalog.xml";
private static final String SCHEMAS_XML = "org/apache/camel/catalog/schemas";
private final VersionHelper version = new VersionHelper();
// 3rd party components/data-formats
private final Map<String, String> extraComponents = new HashMap<>();
private final Map<String, String> extraComponentsJSonSchema = new HashMap<>();
private final Map<String, String> extraDataFormats = new HashMap<>();
private final Map<String, String> extraDataFormatsJSonSchema = new HashMap<>();
// cache of operation -> result
private final Map<String, Object> cache = new HashMap<>();
private boolean caching;
private VersionManager versionManager = new DefaultVersionManager(this);
private RuntimeProvider runtimeProvider = new DefaultRuntimeProvider(this);
/**
* Creates the {@link CamelCatalog} without caching enabled.
*/
public DefaultCamelCatalog() {
this(false);
}
/**
* Creates the {@link CamelCatalog}
*
* @param caching whether to use cache
*/
public DefaultCamelCatalog(boolean caching) {
this.caching = caching;
setJSonSchemaResolver(new CamelCatalogJSonSchemaResolver(this, extraComponents, extraComponentsJSonSchema, extraDataFormats, extraDataFormatsJSonSchema));
}
@Override
public RuntimeProvider getRuntimeProvider() {
return runtimeProvider;
}
@Override
public void setRuntimeProvider(RuntimeProvider runtimeProvider) {
this.runtimeProvider = runtimeProvider;
// inject CamelCatalog to the provider
this.runtimeProvider.setCamelCatalog(this);
// invalidate the cache
cache.remove("findComponentNames");
cache.remove("listComponentsAsJson");
cache.remove("findDataFormatNames");
cache.remove("listDataFormatsAsJson");
cache.remove("findLanguageNames");
cache.remove("listLanguagesAsJson");
}
@Override
public void enableCache() {
caching = true;
}
@Override
public boolean isCaching() {
return caching;
}
@Override
public void setVersionManager(VersionManager versionManager) {
this.versionManager = versionManager;
}
@Override
public VersionManager getVersionManager() {
return versionManager;
}
@Override
public void addComponent(String name, String className) {
extraComponents.put(name, className);
// invalidate the cache
cache.remove("findComponentNames");
cache.remove("findComponentLabels");
cache.remove("listComponentsAsJson");
}
@Override
public void addComponent(String name, String className, String jsonSchema) {
addComponent(name, className);
if (jsonSchema != null) {
extraComponentsJSonSchema.put(name, jsonSchema);
}
}
@Override
public void addDataFormat(String name, String className) {
extraDataFormats.put(name, className);
// invalidate the cache
cache.remove("findDataFormatNames");
cache.remove("findDataFormatLabels");
cache.remove("listDataFormatsAsJson");
}
@Override
public void addDataFormat(String name, String className, String jsonSchema) {
addDataFormat(name, className);
if (jsonSchema != null) {
extraDataFormatsJSonSchema.put(name, jsonSchema);
}
}
@Override
public String getCatalogVersion() {
return version.getVersion();
}
@Override
public boolean loadVersion(String version) {
if (version.equals(versionManager.getLoadedVersion())) {
return true;
} else if (versionManager.loadVersion(version)) {
// invalidate existing cache if we loaded a new version
cache.clear();
return true;
}
return false;
}
@Override
public String getLoadedVersion() {
return versionManager.getLoadedVersion();
}
@Override
public String getRuntimeProviderLoadedVersion() {
return versionManager.getRuntimeProviderLoadedVersion();
}
@Override
public boolean loadRuntimeProviderVersion(String groupId, String artifactId, String version) {
return versionManager.loadRuntimeProviderVersion(groupId, artifactId, version);
}
@Override
@SuppressWarnings("unchecked")
public List<String> findComponentNames() {
List<String> names = null;
if (caching) {
names = (List<String>) cache.get("findComponentNames");
}
if (names == null) {
names = runtimeProvider.findComponentNames();
// include third party components
for (Map.Entry<String, String> entry : extraComponents.entrySet()) {
names.add(entry.getKey());
}
// sort the names
Collections.sort(names);
if (caching) {
cache.put("findComponentNames", names);
}
}
return names;
}
@Override
@SuppressWarnings("unchecked")
public List<String> findDataFormatNames() {
List<String> names = null;
if (caching) {
names = (List<String>) cache.get("findDataFormatNames");
}
if (names == null) {
names = runtimeProvider.findDataFormatNames();
// include third party data formats
for (Map.Entry<String, String> entry : extraDataFormats.entrySet()) {
names.add(entry.getKey());
}
// sort the names
Collections.sort(names);
if (caching) {
cache.put("findDataFormatNames", names);
}
}
return names;
}
@Override
@SuppressWarnings("unchecked")
public List<String> findLanguageNames() {
List<String> names = null;
if (caching) {
names = (List<String>) cache.get("findLanguageNames");
}
if (names == null) {
names = runtimeProvider.findLanguageNames();
if (caching) {
cache.put("findLanguageNames", names);
}
}
return names;
}
@Override
@SuppressWarnings("unchecked")
public List<String> findModelNames() {
List<String> names = null;
if (caching) {
names = (List<String>) cache.get("findModelNames");
}
if (names == null) {
names = new ArrayList<>();
InputStream is = versionManager.getResourceAsStream(MODELS_CATALOG);
if (is != null) {
try {
CatalogHelper.loadLines(is, names);
} catch (IOException e) {
// ignore
}
}
if (caching) {
cache.put("findModelNames", names);
}
}
return names;
}
@Override
@SuppressWarnings("unchecked")
public List<String> findOtherNames() {
List<String> names = null;
if (caching) {
names = (List<String>) cache.get("findOtherNames");
}
if (names == null) {
names = runtimeProvider.findOtherNames();
if (caching) {
cache.put("findOtherNames", names);
}
}
return names;
}
@Override
public List<String> findModelNames(String filter) {
// should not cache when filter parameter can by any kind of value
List<String> answer = new ArrayList<>();
List<String> names = findModelNames();
for (String name : names) {
String json = modelJSonSchema(name);
if (json != null) {
List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("model", json, false);
for (Map<String, String> row : rows) {
if (row.containsKey("label")) {
String label = row.get("label");
String[] parts = label.split(",");
for (String part : parts) {
try {
if (part.equalsIgnoreCase(filter) || CatalogHelper.matchWildcard(part, filter) || part.matches(filter)) {
answer.add(name);
}
} catch (PatternSyntaxException e) {
// ignore as filter is maybe not a pattern
}
}
}
}
}
}
return answer;
}
@Override
public List<String> findComponentNames(String filter) {
// should not cache when filter parameter can by any kind of value
List<String> answer = new ArrayList<>();
List<String> names = findComponentNames();
for (String name : names) {
String json = componentJSonSchema(name);
if (json != null) {
List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("component", json, false);
for (Map<String, String> row : rows) {
if (row.containsKey("label")) {
String label = row.get("label");
String[] parts = label.split(",");
for (String part : parts) {
try {
if (part.equalsIgnoreCase(filter) || CatalogHelper.matchWildcard(part, filter) || part.matches(filter)) {
answer.add(name);
}
} catch (PatternSyntaxException e) {
// ignore as filter is maybe not a pattern
}
}
}
}
}
}
return answer;
}
@Override
public List<String> findDataFormatNames(String filter) {
// should not cache when filter parameter can by any kind of value
List<String> answer = new ArrayList<>();
List<String> names = findDataFormatNames();
for (String name : names) {
String json = dataFormatJSonSchema(name);
if (json != null) {
List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("dataformat", json, false);
for (Map<String, String> row : rows) {
if (row.containsKey("label")) {
String label = row.get("label");
String[] parts = label.split(",");
for (String part : parts) {
try {
if (part.equalsIgnoreCase(filter) || CatalogHelper.matchWildcard(part, filter) || part.matches(filter)) {
answer.add(name);
}
} catch (PatternSyntaxException e) {
// ignore as filter is maybe not a pattern
}
}
}
}
}
}
return answer;
}
@Override
public List<String> findLanguageNames(String filter) {
// should not cache when filter parameter can by any kind of value
List<String> answer = new ArrayList<>();
List<String> names = findLanguageNames();
for (String name : names) {
String json = languageJSonSchema(name);
if (json != null) {
List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("language", json, false);
for (Map<String, String> row : rows) {
if (row.containsKey("label")) {
String label = row.get("label");
String[] parts = label.split(",");
for (String part : parts) {
try {
if (part.equalsIgnoreCase(filter) || CatalogHelper.matchWildcard(part, filter) || part.matches(filter)) {
answer.add(name);
}
} catch (PatternSyntaxException e) {
// ignore as filter is maybe not a pattern
}
}
}
}
}
}
return answer;
}
@Override
public List<String> findOtherNames(String filter) {
// should not cache when filter parameter can by any kind of value
List<String> answer = new ArrayList<>();
List<String> names = findOtherNames();
for (String name : names) {
String json = otherJSonSchema(name);
if (json != null) {
List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("other", json, false);
for (Map<String, String> row : rows) {
if (row.containsKey("label")) {
String label = row.get("label");
String[] parts = label.split(",");
for (String part : parts) {
try {
if (part.equalsIgnoreCase(filter) || CatalogHelper.matchWildcard(part, filter) || part.matches(filter)) {
answer.add(name);
}
} catch (PatternSyntaxException e) {
// ignore as filter is maybe not a pattern
}
}
}
}
}
}
return answer;
}
@Override
public String modelJSonSchema(String name) {
String file = MODEL_DIR + "/" + name + ".json";
String answer = null;
if (caching) {
answer = (String) cache.get("model-" + file);
}
if (answer == null) {
answer = getJSonSchemaResolver().getModelJSonSchema(name);
if (caching) {
cache.put("model-" + file, answer);
}
}
return answer;
}
@Override
public String componentJSonSchema(String name) {
String file = runtimeProvider.getComponentJSonSchemaDirectory() + "/" + name + ".json";
String answer = null;
if (caching) {
answer = (String) cache.get("component-" + file);
}
if (answer == null) {
answer = getJSonSchemaResolver().getComponentJSonSchema(name);
if (caching) {
cache.put("component-" + file, answer);
}
}
return answer;
}
@Override
public String dataFormatJSonSchema(String name) {
String file = runtimeProvider.getDataFormatJSonSchemaDirectory() + "/" + name + ".json";
String answer = null;
if (caching) {
answer = (String) cache.get("dataformat-" + file);
}
if (answer == null) {
answer = getJSonSchemaResolver().getDataFormatJSonSchema(name);
if (caching) {
cache.put("dataformat-" + file, answer);
}
}
return answer;
}
@Override
public String languageJSonSchema(String name) {
// if we try to look method then its in the bean.json file
if ("method".equals(name)) {
name = "bean";
}
String file = runtimeProvider.getLanguageJSonSchemaDirectory() + "/" + name + ".json";
String answer = null;
if (caching) {
answer = (String) cache.get("language-" + file);
}
if (answer == null) {
InputStream is = versionManager.getResourceAsStream(file);
if (is != null) {
try {
answer = CatalogHelper.loadText(is);
} catch (IOException e) {
// ignore
}
}
if (caching) {
cache.put("language-" + file, answer);
}
}
return answer;
}
@Override
public String otherJSonSchema(String name) {
String file = runtimeProvider.getOtherJSonSchemaDirectory() + "/" + name + ".json";
String answer = null;
if (caching) {
answer = (String) cache.get("other-" + file);
}
if (answer == null) {
InputStream is = versionManager.getResourceAsStream(file);
if (is != null) {
try {
answer = CatalogHelper.loadText(is);
} catch (IOException e) {
// ignore
}
}
if (caching) {
cache.put("other-" + file, answer);
}
}
return answer;
}
@Override
public String componentAsciiDoc(String name) {
String answer = doComponentAsciiDoc(name);
if (answer == null) {
// maybe the name is an alternative scheme name, and then we need to find the component that
// has the name as alternative, and use the first scheme as the name to find the documentation
List<String> names = findComponentNames();
for (String alternative : names) {
String schemes = getAlternativeComponentName(alternative);
if (schemes != null && schemes.contains(name)) {
String first = schemes.split(",")[0];
return componentAsciiDoc(first);
}
}
}
return answer;
}
@Override
public String componentHtmlDoc(String name) {
String answer = doComponentHtmlDoc(name);
if (answer == null) {
// maybe the name is an alternative scheme name, and then we need to find the component that
// has the name as alternative, and use the first scheme as the name to find the documentation
List<String> names = findComponentNames();
for (String alternative : names) {
String schemes = getAlternativeComponentName(alternative);
if (schemes != null && schemes.contains(name)) {
String first = schemes.split(",")[0];
return componentHtmlDoc(first);
}
}
}
return answer;
}
private String getAlternativeComponentName(String componentName) {
String json = componentJSonSchema(componentName);
if (json != null) {
List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("component", json, false);
for (Map<String, String> row : rows) {
if (row.containsKey("alternativeSchemes")) {
return row.get("alternativeSchemes");
}
}
}
return null;
}
private String doComponentAsciiDoc(String name) {
// special for mail component
if (name.equals("imap") || name.equals("imaps") || name.equals("pop3") || name.equals("pop3s") || name.equals("smtp") || name.equals("smtps")) {
name = "mail";
}
String file = DOC_DIR + "/" + name + "-component.adoc";
String answer = null;
if (caching) {
answer = (String) cache.get("component-" + file);
}
if (answer == null) {
InputStream is = versionManager.getResourceAsStream(file);
if (is != null) {
try {
answer = CatalogHelper.loadText(is);
} catch (IOException e) {
// ignore
}
} else {
// its maybe a third party so try load it
String className = extraComponents.get(name);
if (className != null) {
String packageName = className.substring(0, className.lastIndexOf('.'));
packageName = packageName.replace('.', '/');
String path = packageName + "/" + name + "-component.adoc";
is = versionManager.getResourceAsStream(path);
if (is != null) {
try {
answer = CatalogHelper.loadText(is);
} catch (IOException e) {
// ignore
}
}
}
}
if (caching) {
cache.put("component-" + file, answer);
}
}
return answer;
}
private String doComponentHtmlDoc(String name) {
// special for mail component
if (name.equals("imap") || name.equals("imaps") || name.equals("pop3") || name.equals("pop3s") || name.equals("smtp") || name.equals("smtps")) {
name = "mail";
}
String file = DOC_DIR + "/" + name + "-component.html";
String answer = null;
if (caching) {
answer = (String) cache.get("component-" + file);
}
if (answer == null) {
InputStream is = versionManager.getResourceAsStream(file);
if (is != null) {
try {
answer = CatalogHelper.loadText(is);
} catch (IOException e) {
// ignore
}
} else {
// its maybe a third party so try load it
String className = extraComponents.get(name);
if (className != null) {
String packageName = className.substring(0, className.lastIndexOf('.'));
packageName = packageName.replace('.', '/');
String path = packageName + "/" + name + "-component.html";
is = versionManager.getResourceAsStream(path);
if (is != null) {
try {
answer = CatalogHelper.loadText(is);
} catch (IOException e) {
// ignore
}
}
}
}
if (caching) {
cache.put("component-" + file, answer);
}
}
return answer;
}
@Override
public String dataFormatAsciiDoc(String name) {
// special for some name data formats
if (name.startsWith("bindy")) {
name = "bindy";
} else if (name.startsWith("univocity")) {
name = "univocity";
}
String file = DOC_DIR + "/" + name + "-dataformat.adoc";
String answer = null;
if (caching) {
answer = (String) cache.get("dataformat-" + file);
}
if (answer == null) {
InputStream is = versionManager.getResourceAsStream(file);
if (is != null) {
try {
answer = CatalogHelper.loadText(is);
} catch (IOException e) {
// ignore
}
} else {
// its maybe a third party so try load it
String className = extraDataFormats.get(name);
if (className != null) {
String packageName = className.substring(0, className.lastIndexOf('.'));
packageName = packageName.replace('.', '/');
String path = packageName + "/" + name + "-dataformat.adoc";
is = versionManager.getResourceAsStream(path);
if (is != null) {
try {
answer = CatalogHelper.loadText(is);
} catch (IOException e) {
// ignore
}
}
}
}
if (caching) {
cache.put("dataformat-" + file, answer);
}
}
return answer;
}
@Override
public String dataFormatHtmlDoc(String name) {
// special for some name data formats
if (name.startsWith("bindy")) {
name = "bindy";
} else if (name.startsWith("univocity")) {
name = "univocity";
}
String file = DOC_DIR + "/" + name + "-dataformat.html";
String answer = null;
if (caching) {
answer = (String) cache.get("dataformat-" + file);
}
if (answer == null) {
InputStream is = versionManager.getResourceAsStream(file);
if (is != null) {
try {
answer = CatalogHelper.loadText(is);
} catch (IOException e) {
// ignore
}
} else {
// its maybe a third party so try load it
String className = extraDataFormats.get(name);
if (className != null) {
String packageName = className.substring(0, className.lastIndexOf('.'));
packageName = packageName.replace('.', '/');
String path = packageName + "/" + name + "-dataformat.html";
is = versionManager.getResourceAsStream(path);
if (is != null) {
try {
answer = CatalogHelper.loadText(is);
} catch (IOException e) {
// ignore
}
}
}
}
if (caching) {
cache.put("dataformat-" + file, answer);
}
}
return answer;
}
@Override
public String languageAsciiDoc(String name) {
// if we try to look method then its in the bean.adoc file
if ("method".equals(name)) {
name = "bean";
}
String file = DOC_DIR + "/" + name + "-language.adoc";
String answer = null;
if (caching) {
answer = (String) cache.get("language-" + file);
}
if (answer == null) {
InputStream is = versionManager.getResourceAsStream(file);
if (is != null) {
try {
answer = CatalogHelper.loadText(is);
} catch (IOException e) {
// ignore
}
}
if (caching) {
cache.put("language-" + file, answer);
}
}
return answer;
}
@Override
public String languageHtmlDoc(String name) {
// if we try to look method then its in the bean.html file
if ("method".equals(name)) {
name = "bean";
}
String file = DOC_DIR + "/" + name + "-language.html";
String answer = null;
if (caching) {
answer = (String) cache.get("language-" + file);
}
if (answer == null) {
InputStream is = versionManager.getResourceAsStream(file);
if (is != null) {
try {
answer = CatalogHelper.loadText(is);
} catch (IOException e) {
// ignore
}
}
if (caching) {
cache.put("language-" + file, answer);
}
}
return answer;
}
@Override
public String otherAsciiDoc(String name) {
String file = DOC_DIR + "/" + name + ".adoc";
String answer = null;
if (caching) {
answer = (String) cache.get("other-" + file);
}
if (answer == null) {
InputStream is = versionManager.getResourceAsStream(file);
if (is != null) {
try {
answer = CatalogHelper.loadText(is);
} catch (IOException e) {
// ignore
}
}
if (caching) {
cache.put("other-" + file, answer);
}
}
return answer;
}
@Override
public String otherHtmlDoc(String name) {
String file = DOC_DIR + "/" + name + "-other.html";
String answer = null;
if (caching) {
answer = (String) cache.get("language-" + file);
}
if (answer == null) {
InputStream is = versionManager.getResourceAsStream(file);
if (is != null) {
try {
answer = CatalogHelper.loadText(is);
} catch (IOException e) {
// ignore
}
}
if (caching) {
cache.put("language-" + file, answer);
}
}
return answer;
}
@Override
@SuppressWarnings("unchecked")
public Set<String> findModelLabels() {
SortedSet<String> answer = null;
if (caching) {
answer = (TreeSet<String>) cache.get("findModelLabels");
}
if (answer == null) {
answer = new TreeSet<>();
List<String> names = findModelNames();
for (String name : names) {
String json = modelJSonSchema(name);
if (json != null) {
List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("model", json, false);
for (Map<String, String> row : rows) {
if (row.containsKey("label")) {
String label = row.get("label");
String[] parts = label.split(",");
for (String part : parts) {
answer.add(part);
}
}
}
}
}
if (caching) {
cache.put("findModelLabels", answer);
}
}
return answer;
}
@Override
@SuppressWarnings("unchecked")
public Set<String> findComponentLabels() {
SortedSet<String> answer = null;
if (caching) {
answer = (TreeSet<String>) cache.get("findComponentLabels");
}
if (answer == null) {
answer = new TreeSet<>();
List<String> names = findComponentNames();
for (String name : names) {
String json = componentJSonSchema(name);
if (json != null) {
List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("component", json, false);
for (Map<String, String> row : rows) {
if (row.containsKey("label")) {
String label = row.get("label");
String[] parts = label.split(",");
for (String part : parts) {
answer.add(part);
}
}
}
}
}
if (caching) {
cache.put("findComponentLabels", answer);
}
}
return answer;
}
@Override
@SuppressWarnings("unchecked")
public Set<String> findDataFormatLabels() {
SortedSet<String> answer = null;
if (caching) {
answer = (TreeSet<String>) cache.get("findDataFormatLabels");
}
if (answer == null) {
answer = new TreeSet<>();
List<String> names = findDataFormatNames();
for (String name : names) {
String json = dataFormatJSonSchema(name);
if (json != null) {
List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("dataformat", json, false);
for (Map<String, String> row : rows) {
if (row.containsKey("label")) {
String label = row.get("label");
String[] parts = label.split(",");
for (String part : parts) {
answer.add(part);
}
}
}
}
}
if (caching) {
cache.put("findDataFormatLabels", answer);
}
}
return answer;
}
@Override
@SuppressWarnings("unchecked")
public Set<String> findLanguageLabels() {
SortedSet<String> answer = null;
if (caching) {
answer = (TreeSet<String>) cache.get("findLanguageLabels");
}
if (answer == null) {
answer = new TreeSet<>();
List<String> names = findLanguageNames();
for (String name : names) {
String json = languageJSonSchema(name);
if (json != null) {
List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("language", json, false);
for (Map<String, String> row : rows) {
if (row.containsKey("label")) {
String label = row.get("label");
String[] parts = label.split(",");
for (String part : parts) {
answer.add(part);
}
}
}
}
}
if (caching) {
cache.put("findLanguageLabels", answer);
}
}
return answer;
}
@Override
@SuppressWarnings("unchecked")
public Set<String> findOtherLabels() {
SortedSet<String> answer = null;
if (caching) {
answer = (TreeSet<String>) cache.get("findOtherLabels");
}
if (answer == null) {
answer = new TreeSet<>();
List<String> names = findOtherNames();
for (String name : names) {
String json = otherJSonSchema(name);
if (json != null) {
List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("other", json, false);
for (Map<String, String> row : rows) {
if (row.containsKey("label")) {
String label = row.get("label");
String[] parts = label.split(",");
for (String part : parts) {
answer.add(part);
}
}
}
}
}
if (caching) {
cache.put("findOtherLabels", answer);
}
}
return answer;
}
@Override
public String archetypeCatalogAsXml() {
String file = ARCHETYPES_CATALOG;
String answer = null;
if (caching) {
answer = (String) cache.get(file);
}
if (answer == null) {
InputStream is = versionManager.getResourceAsStream(file);
if (is != null) {
try {
answer = CatalogHelper.loadText(is);
} catch (IOException e) {
// ignore
}
}
if (caching) {
cache.put(file, answer);
}
}
return answer;
}
@Override
public String springSchemaAsXml() {
String file = SCHEMAS_XML + "/camel-spring.xsd";
String answer = null;
if (caching) {
answer = (String) cache.get(file);
}
if (answer == null) {
InputStream is = versionManager.getResourceAsStream(file);
if (is != null) {
try {
answer = CatalogHelper.loadText(is);
} catch (IOException e) {
// ignore
}
}
if (caching) {
cache.put(file, answer);
}
}
return answer;
}
@Override
public String blueprintSchemaAsXml() {
String file = SCHEMAS_XML + "/camel-blueprint.xsd";
String answer = null;
if (caching) {
answer = (String) cache.get(file);
}
if (answer == null) {
InputStream is = versionManager.getResourceAsStream(file);
if (is != null) {
try {
answer = CatalogHelper.loadText(is);
} catch (IOException e) {
// ignore
}
}
if (caching) {
cache.put(file, answer);
}
}
return answer;
}
/**
* Special logic for log endpoints to deal when showAll=true
*/
private Map<String, String> filterProperties(String scheme, Map<String, String> options) {
if ("log".equals(scheme)) {
String showAll = options.get("showAll");
if ("true".equals(showAll)) {
Map<String, String> filtered = new LinkedHashMap<>();
// remove all the other showXXX options when showAll=true
for (Map.Entry<String, String> entry : options.entrySet()) {
String key = entry.getKey();
boolean skip = key.startsWith("show") && !key.equals("showAll");
if (!skip) {
filtered.put(key, entry.getValue());
}
}
return filtered;
}
}
// use as-is
return options;
}
@Override
public String listComponentsAsJson() {
String answer = null;
if (caching) {
answer = (String) cache.get("listComponentsAsJson");
}
if (answer == null) {
StringBuilder sb = new StringBuilder();
sb.append("[");
List<String> names = findComponentNames();
for (int i = 0; i < names.size(); i++) {
String scheme = names.get(i);
String json = componentJSonSchema(scheme);
// skip first line
json = CatalogHelper.between(json, "\"component\": {", "\"componentProperties\": {");
json = json != null ? json.trim() : "";
// skip last comma if not the last
if (i == names.size() - 1) {
json = json.substring(0, json.length() - 1);
}
sb.append("\n");
sb.append(" {\n");
sb.append(" ");
sb.append(json);
}
sb.append("\n]");
answer = sb.toString();
if (caching) {
cache.put("listComponentsAsJson", answer);
}
}
return answer;
}
@Override
public String listDataFormatsAsJson() {
String answer = null;
if (caching) {
answer = (String) cache.get("listDataFormatsAsJson");
}
if (answer == null) {
StringBuilder sb = new StringBuilder();
sb.append("[");
List<String> names = findDataFormatNames();
for (int i = 0; i < names.size(); i++) {
String scheme = names.get(i);
String json = dataFormatJSonSchema(scheme);
// skip first line
json = CatalogHelper.between(json, "\"dataformat\": {", "\"properties\": {");
json = json != null ? json.trim() : "";
// skip last comma if not the last
if (i == names.size() - 1) {
json = json.substring(0, json.length() - 1);
}
sb.append("\n");
sb.append(" {\n");
sb.append(" ");
sb.append(json);
}
sb.append("\n]");
answer = sb.toString();
if (caching) {
cache.put("listDataFormatsAsJson", answer);
}
}
return answer;
}
@Override
public String listLanguagesAsJson() {
String answer = null;
if (caching) {
answer = (String) cache.get("listLanguagesAsJson");
}
if (answer == null) {
StringBuilder sb = new StringBuilder();
sb.append("[");
List<String> names = findLanguageNames();
for (int i = 0; i < names.size(); i++) {
String scheme = names.get(i);
String json = languageJSonSchema(scheme);
// skip first line
json = CatalogHelper.between(json, "\"language\": {", "\"properties\": {");
json = json != null ? json.trim() : "";
// skip last comma if not the last
if (i == names.size() - 1) {
json = json.substring(0, json.length() - 1);
}
sb.append("\n");
sb.append(" {\n");
sb.append(" ");
sb.append(json);
}
sb.append("\n]");
answer = sb.toString();
if (caching) {
cache.put("listLanguagesAsJson", answer);
}
}
return answer;
}
@Override
public String listModelsAsJson() {
String answer = null;
if (caching) {
answer = (String) cache.get("listModelsAsJson");
}
if (answer == null) {
StringBuilder sb = new StringBuilder();
sb.append("[");
List<String> names = findModelNames();
for (int i = 0; i < names.size(); i++) {
String scheme = names.get(i);
String json = modelJSonSchema(scheme);
// skip first line
json = CatalogHelper.between(json, "\"model\": {", "\"properties\": {");
json = json != null ? json.trim() : "";
// skip last comma if not the last
if (i == names.size() - 1) {
json = json.substring(0, json.length() - 1);
}
sb.append("\n");
sb.append(" {\n");
sb.append(" ");
sb.append(json);
}
sb.append("\n]");
answer = sb.toString();
if (caching) {
cache.put("listModelsAsJson", answer);
}
}
return answer;
}
@Override
public String listOthersAsJson() {
String answer = null;
if (caching) {
answer = (String) cache.get("listOthersAsJson");
}
if (answer == null) {
StringBuilder sb = new StringBuilder();
sb.append("[");
List<String> names = findOtherNames();
for (int i = 0; i < names.size(); i++) {
String scheme = names.get(i);
String json = otherJSonSchema(scheme);
// skip first line
json = CatalogHelper.between(json, "\"other\": {", " }");
json = json != null ? json.trim() : "";
json = json + "\n },";
// skip last comma if not the last
if (i == names.size() - 1) {
json = json.substring(0, json.length() - 1);
}
sb.append("\n");
sb.append(" {\n");
sb.append(" ");
sb.append(json);
}
sb.append("\n]");
answer = sb.toString();
if (caching) {
cache.put("listOthersAsJson", answer);
}
}
return answer;
}
@Override
public String summaryAsJson() {
String answer = null;
if (caching) {
answer = (String) cache.get("summaryAsJson");
}
if (answer == null) {
int archetypes = 0;
try {
String xml = archetypeCatalogAsXml();
Document dom = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new ByteArrayInputStream(xml.getBytes()));
Object val = XPathFactory.newInstance().newXPath().evaluate("count(/archetype-catalog/archetypes/archetype)", dom, XPathConstants.NUMBER);
double num = (double) val;
archetypes = (int) num;
} catch (Exception e) {
// ignore
}
StringBuilder sb = new StringBuilder();
sb.append("{\n");
sb.append(" \"version\": \"").append(getCatalogVersion()).append("\",\n");
sb.append(" \"eips\": ").append(findModelNames().size()).append(",\n");
sb.append(" \"components\": ").append(findComponentNames().size()).append(",\n");
sb.append(" \"dataformats\": ").append(findDataFormatNames().size()).append(",\n");
sb.append(" \"languages\": ").append(findLanguageNames().size()).append(",\n");
sb.append(" \"archetypes\": ").append(archetypes).append("\n");
sb.append("}");
answer = sb.toString();
if (caching) {
cache.put("summaryAsJson", answer);
}
}
return answer;
}
// CHECKSTYLE:ON
}