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;
     }
 
 }