You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by lb...@apache.org on 2024/03/18 19:52:26 UTC
(camel) branch main updated: catalog: make catalog more type safe
This is an automated email from the ASF dual-hosted git repository.
lburgazzoli pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push:
new fdf997b5938 catalog: make catalog more type safe
fdf997b5938 is described below
commit fdf997b5938b76b5b4bd893f9bd76ae7d8c42773
Author: Luca Burgazzoli <lb...@gmail.com>
AuthorDate: Mon Mar 18 13:48:16 2024 +0100
catalog: make catalog more type safe
---
.../apache/camel/catalog/DefaultCamelCatalog.java | 75 +++-----------
.../catalog/impl/AbstractCachingCamelCatalog.java | 110 +++++++++++++++++++++
.../camel/catalog/impl/AbstractCamelCatalog.java | 1 -
.../catalog/impl/DefaultRuntimeCamelCatalog.java | 50 ++--------
.../org/apache/camel/tooling/model/BaseModel.java | 2 +-
.../apache/camel/tooling/model/ComponentModel.java | 4 +-
.../camel/tooling/model/DataFormatModel.java | 4 +-
.../camel/tooling/model/DevConsoleModel.java | 4 +-
.../org/apache/camel/tooling/model/EipModel.java | 4 +-
.../java/org/apache/camel/tooling/model/Kind.java | 28 +++++-
.../apache/camel/tooling/model/LanguageModel.java | 4 +-
.../org/apache/camel/tooling/model/OtherModel.java | 4 +-
.../camel/tooling/model/TransformerModel.java | 4 +-
13 files changed, 177 insertions(+), 117 deletions(-)
diff --git a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java
index 0d4e0b1a4a4..58fe3b1dbde 100644
--- a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java
+++ b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java
@@ -33,7 +33,7 @@ import java.util.function.Supplier;
import java.util.regex.PatternSyntaxException;
import java.util.stream.Stream;
-import org.apache.camel.catalog.impl.AbstractCamelCatalog;
+import org.apache.camel.catalog.impl.AbstractCachingCamelCatalog;
import org.apache.camel.catalog.impl.CatalogHelper;
import org.apache.camel.tooling.model.ArtifactModel;
import org.apache.camel.tooling.model.BaseModel;
@@ -56,7 +56,7 @@ import org.apache.camel.util.json.Jsoner;
/**
* Default {@link CamelCatalog}.
*/
-public class DefaultCamelCatalog extends AbstractCamelCatalog implements CamelCatalog {
+public class DefaultCamelCatalog extends AbstractCachingCamelCatalog implements CamelCatalog {
private static final String MODELS_CATALOG = "org/apache/camel/catalog/models.properties";
private static final String SCHEMAS_XML = "org/apache/camel/catalog/schemas";
@@ -99,10 +99,6 @@ public class DefaultCamelCatalog extends AbstractCamelCatalog implements CamelCa
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);
@@ -119,7 +115,8 @@ public class DefaultCamelCatalog extends AbstractCamelCatalog implements CamelCa
* @param caching whether to use cache
*/
public DefaultCamelCatalog(boolean caching) {
- this.caching = caching;
+ super(caching);
+
setJSonSchemaResolver(new CamelCatalogJSonSchemaResolver(
this, extraComponents, extraComponentsJSonSchema, extraDataFormats, extraDataFormatsJSonSchema));
}
@@ -136,17 +133,17 @@ public class DefaultCamelCatalog extends AbstractCamelCatalog implements CamelCa
this.runtimeProvider.setCamelCatalog(this);
// invalidate the cache
- cache.clear();
+ super.clearCache();
}
@Override
public void enableCache() {
- caching = true;
+ super.setCaching(true);
}
@Override
public boolean isCaching() {
- return caching;
+ return super.isCaching();
}
@Override
@@ -163,11 +160,11 @@ public class DefaultCamelCatalog extends AbstractCamelCatalog implements CamelCa
public void addComponent(String name, String className) {
extraComponents.put(name, className);
// invalidate the cache
- cache.remove(FIND_COMPONENT_NAMES);
- cache.remove(FIND_COMPONENT_LABELS);
- cache.remove(LIST_COMPONENTS_AS_JSON);
+ getCache().remove(FIND_COMPONENT_NAMES);
+ getCache().remove(FIND_COMPONENT_LABELS);
+ getCache().remove(LIST_COMPONENTS_AS_JSON);
- cache.remove(SUMMARY_AS_JSON);
+ getCache().remove(SUMMARY_AS_JSON);
}
@Override
@@ -182,11 +179,11 @@ public class DefaultCamelCatalog extends AbstractCamelCatalog implements CamelCa
public void addDataFormat(String name, String className) {
extraDataFormats.put(name, className);
// invalidate the cache
- cache.remove(FIND_DATA_FORMAT_NAMES);
- cache.remove(FIND_DATA_FORMAT_LABELS);
- cache.remove(LIST_DATA_FORMATS_AS_JSON);
+ getCache().remove(FIND_DATA_FORMAT_NAMES);
+ getCache().remove(FIND_DATA_FORMAT_LABELS);
+ getCache().remove(LIST_DATA_FORMATS_AS_JSON);
- cache.remove(SUMMARY_AS_JSON);
+ getCache().remove(SUMMARY_AS_JSON);
}
@Override
@@ -208,7 +205,7 @@ public class DefaultCamelCatalog extends AbstractCamelCatalog implements CamelCa
return true;
} else if (versionManager.loadVersion(version)) {
// invalidate existing cache if we loaded a new version
- cache.clear();
+ super.clearCache();
return true;
}
return false;
@@ -640,46 +637,6 @@ public class DefaultCamelCatalog extends AbstractCamelCatalog implements CamelCa
&& (version == null || version.isBlank() || version.equals(am.getVersion()));
}
- @SuppressWarnings("unchecked")
- private <T> T cache(String name, Supplier<T> loader) {
- if (caching) {
- T t = (T) cache.get(name);
- if (t == null) {
- t = loader.get();
- if (t != null) {
- cache.put(name, t);
- }
- }
- return t;
- } else {
- return loader.get();
- }
- }
-
- private <T> T cache(String key, String name, Function<String, T> loader) {
- return doGetCache(key, name, loader);
- }
-
- @SuppressWarnings("unchecked")
- private <T> T doGetCache(String key, String name, Function<String, T> loader) {
- if (caching) {
- T t = (T) cache.get(key);
- if (t == null) {
- t = loader.apply(name);
- if (t != null) {
- cache.put(key, t);
- }
- }
- return t;
- } else {
- return loader.apply(name);
- }
- }
-
- private <T> T cache(String name, Function<String, T> loader) {
- return doGetCache(name, name, loader);
- }
-
private String loadResource(String file) {
try (InputStream is = versionManager.getResourceAsStream(file)) {
return is != null ? CatalogHelper.loadText(is) : null;
diff --git a/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/AbstractCachingCamelCatalog.java b/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/AbstractCachingCamelCatalog.java
new file mode 100644
index 00000000000..de788819f92
--- /dev/null
+++ b/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/AbstractCachingCamelCatalog.java
@@ -0,0 +1,110 @@
+/*
+ * 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.impl;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Function;
+import java.util.function.Supplier;
+
+@SuppressWarnings("unused")
+public abstract class AbstractCachingCamelCatalog extends AbstractCamelCatalog {
+ private final Map<String, Object> cache = new ConcurrentHashMap<>();
+ private boolean caching;
+
+ /**
+ * Creates the {@link AbstractCachingCamelCatalog} without caching enabled.
+ */
+ protected AbstractCachingCamelCatalog() {
+ this(false);
+ }
+
+ /**
+ * Creates the {@link AbstractCachingCamelCatalog}
+ *
+ * @param caching whether to use cache
+ */
+ protected AbstractCachingCamelCatalog(boolean caching) {
+ this.caching = caching;
+ }
+
+ /**
+ * To turn caching on or off
+ */
+ public boolean isCaching() {
+ return caching;
+ }
+
+ /**
+ * To turn caching on or off
+ */
+ public void setCaching(boolean caching) {
+ this.caching = caching;
+
+ if (!this.caching) {
+ clearCache();
+ }
+ }
+
+ protected Map<String, Object> getCache() {
+ return this.cache;
+ }
+
+ protected void clearCache() {
+ cache.clear();
+ }
+
+ protected <T> T cache(String key, String name, Function<String, T> loader) {
+ return doGetCache(key, name, loader);
+ }
+
+ protected <T> T cache(String name, Function<String, T> loader) {
+ return doGetCache(name, name, loader);
+ }
+
+ @SuppressWarnings("unchecked")
+ protected <T> T cache(String name, Supplier<T> loader) {
+ if (caching) {
+ T t = (T) cache.get(name);
+ if (t == null) {
+ t = loader.get();
+ if (t != null) {
+ cache.put(name, t);
+ }
+ }
+ return t;
+ } else {
+ return loader.get();
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ protected <T> T doGetCache(String key, String name, Function<String, T> loader) {
+ if (caching) {
+ T t = (T) cache.get(key);
+ if (t == null) {
+ t = loader.apply(name);
+ if (t != null) {
+ cache.put(key, t);
+ }
+ }
+ return t;
+ } else {
+ return loader.apply(name);
+ }
+ }
+}
diff --git a/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/AbstractCamelCatalog.java b/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/AbstractCamelCatalog.java
index 534ea288a17..6975cd34da0 100644
--- a/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/AbstractCamelCatalog.java
+++ b/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/AbstractCamelCatalog.java
@@ -63,7 +63,6 @@ import org.apache.camel.util.URISupport;
/**
* Base class for both the runtime RuntimeCamelCatalog from camel-core and the complete CamelCatalog from camel-catalog.
*/
-@SuppressWarnings("unused")
public abstract class AbstractCamelCatalog {
private static final Pattern SYNTAX_PATTERN = Pattern.compile("([\\w.]+)");
diff --git a/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/DefaultRuntimeCamelCatalog.java b/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/DefaultRuntimeCamelCatalog.java
index 0523b0d46fc..4bc751cf5a0 100644
--- a/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/DefaultRuntimeCamelCatalog.java
+++ b/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/DefaultRuntimeCamelCatalog.java
@@ -16,10 +16,6 @@
*/
package org.apache.camel.catalog.impl;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.function.Function;
-
import org.apache.camel.CamelContext;
import org.apache.camel.catalog.RuntimeCamelCatalog;
import org.apache.camel.spi.annotations.JdkService;
@@ -35,12 +31,17 @@ import org.apache.camel.tooling.model.TransformerModel;
* Default {@link RuntimeCamelCatalog}.
*/
@JdkService(RuntimeCamelCatalog.FACTORY)
-public class DefaultRuntimeCamelCatalog extends AbstractCamelCatalog implements RuntimeCamelCatalog {
+public class DefaultRuntimeCamelCatalog extends AbstractCachingCamelCatalog implements RuntimeCamelCatalog {
private CamelContext camelContext;
- // cache of operation -> result
- private final Map<String, Object> cache = new HashMap<>();
- private boolean caching = true;
+
+ public DefaultRuntimeCamelCatalog() {
+ this(true);
+ }
+
+ public DefaultRuntimeCamelCatalog(boolean caching) {
+ super(caching);
+ }
@Override
public CamelContext getCamelContext() {
@@ -53,20 +54,6 @@ public class DefaultRuntimeCamelCatalog extends AbstractCamelCatalog implements
this.setJSonSchemaResolver(new CamelContextJSonSchemaResolver(camelContext));
}
- /**
- * To turn caching on or off
- */
- public boolean isCaching() {
- return caching;
- }
-
- /**
- * To turn caching on or off
- */
- public void setCaching(boolean caching) {
- this.caching = caching;
- }
-
@Override
public void start() {
// noop
@@ -74,7 +61,7 @@ public class DefaultRuntimeCamelCatalog extends AbstractCamelCatalog implements
@Override
public void stop() {
- cache.clear();
+ super.clearCache();
}
@Override
@@ -146,21 +133,4 @@ public class DefaultRuntimeCamelCatalog extends AbstractCamelCatalog implements
public MainModel mainModel() {
return cache("main-model", "main-model", k -> super.mainModel());
}
-
- @SuppressWarnings("unchecked")
- private <T> T cache(String key, String name, Function<String, T> loader) {
- if (caching) {
- T t = (T) cache.get(key);
- if (t == null) {
- t = loader.apply(name);
- if (t != null) {
- cache.put(key, t);
- }
- }
- return t;
- } else {
- return loader.apply(name);
- }
- }
-
}
diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/BaseModel.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/BaseModel.java
index b50c195d035..8c7db5b36b8 100644
--- a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/BaseModel.java
+++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/BaseModel.java
@@ -42,7 +42,7 @@ public abstract class BaseModel<O extends BaseOptionModel> {
return (m1, m2) -> m1.getTitle().compareToIgnoreCase(m2.getTitle());
}
- public abstract String getKind();
+ public abstract Kind getKind();
public String getName() {
return name;
diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/ComponentModel.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/ComponentModel.java
index 7439f06eebd..423d9c91375 100644
--- a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/ComponentModel.java
+++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/ComponentModel.java
@@ -46,8 +46,8 @@ public class ComponentModel extends ArtifactModel<ComponentModel.ComponentOption
}
@Override
- public String getKind() {
- return "component";
+ public Kind getKind() {
+ return Kind.component;
}
public String getScheme() {
diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/DataFormatModel.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/DataFormatModel.java
index 54446369c31..9099d18492d 100644
--- a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/DataFormatModel.java
+++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/DataFormatModel.java
@@ -29,8 +29,8 @@ public class DataFormatModel extends ArtifactModel<DataFormatModel.DataFormatOpt
}
@Override
- public String getKind() {
- return "dataformat";
+ public Kind getKind() {
+ return Kind.dataformat;
}
public String getModelName() {
diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/DevConsoleModel.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/DevConsoleModel.java
index 214b958a40d..adc9652f6f9 100644
--- a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/DevConsoleModel.java
+++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/DevConsoleModel.java
@@ -32,8 +32,8 @@ public class DevConsoleModel extends ArtifactModel<BaseOptionModel> {
}
@Override
- public String getKind() {
- return "console";
+ public Kind getKind() {
+ return Kind.console;
}
}
diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/EipModel.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/EipModel.java
index 88b8676ec08..1999bda2cbb 100644
--- a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/EipModel.java
+++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/EipModel.java
@@ -30,8 +30,8 @@ public class EipModel extends BaseModel<EipModel.EipOptionModel> {
}
@Override
- public String getKind() {
- return "model";
+ public Kind getKind() {
+ return Kind.model;
}
public boolean isAbstractModel() {
diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/Kind.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/Kind.java
index 371c1060310..f18e9d0df8c 100644
--- a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/Kind.java
+++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/Kind.java
@@ -16,15 +16,39 @@
*/
package org.apache.camel.tooling.model;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.io.Writer;
+
+import org.apache.camel.util.json.Jsonable;
+import org.apache.camel.util.json.Jsoner;
+
/**
* Kind of a Camel part, such as component, dataformat, language, etc.
*/
-public enum Kind {
+public enum Kind implements Jsonable {
component,
dataformat,
language,
transformer,
console,
other,
- eip
+ eip,
+ model;
+
+ @Override
+ public String toJson() {
+ final StringWriter writable = new StringWriter();
+ try {
+ this.toJson(writable);
+ } catch (final IOException caught) {
+ /* See java.io.StringWriter. */
+ }
+ return writable.toString();
+ }
+
+ @Override
+ public void toJson(final Writer writable) throws IOException {
+ writable.write(Jsoner.serialize(name()));
+ }
}
diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/LanguageModel.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/LanguageModel.java
index 1136a230380..f4bb4ddb395 100644
--- a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/LanguageModel.java
+++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/LanguageModel.java
@@ -29,8 +29,8 @@ public class LanguageModel extends ArtifactModel<LanguageModel.LanguageOptionMod
}
@Override
- public String getKind() {
- return "language";
+ public Kind getKind() {
+ return Kind.language;
}
public String getModelName() {
diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/OtherModel.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/OtherModel.java
index 5383f932f7c..6d07302ae2a 100644
--- a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/OtherModel.java
+++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/OtherModel.java
@@ -22,8 +22,8 @@ public class OtherModel extends ArtifactModel<BaseOptionModel> {
}
@Override
- public String getKind() {
- return "other";
+ public Kind getKind() {
+ return Kind.other;
}
}
diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/TransformerModel.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/TransformerModel.java
index 3e6db9254ca..4f26a694241 100644
--- a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/TransformerModel.java
+++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/TransformerModel.java
@@ -41,8 +41,8 @@ public class TransformerModel extends ArtifactModel<BaseOptionModel> {
}
@Override
- public String getKind() {
- return "transformer";
+ public Kind getKind() {
+ return Kind.transformer;
}
}